# 老司机 iOS 周报 #242 | 2023-04-24

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

## 新闻

### [Enabling the Inspection of Web Content in Apps](https://webkit.org/blog/13936/enabling-the-inspection-of-web-content-in-apps/)

WKWebView 与 JSContext 在 iOS 16.4 SDK 中新增了属性 ``isInspectable``，只有开启了这个属性才会允许检查 Web 的元素，并且这个属性可以在任意时间修改（不需要重启 APP 或者重新创建 Webview 实例）。对于需要调试 Webview 的同学们需要对这个属性进行适配（开启）之后才能像往常一样通过 Web Inspector 进行查看。

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

### [挑战：让你的 App 更加无障碍 2023 年 5 月 10 日](https://developer.apple.com/events/view/7F793DZPF3/dashboard)

在本次线上讲座中，你将了解如何通过 Apple 操作系统提供的无障碍功能、无障碍 API 和开发者工具，来为每一个人打造卓越的用户体验。

参加线上讲座的开发团队，可在讲座当天报名参与无障碍适配挑战活动，通过审核后我们将邀请你参加 5 月 18 日在上海设计与开发加速器举办的无障碍宣传日线下活动，在线下你将了解到更多无障碍开发技术，以及与其他开发者进行交流和互动。我们还将邀请使用无障碍功能的用户来分享他们的故事，了解 App 是如何赋能他们的日常生活；以及有经验的开发者来分享他们的工程实践，看如何在产品内部推进无障碍适配。你还可获得一对一咨询和深度辅导，获得针对你 App 的无障碍优化建议。

### [线上讲座：探索 Vision 框架](https://developer.apple.com/events/view/93396BVQ5Y/dashboard)

Vision 框架支持人脸检测、文本检测、二维码检测、图像配准、特征追踪等一系列能力。探索如何通过 Vision 框架，在你的 App 内应用计算机视觉相关能力，了解一系列 API，用来在图片和视频上执行不同的任务。

## 文章

### [抖音 Swift 编译优化 - 基于自定义 Toolchain 编译提速 60%](https://mp.weixin.qq.com/s/MT5MHhZIlyrhuVNM3Ckteg)

