# 老司机 iOS 周报 #129 | 2020-09-21

![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) 提出。


## WWDC20

本周在周报公众号上我们推送了 2 篇 WWDC20 内参专栏内的文章，每篇都很精彩！

- [UICollectionView 进阶使用](https://mp.weixin.qq.com/s/TOlv7eUv-cF1PL3vXX0L6A)
- [探索 Swift 中的日志系统](https://mp.weixin.qq.com/s/D2T9seR6LDniND5GaVrxMg)

## 新闻

### [Swift 5.3 正式发布](https://swift.org/blog/swift-5-3-released)

[@Parsifal](https://github.com/ParsifalC)：继 3 月底发布 Swift 5.2 后，Swift 5.3 终于也官宣发布了~苹果继续围绕编码体验、Swift 运行时性能和更多平台支持进行改善和优化。小集团队也为我们翻译了官方的更新概要 - [一图读懂 Swift 5.3](https://mp.weixin.qq.com/s/2BrbN-eibfsu_g2D2EN6nw)，下载更新 Xcode 12 即可体验 Swift 5.3。

### [苹果更新 App Store 审核指南](https://developer.apple.com/news/?id=xqk627qu)

[@Parsifal](https://github.com/ParsifalC)：随着 iOS 14 的发布，以及正在路上的 macOS Big Sur，苹果对 App Store 审核指南也进行了一波更新。Apple Hub 做了中文翻译，不过建议大家还是以官方为主，译文为辅 - [苹果更新 App Store 审核指南，可以给苹果爸爸的审核条款提建议了](https://mp.weixin.qq.com/s/wRvaerDQgOdkfX9c1-Vbpg)。

## 文章

### 🌟 🐢 [系列文章：用 Swift 实现一个 Swift Runtime](https://belkadan.com/blog/2020/08/Swift-Runtime-Heap-Objects/)

[@享耳先森](https://github.com/iblacksun)：这个系列的文章来自于今年愚人节的一个项目，作者让 [Mac OS 9 支持运行 Swift 程序](https://belkadan.com/blog/2020/04/Swift-on-Mac-OS-9/)，其中 Swift Runtime 没有将 C++ 的实现迁移过来，而是使用 Swift 实现了一套，文章里就分享了具体的实现细节，包含了大量的 Swift 指针操作技巧。

通过阅读系列文章，你应该对 Swift Runtime 会有更深的理解，推荐阅读。
https://belkadan.com/blog/2020/08/Swift-Runtime-Heap-Objects/
https://belkadan.com/blog/2020/09/Swift-Runtime-Type-Layout/
https://belkadan.com/blog/2020/09/Swift-Runtime-Type-Metadata/

> 作者 Jordan Rose 之前是 Swift 团队的一员，负责 bugs.swift.org 相关的工作，在去年离职。

### 🌟 🐕 [分析可执行文件 Mach-O](https://juejin.im/post/6870034249026633742)

[@Damien](https://github.com/ZengyiMa)：本文从 Mach-O 的概念出发，深度解析了 Mach-O 的内部结构以及加载 Mach-O 的步骤，最后作者也给出了通过分析 Mach-O 之后可以应用的使用场景，对于想理解 iOS 系统底层实现原理的同学是个很好的文章。

### 🌟 🐢 [Flutter 包大小治理上的探索与实践](https://mp.weixin.qq.com/s/adC-YUWd-xuUlzeAPHzJoQ)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 作为一种全新的响应式、跨平台、高性能的移动开发框架，在性能、稳定性和多端体验一致上都有着较好的表现。引入 Flutter 带来的包体积问题，一直以来都是个热门话题，[本文](https://mp.weixin.qq.com/s/adC-YUWd-xuUlzeAPHzJoQ)详细
讲述了美团在处理 Flutter 包体积问题上的思考及相关的建设。


### 🌟 🐕 [今日头条品质优化 - 图文详情页秒开实践](https://mp.weixin.qq.com/s/Xqr6rQBbx7XPoBESEFuXJw)

[@JonyFang](https://github.com/JonyFang)：本篇总结了头条详情页（WebView）加载优化的思路和实践。内容总结如下：

- 数据建立
	- 确定优化效果的度量为：页面加载时间
	- 白屏检测方案：WebView 快照 -> 缩放 -> 非白色像素点检测
	- 确定用户刷头条时真实体验的指标：95 分位值
- 模板优化
	- 模板拆分
		- 公共样式 CSS 和逻辑 JS 抽离为独立模板，内置到客户端中
		- 客户端请求接口拿到正文数据，并通过 JS 脚本注入页面完成展示
		- 用户进入详情页加载本地模板，并行请求详情页数据并注入模板
		- 通过一定策略预加载数据并暂存
	- 模板预热
		- 全流程离线化后，进行本地模板加载优化
		- 模板合并。将 JS、CSS、图片内联到一个文件以减少加载模板时的 IO 操作
		- 模板简化。非必要样式和 JS 异步拉取
		- 在合适的时机在后台创建 WebView 并预加载模板，用户进入详情页时使用加载好模板的 WebView 并将内容数据通过 JS 注入页面，收到数据后前端渲染
	- 模板复用
		- 详情页使用同一个模板，当用户退出页面时把正文数据清空，在进入喜爱个页面时复用这个 WebView 重新注入对应正文数据
- 网络优化
	- CDN 加速
		- 详情页请求特点：流量大、数据属性基本不变、用户分布广、接口数据大
		- 将正文、标题、作者栏等主要又基本不变的内容托管到 CND
	- 容灾
		- 多域名备份。服务端下发多个 CDN 链接，某个访问异常时可以快速切换
		- 快速访问。设计了详情页请求的快速动态超时策略（因子 1.5，min = 1s，max = 4s），保证在网络或服务异常时，用户快速感知到自身网络问题。
- 渲染优化
	- 服务端预渲染
		- 详情页首屏内容在服务端就把所有正文的 HTML 数据组装好，服务端直出内容给客户端 WebView 渲染。
	- 客户端渲染
		- WebView 中非文字内容（图片、视频）通过原生组件渲染
		- Feed 页智能加载详情页需要的多图
- 白屏优化
	- 网络导致的页面白屏问题，通过前面的优化策略已解决
	- 非网络原因的白屏（WebView 占用内存过大发生的白屏），先判断是否存在数据注入，若没有进行请求重试，接着重新加载模板并注入数据。

### 🐕 [一位 iOS 开发者的进阶之旅](https://mp.weixin.qq.com/s/cKuVFRPUnnScLM3y26mgIQ)

iOS 开发早已经过了会写两个页面就可以拿到高薪的时代了，于是，出于兴趣也好，出于生计也罢，越来越多的 iOSer 该意识到，需要提高自己的技术能力了，毕竟面试也越来越难了不是。 那如何提高呢？本文其实是 v2ex 上面的一个帖子： "iOS 开发有什么国人写的比较好的书籍推荐？"。里面的内容大多来源于 `lujie2012` 以及其他人的一些回答，回答的内容已经不仅仅是推介书了，还包含了很多关于 iOS 学习上的问题。虽然里面个别回答或观点笔者并不是完全认同，但还是希望对这方面有困扰的同学有一点点帮助。

### 🐕 [闲鱼对 Flutter-Native 混合工程解耦的探索](https://mp.weixin.qq.com/s/4Z3Bqz9sUW1Lwofx--vCjA)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：闲鱼是国内第一个使用 Flutter 混合开发的大型应用，但是目前面临如下几个痛点：

- Flutter 侧混合编译速度慢，Android 首次编译 10min+，iOS 首次编译 20min+
- 混合栈编程中历史包袱导致 iOS/Android 双端返回给 Flutter 侧的数据可能存在不一致性
- 集成模块开发效率相比模块开发较低，单模块页面测试性能数据无法展开

面对这些痛点，闲鱼技术团队做了如下尝试：

- 模块化开发
- 跨进程开发

尽管两个方案都可以解决编译运行时间长的问题，但通过对比分析，方案一拆分模块和维护模块时都有很高的成本，方案二拆分成本和维护成本都相对较低，但对运行环境要求苛刻。综合来看，方案二虽然有一定缺陷，却可以解决很多问题。

### 🐕 [4. Podfile 的解析逻辑](https://mp.weixin.qq.com/s/f9YcS9eYS_RShLsTXS-SvA)

[@JonyFang](https://github.com/JonyFang)：内容主要分三部分。第一部分，简介 Podfile 配置所围绕的 Xcode 工程结构（Workspace、Project、Target 及 Build Setting）。第二部分，介绍 CocoaPods 中 CocoaPods-Core 对配置文件的解析，配置文件包括 Podfile、Podspec 及解析后的依赖锁存文件（如 Podfile.lock）。第三部分，演示在 Podfile 中对 Target 进行的嵌套使用。

文章目录结构如下：

- Xcode 工程结构
	- Target
	- Project
	- Workspace
	- Scheme
- CocoaPods-Core
	- CocoaPods-Core 的文件结构
	- Podfile 的主要数据结构
		- Specification
		- TargetDefinition
		- Podfile
		- Lockfile
	- Podfile 内容加载
		- Podfile 文件类型
		- Podfile 文件读取
		- Ruby 格式的 Podfile 加载
		- YAML 格式的 Podfile 加载
	- Podfile 内容解析
- Podfile targets 配置
	- Target 的嵌套使用
	- Abstract Target 的应用演示

### 🐎 [The State of SwiftUI](https://steipete.com/posts/state-of-swiftui/)

[@zvving](https://github.com/zvving)：SwiftUI 被寄予一统 iOS macOS iPadOS tvOS 全平台界面实现的厚望。然愿望美好，现实骨感：笔者使用 SwiftUI 过程中就碰到一系列状态同步 + Crash + 卡顿问题。

如果要上线 SwiftUI，可以从 iOS 平台 Widget 等较稳定的场景入手，而 macOS tvOS 跨平台场景问题多多，建议先谨慎观望。

## 工具

### 🐎 [GitHub CLI 1.0 is now available](https://github.blog/2020-09-17-github-cli-1-0-is-now-available/)

[@J_Knight_](https://weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)：GitHub CLI 1.0 版本已发布。使用 GitHub CLI 可以：
- 从终端运行你的整个 GitHub 工作流
- 调用 GitHub API 来编写几乎所有操作的脚本，也可以为所有命令设置一个自定义别名
- 连接 GitHub Enterprise Server 而不只是  GitHub.com

本文结合实例介绍了从 issue 到 release 工作流的使用方法，也讲解了如何使用 gh alias set 为命令创建别名；而且这些自定义的命令也可以自由组合。

## 内推

老司机周报团队联合知识小集和 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）
