# 老司机 iOS 周报 #200 | 2022-04-25

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

##  Developer - 开发者活动

> 4 月 23 号的「快手技术沙龙·iOS 技术专场」PPT 已经公开，可以通过「老司机技术公众号」发送「PPT」获取。文字整理和视频回放稍后放出。

### [「T Chat ｜ 我在大厂做研发」系列直播首发](https://mp.weixin.qq.com/s?__biz=MzI2NTAxMzg2MA==&mid=2247494102&idx=1&sn=f29dfb12cffa840ee46169409002379a&chksm=eaa176ddddd6ffcbc4050f38f7fc7fa7dc4cd4bca9a59d74c97abd4a6d15ad6ce4b3076cf568#rd)

作为开发者，在我们的职业生涯中，可能会无数次问自己或者被问到这两个问题：

- 一线大厂的研发团队在做什么？

- 研发专家们在关注什么？

年初做调查问卷的时候发现，有很多人有同样的困扰。所以老司机技术周报决定联合 T 技术沙龙发起「T Chat ｜ 我在大厂做研发」系列直播计划，邀请一线互联网大厂的研发专家，采用在线直播的方式，分享他们团队 or 个人的研发实践经验，尝试回答这两个问题。

### [T 技术沙龙移动端技术实践（上海场）文字稿整理完毕](https://mp.weixin.qq.com/s/gjU6ejMRyG7Cqfr9271qsA)

