# 老司机 iOS 周报 #156 | 2021-04-19

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

## 新闻

### [为 AppTrackingTransparency 做好准备](https://developer.apple.com/cn/news/?id=8h0btjq7)

[@Parsifal](https://github.com/ParsifalC)：[iOS 14.5](https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-14_5-beta-release-notes) 已经公开测试很长一段时间了，现在到了第八个 Beta 版本。根据目前各方面信息来看，iOS 14.5 很可能在 4 月份正式发布。iOS 14 开始苹果便在和开发者强调新的隐私跟踪策略管理方式，而这个措施即将随着 iOS 14.5 的发布正式实施。新的 ATT 以及 SKAdNetwork 2.0 推出，还将伴随着 [《App Store 审核指南》的准则 5.1.2 (i)](https://developer.apple.com/cn/app-store/review/guidelines/#5.1.2)，目前已经有不少 App 被这个原因拒绝，需尽早自查和更新相关第三方 SDK 进行适配。

> 另推荐一篇关于 ATT 和 SDAdNetwork 的文章：[全面解读 iOS 14 ATT 和 SKAdNetwork](http://www.woshipm.com/pd/4150041.html)

## 文章

### 🌟 🐕 [Wakeup in XNU](https://mp.weixin.qq.com/s/8OBAmyCLa6_eFYqIJgoCQw)

[@Leo](https://github.com/leomobiledeveloper)：APP 异常退出的原因有很多种，大家比较熟悉的是 Crash 和 OOM，事实上 CPU Wakeup 超过限制也会触发系统强杀。本文从内核源码出发，剖析了 Wakeup 背后的原理，也给出了一些典型的会触发这种强杀的场景。文章研究深入，逻辑清晰，推荐对功耗和稳定性感兴趣的同学阅读。

### 🌟 🐕 [哈啰出行 iOS App 首屏秒开优化](https://mp.weixin.qq.com/s/5Ez2BrsyBgQ8aHZqlYtAjg)

[@JonyFang](https://github.com/JonyFang)：产品高频迭代在快速解决业务发展的同时也带来了大量的技术债堆积，如果没有良好的规范和监控流程会使项目在稳定和体验上存在较多的隐患和挑战。正如启动阶段的启动项和业务逻辑堆积，本文介绍了哈啰出行 iOS App 首屏秒开的优化路径：

1. 数据收集：收集启动阶段、首页加载、各业务模块加载性能数据；
2. 问题分析：确认并定位分析目前各阶段加载存在或依赖的问题；
3. 优化解决：启动项问题、首页逻辑处理问题、业务模块问题解决；
4. 持续监控：持续优化 & 监控首页的加载渲染和模块性能问题 & 可视化数据；

### 🌟 🐕 [干货 | 减少 50% 空间，携程机票 React Native Bundle 分析与优化](https://mp.weixin.qq.com/s/aajdqmpCLKvGaokL4Qp1tg)

[@looping](https://github.com/looping)：本文记录了作者从 JavaScript 层面对 React Native 的业务包进行分析与优化的过程，对常用的解决方案和优化步骤进行了详细的总结，还夹带了携程内部的 CRN bundle 分析平台介绍，为高效且能持续性解决问题提供了借鉴思路，是一篇不可多得的工程技术实践好文。

### 🐕 [深度解读便利蜂 React Native 多版本共存的平滑升级实践](https://mp.weixin.qq.com/s/q296ppm6iB9cou5ZgBytrg)

[@Damien](https://github.com/ZengyiMa)：随着前端技术生态的演进，React Hook、Fast Refresh 等技术、工具不断地迭代涌现，版本升级为业务提效赋能的同时，伴随的 breaking change（重要改动）、行为变更也带来了更多的风险和成本。对于便利蜂而言，面对迭代不频繁的项目，升级的成本则远大于升级的收益。具体实现方式是通过修改包名、动态库，可以把多个版本的 React Native 放置同一个 App 中，同时为了避免代码冗余，优化包大小，精简掉了老版本大部分代码，并实现了自定义 Module、Component 的跨版本支持。在 React Native 中升级带来的破坏性问题上给了我们一个新的思路。

### 🐕 [极致首帧播放方案 - 零首帧解决方案](https://mp.weixin.qq.com/s/IGA3caeXMB-upTFiV8MuYg)

[@anotheren](https://github.com/anotheren)：视频播放，特别是短视频播放领域，对于首帧的展现，以及后续播放流畅度有着极高的要求。本文来自字节跳动团队，主要按照首帧的各个阶段分别介绍了对应的优化方案，也简单介绍了预加载和预渲染这两个优化首帧的利器，在文章最后针对长视频以及历史进度起播这两种场景，介绍了对应的优化手段。当然不同团队会面临不同的问题，如果你也需要特定的优化，不妨来找找思路。

### 🐢 [听说你想写个渲染引擎（css 解析 + 样式树）](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485069&idx=1&sn=693e48ede7d796e14620fbbeaee56beb&chksm=cf558945f822005377aab06e3d42ffbf7d79f6a818b319a953e7f44ed7d4d79b5dffb66c8019&token=911515468&lang=zh_CN#rd)

[@xiaofei86](https://github.com/xiaofei86)：讲述浏览器渲染引擎工作原理的系列文章，使用 Swift 实现引擎，代码开源，可以在 [Github](https://github.com/silan-liu/tiny-web-render-engine-swift) 查看。在往期周报中我们推荐了 [HTML 解析](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485069&idx=2&sn=986f6eb0a7bece1d4e70253c3c9b7020&chksm=cf558945f8220053a6f15f658bcc2e442ee238c5639837076a85b2ceb6f7f6d104e4fbebc464&cur_album_id=1717440219009892354&scene=189#rd)，本期作者更新了 [CSS 解析](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485200&idx=1&sn=6f5eca77d57bac8909b0c813d1c2c414&chksm=cf5588d8f82201ce7b85fa35aea9b58dc953c8d85167fa1f589e9d7fd0e7ac1c90d1e21fd565&token=1141333798&lang=zh_CN#rd) 和 [样式树](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485200&idx=2&sn=3c7bc2b702fd01c9215bad2d26786078&chksm=cf5588d8f82201ce64e1729d490d2ef31dda69c1d23656c386184e7399941b0bc28855b9588c&token=1141333798&lang=zh_CN#rd) 2 篇新内容。感兴趣的读者可以持续关注，跟随作者一起学习。 

### 🐢 [抖音 iOS 工程架构演进](https://mp.weixin.qq.com/s/HHH5_IEbsR8iSmXSIdeutw)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：从 16 年至今，抖音实现了从零到六亿的日活增长，快速的业务发展对技术支撑提出了更高的要求。本文讲述了抖音 iOS App 工程架构在不同的阶段对组件化方案的持续改进：

- 原始工程架构
 	- 单体架构 + Cocoapods：业务代码、工程配置、资源文件全部放在一个大业务仓库，由 Podfile 文件描述第三方仓库的依赖版本
 
- 分离壳工程后架构
	- 壳工程 + 业务仓 + 依赖仓：分离壳工程，工程配置、部分系统资源、工程主入口被拆分到主宿主壳工程，Podfile 拆分出版本依赖管理文件 Podfile.seer，由依赖管理平台进行各个版本的容器化管理

- 单仓多组件架构
	- 壳工程 + 单仓多组件 + 依赖仓：采用单仓多组件后，每个业务线仓库支持添加 podspec 增加组件，实现更小粒度的二进制依赖。业务线仓库内划分业务实现层、业务接口层、服务层和基础层
	
- Example 子壳工程架构
	- 壳工程 + AWELaunchKit + 单仓多组件 + 依赖仓：每个业务仓从宿主同步工程配置构建子壳工程。增加 AWELaunchKit 为子壳工程提供运行时的基础能力。通过服务层提供业务间运行时共享的服务能力，满足代码复用和更小二进制依赖
	
在架构演进过程中，还会遇到二进制污染、编译优化、主干分支稳定性、业务层的依赖耦合等问题，这必然是一个长期的、需要持续探索的系统性工程。

### 🐎 [软件幻灭（译）](https://tonsky.me/blog/disenchantment/zh/)

[@老驴](https://www.weibo.com/6090610445)：本文是作者对现在软件行业的一篇吐槽文。作者认为软件行业和 20 年前相比，更成熟，却也更复杂，更累赘。软件体积动辄是当年的 10 倍以上，性能却没有很大的提升。各种协议也越来越复杂。大家都只在乎完成产品，越来越少的人在乎软件本身的质量了。虽然我不完全同意作者的观点，但是也不得不承认这是事实，这也是一个行业逐渐成熟以后的必然。我们有能力改变么？也许有，但成功的可能性也并不高。

### 🐢 [Swift 的一次函数式之旅](https://mp.weixin.qq.com/s/yiF0NwXffrkunGOieWbIRA)

[@莲叔](https://github.com/aaaron7)：Swift 语言从诞生之日起就因为从纯函数语言中吸收了非常多的函数式特性而成为函数式编程爱好者们的津津乐道的热门语言之一。自定义操作符，函数是一等公民，简洁的闭包语法以及 maybe monad 的具体实现：optional，这些特性都带来了相当多的想象空间。一度在 15-17 年掀起了一股热潮。

18 年之后热度逐步减少，原因很多，其中比较关键的原因就是在实践中存在的理解成本高、调用栈复杂等问题一直没有得到很好的解决，所以也就一直未成为 iOS 开发的主流模式。不流行不妨碍这是一门非常有趣的学科，毕竟函数式编程的鼻祖 Haskell 社区就有一句谚语：Avoid success at all cost，不计代价的避免成功。指的是不为了流行去做事，而是做本来就正确的事情。所以小编也推荐大家可以适当关注函数式编程，享受抽象与形式的美带来的愉悦感。

这篇文章介绍了函数式编程的入门知识，同时也浅显易懂的讲述了通过函数组合提升代码可读性和 callback hell 的经典案例，适合感兴趣的同学们阅读。

## 工具

### [Nuke Docs](https://kean.blog/post/nuke-docs)

[@老驴](https://www.weibo.com/6090610445)：不论是开源项目还是公司内部项目中都有很重要的一环：写一份规范易读的文档。文档不仅仅是为使用者提供方便，也为自己之后可以更好地理解，重构，改进服务。Nuke 的作者就用 Blog 讲述了对于 Nuke 文档，是怎么做的选择，最后又是怎么优化的。文章里没有什么很详细的技术细节，但是思路值得学习。

## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 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）
