# 老司机 iOS 周报 #148 | 2020-02-08

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/ios-weekly.png?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 通知

[@Parsifal](https://github.com/ParsifalC)：这是春节前最后一期周报了，给大家拜个早年，我们节后再见！

## 文章

### 🌟 🐕 [今日头条 iOS 安装包大小优化 - 新阶段、新实践](https://mp.weixin.qq.com/s/oyqAa8wKdioI5ZDG5LjkfA)

[@Damien](https://github.com/ZengyiMa)： 随着业务的发展，App 包大小也会水涨船高，为了更好的用户体验，减少用户等待时间，如何减少包大小是 App 各项优化指标中重要的一环。经过三年的发展，今日头条平台架构为我们带来更多的优化包大小手段：

- 使用合适的资源压缩配置
- 使用 RGB with palette 压缩图片
- Assets.car 合并
- 文本文件压缩
- 使用 -Oz 编译参数
- 使用链接时优化 LTO
- 修正 Exported Symbols 配置
- 属性动态化
- __TEXT 段迁移
- 二进制段压缩

并且每项优化的收益也做了详尽的统计和分析。我们做 App 优化，需要静下心来做技术攻坚而且还需要具有数据意识，用数据来说话！

### 🌟 🐕 [图解 fishhook 原理](https://mp.weixin.qq.com/s/dcQrR4knN0aGDPy2hsrgmg)

[@老驴](https://www.weibo.com/6090610445)：这是一篇目前非常不错的详解 fishhook 的文章，通过图文配合的方式来详细解释 fishhook 的原理。本文讲述 fishhook 所涉及到的最小知识点，完全抛开源码，旨在简单清晰，直击要害。以图代码，带你彻底弄清 fishhook 的原理。

### 🐕 [iOS 证书幕后原理](http://chuquan.me/2020/03/22/ios-certificate-principle/)

[@AidenRao](https://weibo.com/AidenRao)：非对称加密贯穿于 iOS 开发之中，在日常的 iOS 开发中，无论是新手还是老鸟，总是会遇到各种与证书、签名有关的问题。作者理清其中的原理，研究并整理出这篇文章。方便读者结合原理，更快的找到证书、签名有关问题的解决方案。

### 🐕 [听说你想写个虚拟机（二）？](https://mp.weixin.qq.com/s/m-gimtsk-cYQz-kQS-W26w)

[@Leo](https://github.com/leomobiledeveloper)：虚拟机的概念大家或多或少都听说过，但你是否想过如何实现一个虚拟机呢？“写个虚拟机的文章”是一个系列，这次推荐的是第二/三章节，第二章介绍了寄存器的定义、几个新指令的实现，第三章则从多个角度讲解了如何实现一个更贴近真实定义的虚拟机。第三章链接：

- [听说你想写个虚拟机（三）？](https://mp.weixin.qq.com/s/GKYEGkDmTxxBmpd4cton5g)

> 由 [silan-liu](https://github.com/silan-liu) 推荐

### 🐕 [AVPlayer 實踐本地 Cache 功能大全](https://medium.com/zrealm-ios-dev/avplayer-%E5%AF%A6%E8%B8%90%E6%9C%AC%E5%9C%B0-cache-%E5%8A%9F%E8%83%BD%E5%A4%A7%E5%85%A8-6ce488898003)

[@J_Knight_](https://github.com/knightsj)：本文结合实际代码介绍了 AVPlayer 的缓存实现方案，该缓存方案能够实现的目标是：

1. 本地缓存播放过的音乐，且在播放音乐前先尝试读取缓存
2. 可以设置缓存上限，超过后该上限后则删除最旧的缓存
3. 缓存处理不影响播放机制

而且在具体介绍方案之前也介绍了所需要的背景知识，如 HTTP Range，AVPlayer 处理 AVURLAsset 的方式等等。

### 🐕 [What’s new in Swift 5.4?](https://www.hackingwithswift.com/articles/228/whats-new-in-swift-5-4)

[@老峰](https://github.com/gesantung)： Swift 5.4，带来了一些巨大的编译改进，并大大提高了增量编译的速度，同时也包含不少新特性：

- 改进的隐式成员语法
- 函数中支持多个可变参数
- Result builders
- 局部函数支持重载
- Property wrappers 支持局部变量

Swift 5.4 已经在 Xcode 12.5 beta 版中发布，感兴趣的读者快来升级体验吧。

### 🐢 [Aion - 拥抱 Flutter 生态的动态化方案](https://mp.weixin.qq.com/s/mPkx9b07xCkokxxbGc7grA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 又一个 Flutter 动态化方案，目前业内对于 Flutter 动态化的探索可谓百花齐放了，大体上都是以下两种：

-  Web 跟 Flutter 的一个结合，就是前面说的利用 Web 生态 js 的高动态性跟 Flutter 本身的渲染流程去做结合，达到一个既能够满足高动态性
- Simple VM，用 Dart 代码实现 Widget 视图界面，经过前端的编译生成 AST 产物，然后在编译阶段将 AST 产物转化成 JSON 的数据描述，JSON 文件下发到客户端，在 Dart 层对它做一次解析，来完成动态化

以上两种方案在对比原生 AOT 时，多多少少差了那么一点儿，UC 的同学对他们 Flutter 动态化的要求是：无限于接近于现有的 AOT 模式。所以有了这个新的方案：基于 Kernel ByteCode 解析。本文详细的分析和对比了多种方案的优缺点，来表明为何选择 KBC，文章也详细描述了该技术方案落地的过程中遇到的问题以及是如何解决的。

## 工具

### [tidevice](https://github.com/alibaba/taobao-iphone-device)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：这是一个支持运行在 Mac，Linux，Windows 上，能够用于与 iOS 设备进行通信，提供诸多功能的一个工具，包括：
- 截图
- 获取手机信息
- ipa 包的安装和卸载
- 根据 bundleID 启动和停止应用
- 列出安装应用信息
- 模拟Xcode运行XCTest
- 获取指定应用性能(CPU,MEM,FPS)
- ...

## 代码

### [Pulse: Structured Logging System](https://github.com/kean/Pulse)

[@zvving](https://github.com/zvving)：基于 [SwiftLog](https://github.com/apple/swift-log) 和 CoreData 实现的日志框架，使用 SwiftUI 为 iOS/macOS 双平台提供日志浏览功能，同时对网络日志提供更清晰的展示视图。
库还在早期阶段，对日志及 SwiftUI 实现感兴趣的同学欢迎参考。

### [Twitter Text Editor](https://github.com/twitter/TwitterTextEditor)

[@xiaofei86](https://weibo.com/xuyafei86/)：Twitter 开源了一个独立的、灵活的、功能齐全的富文本编辑器。提供了一个健壮的文本属性更新逻辑、扩展的文本编辑事件，使用基于委托的便捷 API 安全的处理文本输入事件。

```swift
import TwitterTextEditor

final class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let textEditorView = TextEditorView()
        textEditorView.text = "Meow"
        textEditorView.textAttributesDelegate = self
    }
}

extension MyViewController: TextEditorViewTextAttributesDelegate {
    func textEditorView(_ textEditorView: TextEditorView,
                        updateAttributedString attributedString: NSAttributedString,
                        completion: @escaping (NSAttributedString?) -> Void) {
        
    }
}
```

### [awesome-function-builders](https://github.com/carson-katri/awesome-function-builders)

[@JonyFang](https://github.com/JonyFang)：Swift 5.1 引入的特性 @functionBuilder，大大增强了 Swift 语言构建内置 DSL 的能力，`awesome-function-builders` 可以作为使用参考。

## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 iTDriverr 哦~**

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（LSJCoding）会推送消息，欢迎关注。

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
