# 老司机 iOS 周报 #196 | 2022-03-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) 提出。

## 新闻

### [4 月 25 日开始，提交到 App Store 的 app 都必须使用 Xcode 13 构建](https://developer.apple.com/cn/news/?id=2t1chhp3)

从 2022 年 4 月 25 日开始，所有提交到 App Store 的 iOS、iPadOS 和 watchOS app 都必须使用 Xcode 13 构建。Xcode 13 已包含 iOS 15、iPadOS 15 和 watchOS 8 的 SDK。

##  Developer - 设计开发加速器

### [使用 SwiftUI 打造卓越体验](https://developer.apple.com/cn/accelerator/)

2022 年 3 月 24 日- 25 日(报名截止 2022 年 3 月 23 日）

欢迎参加为期两天的 SwiftUI 活动！通过本次活动，您将全方位了解 SwiftUI，包括 SwiftUI 的工作原理和控件使用，数据模型和视图的关联，容器布局和高阶渲染，以及使用 SwiftUI 打造多平台 app。**此外，我们还邀请到社区内活跃开发者，来分享他们的 SwiftUI 实战经验**。加入我们开启 SwiftUI 之旅！

![2022 2 event qrcode footer 2](https://user-images.githubusercontent.com/11873526/156925166-f0e9ae02-0d06-4806-aa19-e84d84e2fd1f.jpeg)

## 文章

### 🐕 [Tips for getting the most out of DocC](https://rhonabwy.com/2022/02/10/tips-for-getting-the-most-out-of-docc/)

[@四娘](https://kemchenj.github.io/)：文档工具 DocC 发布了已经快要一年，这段时间里加上了 static hosting，C/Objective-C 的支持以及 SPM 插件等功能，依托它来构建内部文档工具是一个不错的选择，也是一个顺便梳理项目内部代码的机会。

本文作者提供了一个渐进式接入 DocC 的步骤建议：

1. 给 class/struct/enum 等类型添加注释文档
2. 给公开的函数和属性添加注释文档
3. 添加 documentation catalog 和 overview
4. 给主要的类型和函数分组
5. 编写一篇大致的介绍文档
6. 添加常用的代码模版
7. 给其余的代码分组

### 🐎 [Swift进阶](https://juejin.cn/column/7069654800002252808)

[@老峰](https://github.com/gesantung)：作者比较系统的介绍了学习 Swift 的一些知识点，主要包含如下内容：

- [Swift进阶(一) —— 类与结构体](https://juejin.cn/post/7048633193666183176)
- [Swift进阶(二) —— 方法探究](https://juejin.cn/post/7050873481029746696)
- [Swift进阶(三）—— 属性](https://juejin.cn/post/7062732599835721735)
- [Swift进阶(四）—— 指针](https://juejin.cn/post/7069654422359392292)
- [Swift进阶(五）—— 内存管理](https://juejin.cn/post/7071048325193007134)
- [Swift进阶(六）—— 枚举和可选类型](https://juejin.cn/post/7072287470791966750)

### 🚧 🐎 [All Thumbs, Why Reach Navigation Should Replace the Navbar in iOS Design](https://medium.com/tall-west/lets-ditch-the-nav-bar-3692cb17cc67)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：一篇偏向交互设计的文章，介绍应该如何做好 Reach Navigation 的设计。随着 iPhone 手机屏幕越来越大，用户手指越来越难够到屏幕的顶部，在 Navbar 上设计功能交互区也显得越发不友好。于是作者提出了 Reach Navigation 的概念，并对三种情况做出了建议：

- 使用 Tab Bar 的新 APP
  - 使用从底部 pop up 的弹窗，并能通过下拉手势 swipe away
  - 将常用的操作按钮放置在 Tab Bar 上
  - 在选择如何分配屏幕空间前，思考哪些是核心功能
  - 不要在 Tab Bar 中放置目的地按钮——比如搜索、购物车、新消息。通过别的方式嵌入内容区域或别的途径实现。

- 不使用 Tab Bar 的新 APP
  - 使用苹果地图一样的抽屉式设计，或者像苹果邮箱一样的 sheet 设计
  - 优先考虑把按钮放在屏幕底部

- 修改传统的 APP
  - 把最常用的按钮移动至底部
  - 所有页面适配在屏幕边缘的滑动返回
  - 提高用户方便触达区域的利用率
  - 把重要操作从 Navbar 的右侧移走

PS：本文是17年的文章了，但即使在现在看来也依旧不过时。一个的近期类似设计就是 iOS15 Safari 将 URL/search/tab bar 也挪到了底部，单手操作的体验获得了较大的提升。开发者也不应拘泥于写代码，懂一些交互的基本原理也是加分项。

### 🐎 [iOS代码覆盖率-增量覆盖率自动化实践](https://juejin.cn/post/7049973143007395877)

[@Damien](https://github.com/ZengyiMa)：全量代码覆盖率可以帮助开发者聚焦代码的逻辑缺陷，从而更好地避免线上问题，全量代码覆盖率可以直观的看到整个App的代码的覆盖率情况，但是往往有用的或者被关注的是增量代码覆盖率数据。本文通过探索和学习，研究了基于 Git Diff 能力，结合 Clang 覆盖率信息，最终形成了一套增量覆盖率自动化方案。有兴趣的同学不妨一读。

###  [iOS番外-搞点音乐玩玩](https://juejin.cn/post/7075638987712364580)

[@zvving](https://github.com/zvving)：疫情波动的日子里，不妨听一首自动播放的钢琴曲（[演示看这里](https://www.bilibili.com/video/BV1Yq4y1e7G9/)）。

作者梳理唱名与 MIDI 值的对应关系，定义贝加尔湖畔曲谱文件，使用 [MIKMIDI](https://github.com/mixedinkey-opensource/MIKMIDI) 加载钢琴音色完成播放。**代码简单，也可以很有趣！**

### 🐢 [Better performance with canvas in SwiftUI](https://swdevnotes.com/swift/2022/better-performance-with-canvas-in-swiftui/)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Canvas 在各个平台都是一个备受争议的技术，在 SwiftUI 中也不例外，本文使用 Shape , Canvas , 静态图片来对比单个实例的创建和多实例滚动试图下的性能差异，综合结果还是 Canvas 胜出 ✨

### 🌟 🐕 [音视频工程示例专栏](https://mp.weixin.qq.com/mp/appmsgalbum?)

第四篇 iOS 音频解封装：[从 MP4 中解封装出 AAC](https://mp.weixin.qq.com/s/fCZfIXriTXUPcI4d4te_ew)

第五篇 iOS 音频解码：[免费获得源码](https://mp.weixin.qq.com/s/7Db81B9i16cLuq0jS42bmg)

[@JonyFang](https://github.com/JonyFang): 第四篇主要内容：
1. 实现一个音频解封装模块；
2. 实现对 MP4 文件中音频部分的解封装逻辑并将解封装后的编码数据存储为 AAC 文件；

第五篇主要内容：
1）实现一个音频解封装模块；
2）实现一个音频解码模块；
3）实现对 MP4 文件中音频部分的解封装和解码逻辑，并将解封装、解码后的数据存储为 PCM 文件；

### 🐕 [Writing testable code when using SwiftUI](https://swiftbysundell.com/articles/writing-testable-code-when-using-swiftui/)

[@JimQ](https://github.com/waz0820)：移动端界面开发不需要写单元测试，貌似已经成为理所当然的事（与界面弱相关的功能模块除外）。来到 SwiftUI 的时代，由于 SwiftUI 诸多开发范式的限制，业务逻辑与 UI 框架交互之间的解难解分比之 UIKit 的时代更有过之。

鉴于此，本文探索了如何使 SwiftUI 开发的 相关逻辑充分可测试（Test），主要包括两个部分：将逻辑提取到相应的 ViewModel 中，以及相对独立的逻辑抽取到相应的扩展中。

文章最后，作者也坦诚自己从未对 SwiftUI 的视图本身写测试（UITest）。作者专注于提取所有想测试的逻辑，使其从 UI 框架中摆脱出来，将主要精力致力于编写这部分的测试。小编作为一个页面仔也深感认同，这可能是一条更加可行的路线。

### 🐢 [iOS15 动态链接 fixup chain 原理详解](https://mp.weixin.qq.com/s/k_RI2in_Q5hwT33KWig34A)

[@Leo](https://github.com/leomobiledeveloper)：Fixup chain 是 Apple 在 iOS15 系统上所应用的一种新的动态链接技术，使用了 fixup chain 动态链接方案生成的 Mach-O 文件具有以下两个优势

- 更紧凑的存储信息格式所带来的更小的二进制产物
- 更好的空间局部性所带来的更快的应用启动时间

本文从二进制布局和运行时解析两个角度深入分析了 fixup chain 解决的问题以及实现原理，推荐对底层原理感兴趣的同学阅读~

## 代码

### [SafeDecoder](https://github.com/GodL/SafeDecoder)

SafeDecoder支持在Codable解码某个字段失败时设置默认值，并且默认值可配置。

> 推荐人：[GodL](https://github.com/GodL)

## 摸鱼周报

[@摸鱼周报 #47](https://mp.weixin.qq.com/s/X6lPQ5qwY1epF6fEUhvCpQ)：第四十七期摸鱼周报来了，完整内容可以点击左侧链接，一起来看下本期摘要：

* 话题：苹果多个产品线的更新介绍
* 面试模块：动态库与静态库的区别
* 优秀博客：关于该不该换工作以及如何准备面试
* 见闻：一个新的、偏技术领域的博客推荐模块
* 学习资料：Rust 数据结构与算法
* 开发工具：Aria2GUI，一款支持多种协议的轻量级命令行下载工具

上周还有一期人物访谈，对话一位全职的 iOS 独立开发者，全职独立开发还是非常有难度的，而且听他说靠独立开发的收入即将赶上工作时期的薪资。感兴趣的小伙伴可以点击这里探寻这位独立开发者的进阶之路：[人物访谈 | 极简时钟作者：道哥](https://mp.weixin.qq.com/s/-dZfT_ChTLESbweXyhP3pg) 。

## 内推

### [北京、上海、杭州、深圳] 抖音 - iOS 开发 - 研发效能方向

我们是负责抖音客户端基础能力研发和新技术探索的团队。我们在工程/业务架构，研发工具，编译系统等方向深耕，支撑业务快速迭代的同时，保证超大规模团队的研发效能和工程质量。在性能/稳定性方面不断探索，努力为全球数亿用户提供最极致的基础体验。

更多介绍详见: https://www.yuque.com/iosalliance/article/ozi46h

### 其他

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