# 老司机 iOS 周报 #169 | 2021-08-02

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

## WWDC 21

### 🌟 线下沙龙

[@Parsifal](https://github.com/ParsifalC)：上周四开始，我们已经在周报公众号上开始陆续发布今年杭州场沙龙的分享文章、PPT 和视频等内容了，本周也会继续发布杭州场和上海场的相关内容信息，欢迎大家继续关注~

- [淘宝工程渐进式拥抱 Swift - 倾寒](https://mp.weixin.qq.com/s?__biz=MzI2NTAxMzg2MA==&mid=2247491478&idx=1&sn=8dc4a6a6062056b9bed801ea043f7919&chksm=eaa2809dddd5098b4e8ecc06ba6d0649321f75981f56517ed25577e12de183e392577aba9267&token=1581804799&lang=zh_CN#rd)
- [西瓜视频的 IAP 支付实践与 StoreKit 新特性 - 黄骋志](https://mp.weixin.qq.com/s?__biz=MzI2NTAxMzg2MA==&mid=2247491481&idx=1&sn=652c93ef30634f979008387cc029ec68&chksm=eaa28092ddd509848862d136c906a913bdb40a41f2220245393ed0498b4669671c0e4b41247e&token=1581804799&lang=zh_CN#rd)

### 🌟 [WWDC 21 内参](https://xiaozhuanlan.com/wwdc21)

[@Parsifal](https://github.com/ParsifalC)：本周内参恢复更新，8 篇高质量内容已经发布~

- @VincentMing：[【WWDC21 10132】 认识 Swift 的 Async/Await](https://xiaozhuanlan.com/topic/9307851264)
- @fakeGourmet：[【WWDC21 10143】- 探索 AVFoundation 中的 HLS 变体](https://xiaozhuanlan.com/topic/8432795016) & [【WWDC21 10142】 - 使用 HLS 让媒体无缝切换](https://xiaozhuanlan.com/topic/7392854016) & [【 WWDC21 10141】 - 使用 HLS Content Steering 提升全球范围流媒体的可用性](https://xiaozhuanlan.com/topic/2956103478)
- @Mim0sa：[【WWDC21 10097 10251 10349】- SF Symbols 使用指南](https://xiaozhuanlan.com/topic/9214865730)
- @MarryNerV：[【WWDC21 10220 10221】 - 本地化功能上新](https://xiaozhuanlan.com/topic/6278501394)
- @Nemo：[【WWDC21 10047】 - 相机拍摄新变化](https://xiaozhuanlan.com/topic/0729458136)
- @kk：[【WWDC21 10002 10009】- watchOS 8 中的新特性](https://xiaozhuanlan.com/topic/0142735986)

### WWDC 21 播客

#### [WWDC21 瞎谈：Catalyst、SwiftUI、Flutter 谁是 UI 的未来？](https://www.xiaoyuzhoufm.com/episode/61009e2083c3728d82be24c4)

[@没故事的卓同学](https://github.com/lacklock)：这是我们第二期 WWDC 相关的播客，本期我和老驴、四娘、少庸一起聊了一下对 Catalyst、SwiftUI、Flutter 的看法。本期节目在苹果播客、网易云音乐、QQ 音乐、汽水儿、喜马拉雅中也有上线。

## 文章

### 🌟 🐢 [我写技术文章的一点心得](https://ming1016.github.io/2021/07/24/my-little-idea-about-writing-technical-article/)

[@Barney](https://github.com/BarnyZhao)：本文是戴铭老师对自己过往写作经验的深度总结，从四个写作要点开篇，分析了自己过往的经典文章以及当时的想法和灵感。紧接着结合本次 WWDC 举例，传授新手如何开始写作的经验。可谓是干货满满，适合反复阅读。

关键点脉络：
- 四个点
- 过往经验
- 我是新手怎么办
- WWDC 和 经验总结

### 🌟 🐕 [基于 Swift 编写严肃脚本工具](https://github.com/100mango/zen/blob/master/%E5%9F%BA%E4%BA%8E%20Swift%20%E7%BC%96%E5%86%99%E4%B8%A5%E8%82%83%E8%84%9A%E6%9C%AC%E5%B7%A5%E5%85%B7/%E5%9F%BA%E4%BA%8E%20Swift%20%E7%BC%96%E5%86%99%E4%B8%A5%E8%82%83%E8%84%9A%E6%9C%AC%E5%B7%A5%E5%85%B7.md)

[@EyreFree](https://github.com/EyreFree)：本文作者是目前就职于微信的 100mango 老师，开篇通过分析 Swift 在国内外的使用现状以及在微信的一些应用场景表现了 Swift 的光明前途，并且借由「微信支付跨平台代码生成器是由 Swift 编写的」这一事例引出了文章主题：如何通过 Swift 来编写脚本 / 自动化工具。主要分为以下四步：

- 创建工程：通过 Swift Package Manger 创建了工程，并调整了工程结构，依赖管理；
- 编写代码：通过编写一个简单生成随机数的工具感受 Swift 编写脚本工具，并给我们的工程引入了苹果开源的 Argument Parser 库。用于简化命令行参数解析，优化工具说明；
- 测试：分别对逻辑代码和命令行 API 进行了测试；
- 发布：通过一行简单的代码，就能生成可执行文件进行分发；
- 进阶操作：最后介绍了几个进阶操作，我们还发现通过 Swift 编写脚本工具，还能直接和 AppKit / SwiftUI 进行交互，非常的具备扩展性。

这篇文章并没有展示特别复杂的代码，但是根据上面展示的步骤、原则，就能编写出能够支撑像微信支付跨平台代码生成器这样的命令行工具。Swift 是一门优雅的编程语言，以后大家不管是遇到编写一些小脚本还是开发大型严肃工具的场景，都可以尝试用 Swift 实现了呢！

### 🌟 🐕 [Calling Hidden/Private API from Swift in Style](https://medium.com/swlh/calling-ios-and-macos-hidden-api-in-style-1a924f244ad1)

[@JonyFang](https://github.com/JonyFang)：在 Swift 中使用 Objective-C 私有 API 一般有两种方式，自己创建头文件或消息的方式，但不管哪一种使用起来都会比较繁琐。本文中，作者基于 Swift 的 `@dynamicMemberLookup` 和 `@dynamicCallable` 特性封装了围绕 Objective-C 类和对象的库 -- [mhdhejazi/Dynamic](https://github.com/mhdhejazi/Dynamic)。`mhdhejazi/Dynamic` 满足了 Swift 可以以更简单和直观的方式来调用私有 API。

### 🌟 🐕 [大家来找茬：记一起 clang 开启 -Oz 选项引发的血案](https://mp.weixin.qq.com/s/1RNsrmUKuxmQa0jPZozE9A)

[@Leo](https://github.com/leomobiledeveloper)：我们可以通过 -Oz 的编译选项来优化包体积，但是在某些极端情况下 -Oz 会导致编译器的某些优化失效，引起一些非预期的问题。本文就是关于一个开启了 -Oz 导致 autorelease 优化失效，对象误被放入 autoreleasepool 中，进而引起大量内存堆积的问题。文章干货颇多，推荐阅读。 

### 🐎 [技术债治理的四条原则](https://insights.thoughtworks.cn/managing-technical-debt/)

[@莲叔](http://github.com/aaaron7)：在我们的工作中，重构是一个经常提及的话题，毕竟现在都是业务优先，几乎没有一个业务的技术架构是一步一步稳扎稳打的建立起来的, 普遍都是上线要紧，随着而来的就是各种各样的技术债。对于技术债，重构还是不重构，这也是一个问题。不重构吧，做新需求很蛋疼，容易踩雷，稍不留神就线上故障。重构吧，投入很多人力物力，但其结果很难产生真正的业务收益，业务方不买单也就算了，还可能导致目前线上已经在跑的模块出现问题。不管从哪个方面来看，这都是一个很两难的问题。这篇文章针对这个两难问题进行了非常深入的分析与讨论，并且旗帜鲜明的给出了自己的态度：要解决，但是需要遵循几个基本的原则。感兴趣的同学可以阅读一下，或许可以找到符合你们团队实际情况的答案。

### 🐕 [The flutter “const” Keyword demystified.](https://medium.com/flutter-community/the-flutter-const-keyword-demystified-c8d2a2609a80)

[@邦Ben](https://weibo.com/linwenbang)：这篇文章简单介绍了 const 的使用会对某些频繁创建的场景的性能有所优化，例如在构造方法中加入 const 声明，可以提高复用 widget，节省内存。总体而言，在频繁复用场景中（例如做动画），建议加上 const ，其他基本不复用的场景则作用不大。

可以配合下方链接阅读，参考文章作者也对 const 的使用进行了简单的测试以证明效果。

参考：
[Flutter 的 Widget，刻意加上 const，真的值得吗？](https://juejin.cn/post/6977212326394986510)

### 🐕 [网易新闻 iOS 工程组件化实践](https://mp.weixin.qq.com/s/mfvbRXEhJBqzhwQbjnuZgw)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：网易新闻也是迭代了 10 年的 APP 了，最终实现了主工程里只有一个 main 文件，组件数量达到了 268 个。

每个 APP 会由于项目特点以及团队组织结构的区别，在实践中细节会有些许不同，但目的都是明确的：提高可维护性、开发效率。网易新闻业务之间耦合较多，业务之间频繁相互调用接口也有成本；团队没有按业务进行拆分，同时业务之间也不需要隔离。因此网易新闻没有选择通过路由将业务完全隔离，而是将业务拆为两层，顶部的展现层利用路由隔离，下方的业务层可以单项依赖。

同时网易新闻还对工具链进行了改造：
- 在组件配置信息中增加 level、binary 等参数，在 ``pod install`` 时前置报出 warning ，防止组件之间的错误依赖关系
- 推行严格的代码责任制以及 Merge Request 规范化
- 未选择版本号，而是采用通过 Xcode 缓存，MD5 区分版本的本地二进制方案，减少额外的人力成本

> 自荐： [lixf](https://https://github.com/lixinfei)

### 🐕 [美团 App 页面视图可测性改造实践](https://mp.weixin.qq.com/s/YcvFSs-97SpMKjlpj9Dzqg)

 [@含笑饮砒霜](https://weibo.com/chinafishnews/)：本文围绕动态化容器中的动态布局技术，阐述了如何通过可测性改造来帮助达成提升测试效率的目标。本文目录：
 
* 美团App的页面特点
 
* 自动化测试实施中的技术挑战
	* 页面元素无法定位
	* Appium元素定位的原理
	* AccessibilityNodeInfo和Drawable

* 页面视图可测性改造-XraySDK
	* 定位方案对比
	* 视图信息的获取和存储-XrayDumper
	* 视图信息的输出-XrayServer
	* SDK整体功能结构
	* 视图信息的增强
	* 动态布局自动化的收益

* 未来展望
	* 使用视图解析原理解决WebView元素定位
	* 视图可测性改造更多的应用场景

### 🐕 [面试中 LRU / LFU 的青铜与王者](https://github.com/halfrost/Halfrost-Field/blob/master/contents/Go/LRU:LFU_interview.md)

[@J_Knight_](https://github.com/knightsj)：本文作者介绍了 LRU 和 LFU 算法的原理和 Go 语言的实现。也分享了 LRU 和 LFU 的优化方案和“如何实现一个高并发且线程安全的 LRU” 这个问题的实现思路。

### 🐕 [从 WebKit 源码中学习手势处理的高级用法——WKWebView中的手势识别](https://mp.weixin.qq.com/s/pt1nk5z5nK-fPCKqQlP-sg)

[@折腾范儿_唯敬](https://www.weibo.com/agvicking/home?wvr=5)：本文的作者从对 iOS 事件响应与手势的基础原理入手，深挖到 WebKit 源码中对于手势的处理策略，针对 Web 界面中更复杂更多样的手势处理进行分析与总结，非常有助于我们加深对 iOS 手势的深入理解与运用。

### 🐎 [Xcode 13 Missing Info.plist](https://useyourloaf.com/blog/xcode-13-missing-info.plist/)

[@AidenRao](https://weibo.com/AidenRao)：文中主要介绍了 2 点：

1、Xcode 13 新起的 SwiftUI 项目，Info.plist 文件已经不存在，文中介绍了如何找回 Info.plist。

2、Xcode 13 新建的项目无法用 Xcode 12 打开，文中介绍了如何更改设置来向前兼容 Xcode 12。

> 感谢 [faimin](https://github.com/faimin) 的推荐

## 摸鱼周报

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

* 小编整理了一些洪灾应对的指南，希望对大家有所帮助。
* Tips 部分介绍了如何绘制一个高颜值的统计图。
* 面试解析模块本期讲解深拷贝浅拷贝的知识点。
* 优秀博客汇总了不少包体积优化的优秀文章。
* 学习资料推荐了 [Better Explaine](https://betterexplained.com/) 这个网站，其用于帮助大家理解那些复杂的数学概念。
* 截图工具 Snipaste，无用图片搜索工具 LSUnusedResources。

## 代码

### 🐕 [OpenCombine](https://github.com/OpenCombine/OpenCombine)

[@zvving](https://github.com/zvving)：与 SwiftUI 一起推出的 [Combine](https://developer.apple.com/documentation/combine) 本可以作为响应式框架独立使用，但最低系统 iOS13 的限制极大制约其应用。

类似 [CombineX](https://github.com/cx-org/CombineX)，[OpenCombine](https://github.com/OpenCombine/OpenCombine) 旨在为 iOS/macOS 低版本（>= iOS 8.0）及跨平台场景提供 API 一致的开源实现，为后续向官方 Combine 过渡提供『无缝切换体验』。项目依旧在早期阶段，感兴趣的朋友们可以提前了解，生产环境应用需谨慎。

> 感谢 [XanderXu](https://github.com/XanderXu) 的推荐

## 赞助者

虚位以待..

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