- [基于 C++ 的 Android 协程设计 - 张涛](https://mp.weixin.qq.com/s/VJJhBt2zYzmczXQwIxu-jQ)
- [自制渲染引擎及在客户端应用 - 王宇](https://mp.weixin.qq.com/s/QanFOa-TsxXqylajjleF7Q)
- [MVI 范式在 Jetpack Compose 上的应用](https://mp.weixin.qq.com/s/1GiafKMZXrpzZDSqpGtpfQ)

## 新手推荐

### 🐕 [iOS | 图解iOS签名背后的原理](https://mp.weixin.qq.com/s?__biz=Mzg3MjcxNzUxOQ==&mid=2247484901&idx=1&sn=83fcf34b5b4b7a63c17742efa3ee20a8&chksm=ceea4845f99dc1537003bdebd2a93d09c9b413ad0cc8c5108cd93d5b84e63e65a30ce0f6c019&token=996185752&lang=zh_CN#rd)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：作者带领读者实操申请证书的全流程，并介绍了 iOS 开发证书的申请、验证、加签等过程的原理。适合新手一读。

> 本篇收录由该文作者 [@doubleLLL3](https://github.com/doubleLLL3) 自荐。

## 文章

### 🌟 🐕 [系统困境与软件复杂度，为什么我们的系统会如此复杂](https://mp.weixin.qq.com/s/3PSFMt9cQ1ZCoYQrdOCM6Q)

[@xuyafei](https://github.com/xiaofei86)：作者读《A Philosophy of Software Design》有感，有兴趣可以阅读原文。

软件的复杂性有多种表现形式，可能是因为领域模型的边界模糊，而使看似简单的变更需要多处修改代码；可能是因为设计者在各种模式中迷失，使项目脱离现状而过度工程化；可能是因为代码的混乱与文档的缺失，使改动影响范围难以明确。这些模糊创造了复杂，而依赖又传播了复杂，使复杂性不断递增。

宇宙处在无法抵抗的商增过程中，孤立的软件系统在不引入外部力量时，也无法抵抗走向复杂与混乱。而架构的本质就是成为这股约束力量。《Clean Architecture》中说道“软件架构的终极目标是用最小的人力成本来满足构建和维护该系统的需求”。

但软件工程学科最难的事情就这样的抽象能力，因为它没有标准、没有方法、甚至没有对错。如何在软件固有的复杂性上找到一条既不过度也不缺失的路，是软件工程师的终身课题。

### 🌟 🐕 [音视频工程示例 AVDemo 10、11、12、13](https://mp.weixin.qq.com/s/4Ua9PZllWRLYF79hwsH0DQ)

[@JonyFang](https://github.com/JonyFang): 音视频工程示例 AVDemo 10、11、12、13 篇：

- [iOS AVDemo 10 - 视频解封装，从 MP4 解出 H.264/H.265](https://mp.weixin.qq.com/s/4Ua9PZllWRLYF79hwsH0DQ): 实现对 MP4 文件中视频部分的解封装逻辑并将解封装后的编码数据存储为 H.264/H.265 文件；
- [iOS AVDemo 11 - 视频转封装，从 MP4 到 MP4](https://mp.weixin.qq.com/s/VVItfhebc6L-JQFCGBtapQ): 实现对 MP4 文件中音视频的解封装逻辑，将解封装后的音视频编码数据重新封装存储为一个新的 MP4 文件；
- [iOS AVDemo 12 - 视频解码，MP4 → H.264/H.265 → YUV 的源码](https://mp.weixin.qq.com/s/BIazU0Wd5_p4bx4nKJoH-g): 串联视频解封装和解码模块，将解封装的 H.264/H.265 数据输入给解码模块进行解码，并存储解码后的 YUV 数据；
- [iOS AVDemo 13 - 视频渲染，用 Metal 渲染](https://mp.weixin.qq.com/s/4K8xPX_A8NA01ecmA6UCtw): 串联视频采集和渲染模块，将采集的视频数据输入给渲染模块进行渲染；

### 🌟 🐕 [视频下载加速，2.5倍优化](https://mp.weixin.qq.com/s/GDNBMmhaRuZH5BesjRdFfg)

[@极速男孩](https://github.com/JonyFang): 介绍了在搜狐视频 iOS 客户端中，是如何利用 quic 中的 cronet 库，来动态调整缓存视频的并发数。主要通过测试当前的网速并结合当前的网络环境，设备性能和设备性能等因素来将并发数控制在一个合理的方位内。通过这样的优化给 WIFI 环境下带来了 2.35 倍和流量环境下 1.50 倍的速度提升。

### 🐕 🌟 [快手 iOS 启动优化实践](https://mp.weixin.qq.com/s/ph7kFRKYWP1bqbNtTK4z3Q)

[@Leo](http://github.com/leomobiledeveloper)：应用启动速度直接影响用户的使用体验，且启动越快、留存就越高，所以做好启动不仅有利于用户体验指标的提升，也会促进核心业务的增长。本文包含了快手团队在 iOS 启动优化上的实践，除了常规的优化方式，还包括像动态库懒加载、TTI 任务调度、后台启动、防劣化等多方面实践，推荐阅读~

### 🐕 🌟 [货拉拉用户端体验优化--启动优化篇](https://juejin.cn/post/7087773731061235743)

[@红纸](https://github.com/nianran)：在上篇提到了快手的启动优化，本篇文章则是货拉拉团队的启动优化方案。货拉拉团队在前期的主要优化实践为优化串行接口、启动任务管理、长尾治理（治理低端机的业务 API 耗时）、防劣化。此外文内还提到了三种轻量级的工具用于分析启动任务过程的耗时问题。推荐大家两篇文章一起阅读~

### 🐢 [Flutter 音视频开发新思路](https://mp.weixin.qq.com/s/ZpHfkz8CQmPhKY4--WYTWw)

[@莲叔](http://github.com/aaaron7)：Flutter 因为众多优秀的设计而在跨端方案中脱颖而出，成为目前跨端开发的主流选型。常规的业务功能和逻辑模块通过应用 Flutter 可以较好的实现双端代码的一致性。但是对于某些细分领域，比如音视频，对资源的使用和计算的性能高度敏感，Flutter 能做的可能就只能是偏向于纯展示，更多的逻辑都下沉在 Native 实现。虽然能满足需求，但丢失了 Flutter 跨端的优势。闲鱼在这个方向探索了一个新的思路。将音视频处理细化为一个个处理单元，然后在 Flutter 侧将这些处理单元组织成 pipeline 来实现业务逻辑，在保证可用性的基础上最大限度的提升了跨端代码的占比。虽然 Flutter 究竟是否适合音视频场景，业界也是有一定争议的。但这个方案有一定新颖性，也是值得研究学习一下的。

### 🐕 [SwiftUI performance tips](https://martinmitrevski.com/2022/04/14/swiftui-performance-tips/)

[@zvving](https://github.com/zvving)：相比 UIKit，SwiftUI 有着不同的声明式写法和渲染机制，这导致二者性能优化思路上有共性，同时也有不同的挑战。本文作者梳理了 SwiftUI 中常见的性能问题，帮助你实现流畅的用户体验：

- 避免主线程繁重工作：线程隔离网络加载、数据库访问等耗时操作，合理增加数据缓存
- 避免多余重绘：缩小重绘区域，控制频次，减少不必要的数据更新
- 合理使用 SwiftUI 组件：用范型替代 AnyView、大量重用视图场景使用 Lazy 组件、最小化使用 GeometryReader 等
- 使用 Instruments 定位性能问题的一些方法

### 🐎 [iOS性能优化——离屏渲染的分析探究](https://mp.weixin.qq.com/s/grfRkNI90bUUCWR0l7TjNw)

[@Damien](http://github.com/ZengyiMa)：离屏渲染是我们开发中经常提到的话题，处理不得当会造成的滑动帧率下降，但是离屏渲染背后的实现的原理是怎么样的呢？我们应该怎么去优化和避免它呢？本文将从 4 个问题出发，详细介绍了离屏渲染：

- 什么是离屏渲染？
- 离屏渲染为什么会有性能损耗？
- 常见的离屏渲染场景有哪些？
- 怎么避免离屏渲染？

### 🐎 [iOS制作iBeacon相关SDK，在程序杀死后无法收到本地通知 - 掘金](https://juejin.cn/post/7088597024781647909)

[@Barney](https://github.com/BarneyZhaoooo)：本文介绍了排查 iBeacon 在程序杀死后无法收到本地通知的过程，也一并从头介绍了 iBeacon 的简单使用。

- iBeacon 简介
- iBeacon 权限相关
- iBeacon 相关代码实现
- iBeacon 代码处于 SDK 如何实现后台和 kill 之后的监听

## 摸鱼周报

[@摸鱼周报 #51](https://mp.weixin.qq.com/s/ogjhELipiVFRaYJkT2NQwA)：第 51 期摸鱼周报来了，一起来看下本期概要：

* 话题：游戏版号恢复发放，45 款游戏获版号
* 面试模块：简述 `mmap` 应用
* 优秀博客：iOS 内购主题
* 学习资料：一本刚翻译的 《iOS 高性能 App 架构》小书
* 开发工具：`Quiver`是为程序员打造的笔记本，可以轻松混合文本、代码、`Markdown` 和 `LaTeX`。iTab 一款可以自定义 Tab 页的浏览器插件。

## 内推

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

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

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

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

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2021」，领取 2017/2018/2019/2020 内参**

![](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）