[@kemchenj](https://kemchenj.github.io/)：抖音基础技术团队在这篇文章里分享了一个很有趣的编译问题：

1. Swift 和 OC 混合的模块里，Swift 自动生成的 xxxx-Swift.h 文件里会 import 所有直接和间接依赖的模块。（这种行为也被称为 re-export）
2. 所以依赖了这个混合代码的模块的 OC 模块，它的所有间接依赖都会变成直接依赖。
3. 而对于编译器来说，当一个模块直接依赖的模块 API 发生变化时，它的编译缓存就会失效，需要重新进行编译。

由于上述的三点，底层库的 API 修改很容易触发大面积的编译缓存失效，并且由于上层模块的直接依赖变多，导致缓存失效的判断逻辑也会变得更加复杂，最终导致编译时间增长。

Swift 这么设计的原因主要是**为了兼容 C/OC 头文件的行为**，[在 Swift 的论坛里开发组也曾经解释过具体的细节](https://forums.swift.org/t/exported-and-fixing-import-visibility/9415/36)。

但实际代码里很少会依赖这个行为，抖音的技术团队就尝试定制 Toolchain，增加更多选项去限制这个行为的生效范围，从而**最终实现编译提速 60%**。

### [PC GWP-ASan 方案原理 | 堆破坏问题排查实践](https://mp.weixin.qq.com/s/xipHtjHPVlyFQ6W-1HfUQQ)

[@xuyafei86](https://github.com/xiaofei86)：众所周知，与内存访问相关的崩溃是最难分析的崩溃类型之一。对于这种崩溃，线上采集到的崩溃日志能提供的有效信息十分有限。因为堆破坏的时间往往在发生崩溃很早之前，等到发生崩溃时，上下文早已丢失，而从崩溃的位置回溯堆破坏的源头，是一件非常有挑战性的工作。

GWP-ASan 是 Google 主导开发的用于检测堆内存问题的调试工具。它基于经典的 Electric Fence Malloc 调试器原理，概率采样内存分配行为，抓取内存问题并生成上传崩溃报告。其可以检测 Use-after-free、Buffer-overflow 和 free-invalid-address 等内存访问相关的错误。

本文介绍了剪映专业版接入字节内部 APM-PC 平台 GWP-ASan 功能的实践，包含对监控原理说明和 5 个线上实例。感兴趣的同学可以阅读原文了解。

### 🐎 [What I Learned Writing My Own CloudKit Syncing Library](https://ryanashcraft.com/what-i-learned-writing-my-own-cloudkit-sync-library/)

[@Smallfly](https://github.com/iostalks)：[CloudSyncSession](https://github.com/ryanashcraft/CloudSyncSession?ref=ryanashcraft.com) 是一个基于 CloudKit 框架的 Swift 库，旨在使编写支持同步和离线功能的应用程序更容易。作者通过一篇文章介绍了该库的开发背景，设计思路，以及使用姿势。

### 🐎 [Mastering Canvas in SwiftUI](https://swiftwithmajid.com/2023/04/11/mastering-canvas-in-swiftui/)

[@享耳先森](https://github.com/iblacksun)：SwiftUI 中，绘制图形可以使用高级的 `ShapAPI`，也可以使用 `Canvas` 直接绘制。本文介绍 `Canvas` 的基本用法，也介绍了如何使用 `Canvas` 绘制文本、图片，甚至给 `Canvas` 添加动画。

### 🐎 [3 mistakes to avoid with async / await](https://www.swiftwithvincent.com/blog/three-mistakes-to-avoid-with-async-await-in-swift)

[@Cooper Chen](https://github.com/cjlcooper)：本文作者在 Swift 中使用 async/await 要避免的 3 个错误，其中包括：
- 尽可能的不同时运行代码
- 不能正确理解 Task 自动捕获 self 的原理
- 在不需要的时候使用了 Task.detached

### 🐕 [淘宝 iOS 拍立淘微距能力探索与实现](https://mp.weixin.qq.com/s/4tG4BTx54rXIdHbXKqI_cQ)

[@EyreFree](https://github.com/EyreFree)：在最近两年苹果发布的 iPhone13 Pro Max 和 iPhone14 Pro Max 系列的手机上，如果使用三方主流 App 进行近距离对焦，会产生画面模糊的问题。为了优化用户体验，拍立淘 iOS 端开发团队进行了摄像头切换（微距）问题的分析和解决。本文从原理开始分析，通过层层拆解，把「微距实现」这个命题划分成为三个主要的解决目标：变焦系数、光照水平、焦点位置的确定。并围绕链路实现、性能、适配三个层面进行可行性验证，完成微距能力的落地。建议正在研究相关问题的同学阅读。

### 🐎 [Using DWARF to find call sites of inline functions](https://margiolis.net/w/dwarf_inline/)

[@Damien](https://github.com/ZengyiMa)：DWARF 是一种调试信息文件格式，被许多编译器和调试器用来支持源代码级调试。它解决了一些程序性语言的要求，如 C、C++ 和 Fortran，并被设计为可扩展到其他语言。DWARF 是架构独立的，适用于任何处理器或操作系统。如果你对使用 DWARF 来查找内联函数的调用点有需要，不妨阅读下本文，这对你或许有很大的帮助。

### 🐎 [Reducing iOS app size using linker and why_load](https://asifmohd.github.io/ios/2023/03/30/reducing-ios-app-size-using-linker.html)

[@Leo](https://github.com/LeoMobileDeveloper)：why_load 是 Apple LD 提供的一个链接选项，通过这个选项我们可以了解到一个 Symbol 在链接形成最终产物的时候为什么被保留了下来。文中介绍了如何利用这个选项，来减少我们 App Extension 产物中保留的符号，进而优化包体积。当然，类似的方法也可以用于主二进制，不过对于主二进制的优化要更加的慎重，避免引入新的问题。


## 摸鱼周报

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

* 本期话题：线上讲座：探索 Vision 框架；5 月 9 号，App Store 定价以美国价格为基准进行更新
* 内容推荐：推荐近期的一些优秀博文，涵盖：App Clip、CloudKit、Swift ABI 稳定性等方面的内容
* 摸一下鱼：建了一个交流 AGI 知识的社群；在 Vercel 上部署 ChatGPT 的聊天能力；一个把 AI 拟人化的网站；AI Talk 基于 GPT4 让马斯克和乔布斯进行对话；基于 Apple 健康数据分析的 App HealthGPT
* 岗位招聘：蔚来汽车 App iOS 研发

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 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）
