# 老司机 iOS 周报 #202 | 2022-05-16

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

## 新闻

### 🌟 🐢 [Flutter 3.0 发布](https://mp.weixin.qq.com/s/7glBeUReiNytWqsNLhi7sA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 前两天的 Google I/O 上 Flutter 3.0 已经发布，主要包括 Flutter 对 macOS 和 Linux 正式版支持、进一步的性能改进、手机端和 Web 端相关的更新等等。此外还有关于减少对旧版本 Windows 的支持，以及一些 breaking changes 列表。国内外的相关技术咨询上有诸多讲解，这里小编就简单为大家汇总一下，方便同学们阅读学习:

- [中文版讲解](https://mp.weixin.qq.com/s/7glBeUReiNytWqsNLhi7sA)
- [英文原版](https://medium.com/flutter/whats-new-in-flutter-3-8c74a5bc32d0)
- [Dart 2.17 新特性](https://medium.com/dartlang/dart-2-17-b216bfc80c5d)

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

### [通过服务器处理 App 内购买和提供用户支持](https://developer.apple.com/cn/accelerator/)

2022 年 5 月 17 日（报名截止 5 月 16 日）

了解如何使用 App Store 服务器 API 和 App Store 服务器通知处理 App 内购买，为您的客户提供支持和退款处理。报名预计开放时间：5月12日

### [音频类 App 专场：为你的音频类 App 提升体验](https://developer.apple.com/cn/accelerator/)

2022 年 5 月 25 日至 26 日（报名截止 5 月 24 日）

欢迎参加为期两天的音频类 App 专场活动！通过本次活动，您将全方位了解 Apple 的相关技术针对在“音频”领域不同使用场景如音乐、K 歌、有声书以及播客类场景中的最佳实施性等，包括物理音频空间化引擎工作原理和使用，音频识别和分类的智能构建等，以及如何利用 watchOS 打造更好的音频类 watchOS App 等等。期待您的加入和我们一起探索音频领域的空间！

![156925166-f0e9ae02-0d06-4806-aa19-e84d84e2fd1f](https://user-images.githubusercontent.com/11873526/162620205-0cddfae9-05e0-4e10-9359-4d914e3ae08b.jpeg)

## 文章

### 🐕 [西瓜视频 iOS Voice Over 无障碍适配实践](https://mp.weixin.qq.com/s/cVEPN28XOBs6XNy0PDGudg)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：无障碍的适配既是工信部的要求，也是企业社会责任感的体现。本文介绍了苹果原生无障碍相关的 API 使用以及业务渗透较高场景的适配实践。如有相关适配需求可以借鉴对应场景中的交互方式。文章内容集中于解决如下问题：
- 焦点相关问题：信息缺失/冗余/错误、顺序错乱、停留不当 等
- 浮窗问题 / 焦点被覆盖时仍可访问
- 嵌套容器 ScrollView 无法跟随滚动

### 🐕 [MachO 文件编译链接常见的三大认知误区](https://mp.weixin.qq.com/s/XpMcSzEayM-cBT4-jRr9kA)

[@AidenRao](https://weibo.com/AidenRao)：[《iOS15动态链接fixup chain原理详解》](https://mp.weixin.qq.com/s?__biz=Mzg2NTYyMjYxNg==&mid=2247486514&idx=1&sn=2fb1b443dafebd7bffd47cd53d170d8e&scene=21#wechat_redirect) 对 iOS15+ 动态链接过程性能优化的深度解析，引发了字节跳动 APM 团队对 MachO 文件的编译链接过程探索的兴趣。在学习的过程中，初学者常常会因为对该领域的不熟悉而陷入误区。本文整理了初学者比较容易犯的三大认知误区，避免大家重蹈覆辙。

### 🐢 [Swift 首次调试断点慢的问题解法](https://mp.weixin.qq.com/s/n6cRVhr5Sw1CSOqAYWiBRw)

[@享耳先森](https://github.com/iblacksun)：在 Swift 项目开发过程中，相信大家最近两年都深受「首次断点调试启动慢」问题困扰，根据项目大小和结构不同，首次调试时间从十几秒到几分钟不等，最近中文社区对此问题进行深入研究。

优酷团队发文 [Swift 首次调试断点慢的问题解法](https://mp.weixin.qq.com/s/n6cRVhr5Sw1CSOqAYWiBRw) 通过以下命令优化 LLVM 配置：
```
settings set target.memory-module-load-level minimal
settings set symbols.use-swift-clangimporter false
```
字节团队发文 [Swift 调试性能的优化方案](https://mp.weixin.qq.com/s/TXrY1bbSdYCkaeE8aq2NKg) 通过自定义 LLDB 及配置更细致的解决调试断点慢问题，实测效果更加明显。

>需要说明的是，以上方案与主工程项目结构有关，依赖的二进制库越多，效果越明显。

### 🐕 [Detecting Xcode Previews](https://www.createwithswift.com/detecting-xcode-previews/)

[@Damien](https://github.com/ZengyiMa)：在 SwiftUI 中想区分当前运行环境是在 Preview 中还是虚拟机中吗？来看看这篇文章吧，作者提供了从 ProcessInfo 中通过 XCODE_RUNNING_FOR_PREVIEWS 获取当前的运行环境的信息的思路，从而可以让我们识别运行环境是在 Preview 还是虚拟机。

### 🐕 [Jenga - 基于 Swift ResultBuilder 优雅的构建 UITableView](https://github.com/fanglinwei/Jenga)

[@老峰](https://github.com/gesantung)：Jenga 是一个基于 ResultBuilder 封装的类 SwiftUI 使用声明式语法构建 UITableView 开源库，提供了 State 和 Binding 特性，代码简洁，可读性强，感兴趣的同学不妨一试。

### 🐕 [Flutter 状态管理框架 Provider 和 Get 分析](https://mp.weixin.qq.com/s/iLSjr-HE4VC1kTdjI2bFNQ)

[@极速男孩](https://github.com/ztlyyznf001)：Flutter 作为一个声明式的 UI 框架状态管理是一个让人头疼的问题，没有状态管理会导致难以复用/单元测试，跨页面无法传递数据，setState 方法会过度刷新的问题。本文主要介绍了 Get 与 Provider 的状态管理的原理，并且如何利用他们去实现 MVP 模式，并且对比了两者的优缺点。

### 🐢 [Flutter 深入探索混合开发的技术演进](https://mp.weixin.qq.com/s/JjlCyCOC4gL7hx3UNs7ONQ)

[@邦Ben](https://weibo.com/linwenbang): 本文梳理了 Flutter 中 PlatformView 的演进过程，也就是从直接通过 channel 打开一个 WebviewController 到 Virtual Displays 到 Flutter Hybrid Composition 的过程，文中通过各种例子说明原理以及也指明了优缺点，在使用 Flutter 的同学建议一看。同时上周推荐的 UC 团队做的进一步优化进行是下一步演进方向，也可以一并看看。

参考链接：
[U4 内核技术 - Flutter PlatformView 优化](https://mp.weixin.qq.com/s/gJXk56yJ5oJREHCUbsdhXg)

### 🐕 [深入理解 OC/C++ 闭包](https://mp.weixin.qq.com/s/NEvtm_yBMghyP_WTUATy8g)

[@xuyafei](https://github.com/xiaofei86)：ObjC 编译器允许用户在同一个源文件里自由地混合使用 C++ 和 ObjC，相对于其它语言与 C++ 的文件隔离和架桥通信（Kotlin 使用 JNI，Dart 使用 FFI），Objective-C++ 的同文件混编方式无疑是令人舒畅的。虽然 Objective-C++ 没有为 ObjC 和 C++ 类增加功能，类的体系结构也互相独立，类之间不能互相继承，但有时二者也会相互把自己的魔杖伸向对方领域，从而会引发一些比较费解的问题。本文就从两种语言闭包混合捕获的原理出发，了解其混编方式背后机制的冰山一角，也帮助大家写出更好的 ObjC/C++ 混编代码。


## 代码

### [老司机技术沙龙](https://github.com/SwiftOldDriver/Salon)

不知不觉，已经联合举办了 6 场开发者活动了。我们对过去几场活动重新做了一次梳理，把所有可公开的资料都上传到了这里，后续的活动也会同步更新到这里。需要的朋友移步自取哈

![image](https://user-images.githubusercontent.com/11873526/168479876-db1097d6-d1f1-4320-9de6-86c3d4786fdc.png)

## 摸鱼周报

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

* 话题：远程工作正在成为趋势
* 面试模块：CRC 实践应用：理论推导
* 优秀博客：App Extension
* 学习资料：一个大学生的学习计划
* 开发工具：适用于 `macOS` 的现代媒体播放器，`IINA` 由开源媒体播放器 `mpv` 提供支持，几乎可以播放您拥有的所有媒体文件。

## 内推

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