# 老司机 iOS 周报 #206 | 2022-06-27

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

## [《WWDC22 内参》](https://xiaozhuanlan.com/wwdc22)

> 上周一共更新了 13 篇，每篇质量都非常高，由于篇幅问题，开头先推荐三篇可能大家更感兴趣的，其他的放到周报最后了~

### 🌟 [【WWDC22 10092】遇见 Passkey](https://xiaozhuanlan.com/topic/8042173596)

苹果一向以对用户隐私的严格重视和出色的隐私保护能力而广受赞誉。passkey 是苹果在用户隐私保护与信息安全方面提出的一个完整的解决方案。本文将带你一起来了解这一方案是什么、为什么和怎么用。

### 🌟 [【WWDC22 110357/110358】Swift Regex: 蓄谋已久的正则优化](https://xiaozhuanlan.com/topic/0563284917)

Chris 画了有五年的大饼 Swift Regex 终于要落地啦！一种号称要超越 Perl 的字符串处理方式，一种兼顾简洁和直观的正则表达式构建方法，一种使正确处理 Unicode 编码轻而易举的抽象模型。Swift Regex 的步伐虽然缓慢，凡坚信不疑的，主必赐福于他。（官方原文：So we go out and evangelize our clearly superior approach to anyone who will listen. Adoption is slow but promising.）

### 🌟 [【WWDC22 10054】SwiftUI 新导航方案](https://xiaozhuanlan.com/topic/7841259603)

导航是所有 App 不可或缺的功能。SwiftUI 在发布时就为我们带来 NavigationView 来支持简单的导航场景，但存在许多不足。幸运的是 WWDC22 为我们带来 NavigationStack 和 NavigationSplitView 来解决各种痛点。
本文通过一个真实的例子《唐诗三百首》详细讲述新的方案的适用场景及使用建议，帮助读者熟悉和迁移到新的导航方案。

## 新手推荐

### 🐕 [How to Start iOS Development Career](https://holyswift.app/how-to-start-ios-development-career-the-5-steps-plan)

[@老峰](https://github.com/Gesantung)：作者通过系列文章罗列了 iOS 开发上手主要知识点，主要包含如下内容：

- Swift 语言：学习资源以及学习方法
- 构建 UI 界面：Using Interface Builder&Build programmatically；UIKit&SwiftUI
- iOS 基础概念：数据存储、网络请求、多线程、内存管理
- 测试：单元测试、集成测试、快照测试、应用程序流测试
- 架构&工具：未完

### 🐎 [逐步实现基于源码的 Swift 代码覆盖率](https://mp.weixin.qq.com/s/cz5hk23XtjCWGi-rb3-cCg)

在这篇短文中，作者将向你介绍其研究 Swift 代码覆盖率检测方案时找到的最佳实践，包括：

* 如何生成 \*.profraw 文件并通过命令行测量代码覆盖率
* 如何在 Swift App 项目里调用 C/C++ 方法
* 如何在 Xcode 中测量完整 Swift App 项目的代码覆盖率

## 文章

### 🌟 🐕 [基于 Bazel 的 iOS Monorepo 工程实践](https://mp.weixin.qq.com/s/WHmYD2X8JGfIQTMmsDG5oA)

[@JonyFang](https://github.com/JonyFang): 一篇实用的技术分享，主要介绍了 BILIBILI 基于 Bazel 的 iOS Monorepo 工程实践，内容结构如下：

1. 介绍 BILIBILI 客户端工程开发模式演进的背景；
2. 解答什么是 Monorepo？有哪些成熟的 Monorepo 工具？
3. 介绍选型 Bazel 原因，着重介绍了 Monorepo 以及 Bazel 带来的优势；

目前 B 站客户端的 Monorepo 模式还在进化中，未来会有越来越多的编译优化的自研规则实装到我们的 iOS 项目中，目前分布式编译能力也已经提上了日程。欢迎对 Monorepo 或 Bazel 感兴趣的同学和我们一起进行技术讨论，也欢迎加入我们的 CI/CD 团队，深度参与改造和建设 iOS 端 Monorepo 工程体系。

### 🐕 [西瓜视频 iOS 播放器技术重构](https://mp.weixin.qq.com/s/EX2WcoxxqRDSPk_xdxkIzA)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：西瓜视频中有各种视频题材，业务逻辑大量耦合，也是业务的最核心模块。本文聚集于业务播放器的重构（并非 VideoEngine 层），通过将播放器拆分为：极简播放器、基础播放器、业务播放器 三层；将业务任务化；降低各层耦合 等手段，最后在可维护性、性能、业务等多方面都拿到了不错的收益，具体的分层方案与思想大家可以借鉴，但最后都要根据业务复杂度来选择最合适的划分。

### [Using the ‘some’ and ‘any’ keywords to reference generic protocols in Swift 5.7](https://www.swiftbysundell.com/articles/referencing-generic-protocols-with-some-and-any-keywords/)

[@zvving](https://github.com/zvving)：相比 ObjC，Swift 协议带来更丰富的实用场景和更严格校验的类型信息。当我们遵循苹果的建议，尝试在项目中落地面向协议编程时，在参数类型、范型关联等场景，类型信息带来大量的限制，这导致我们不得不大量应用类型擦除，能解决问题，也带来更多的理解成本。

Swift 5.1 引入 some 关键字（opaque return types），让基于协议的返回类型更易用。而 Swift 5.7 更进一步，让 some 更灵活的应用与函数参数及范型等场景，同时引入 any 关键字带来官方的类型擦除语义用于类型容器场景。至此，在实例类型更明确的场景使用 some 关键字，类型容器场景使用 any 关键字，Swift 在面向协议编程中真正达到简洁同时兼顾灵活。

### 🐎 [App Store Server API 实践总结](https://mp.weixin.qq.com/s/yP3jlEzN5o0EsaNoW-4mVw)

[@J_Knight_](https://github.com/knightsj)：本文分享了苹果开放的 App Store Server API 的接口：
- 查询用户订单的数据
- 查询用户历史数据
- 查询用户内购退款
- 查询用户订阅项目状态
- 提交防欺诈信息

还介绍了线上环境和沙盒环境的测试服务器地址。而因为这些接口的调用需要先通过 JWT ( JSON Web Token) 的方式授权，所以也介绍了该授权方式的具体操作，例如生成密钥和签名等等。文章的后半部分提供了这些接口的调用示例以及相关的错误码等的相关信息。

拓展阅读：[【WWDC22 10040】 探索 In-App Purchase 集成和迁移](https://xiaozhuanlan.com/topic/8024563197)

### 🐕 [Announcing the Language Workgroup JUNE 15, 2022Ted KremenekTed Kremenek](https://www.swift.org/blog/language-workgroup/)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：自 Swift 成为开源项目以来，Swift 社区共同完成了许多工作。现在，将启动语言工作组，它将承担监督语言和标准库的主要职责。有了一个致力于语言发展的工作组，核心团队将在项目的整体监督和方向上投入更多。核心团队成员将担任管家，协调各个工作组的工作，并制定建立一个更加活跃的开源项目和周边社区的战略。

### 🐕 [SwiftUI 状态管理系统指南](https://mp.weixin.qq.com/s/gJCis1z2zY0dZTLfu7T9CQ)

[@EyreFree](https://github.com/EyreFree)：SwiftUI 与 Apple 之前的 UI 框架的区别不仅仅在于如何定义视图和其他 UI 组件，还在于如何在整个使用它的应用程序中管理视图层级的状态。SwiftUI 没有使用委托、数据源或任何其他在 UIKit 和 AppKit 等命令式框架中常见的状态管理模式，而是配备了一些属性包装器使我们能够准确地声明我们的数据如何被我们的视图观察、渲染和改变。这篇指南能很好地概述 SwiftUI 的各种状态处理机制，文中强调的概念涵盖了所有基于 SwiftUI 的状态处理的绝大多数用例，推荐对 SwiftUI 感兴趣的朋友阅读。

### 🐕 [WWDC 2022 Viewing Guide](https://useyourloaf.com/blog/wwdc-2022-viewing-guide/)

[@Barney](https://github.com/BarneyZhaoooo) 今年的 WWDC 有 175 个  sessions 和大量的新特性要学，光是看视频就要花费大量的时间。东西太多抓不住重点？没关系，不如先按本文的分类从感兴趣的入手。

### 🐕 [Rendering SwiftUI views within UITableView or UICollectionView cells on iOS 16](https://www.swiftbysundell.com/articles/rendering-swiftui-views-within-uitableview-or-uicollectionview/)

[@JimQ](https://github.com/waz0820)：今年的 WWDC 终于带来了在 UITableView/UICollectionView Cells 中渲染 SwiftUI 视图的能力，但并不是可以完全混用了，仅限于 Cells（比如 UITableViewHeaderFooterView 就不能用），Cells 与 SwiftUI 之间要依赖 UIHostConfiguration 的桥接支持，使用一个新的 UIHostConfiguration 对象 wrap SwiftUI 视图并赋值给 cell.contentConfiguration。John Sundell 的这篇文章可以带领大家了解更多详情，并充分利用这一新特性。

### 🐕 [Google I/O Extended | Flutter 游戏和全平台正式版支持下 Flutter 的现状](https://mp.weixin.qq.com/s/3fL_nYvkatqGfBMQ_sddwQ)

[@极速男孩](https://github.com/ztlyyznf001)：今年 Google I/O 上谷歌主要展示了 Flutter 对游戏开发的支持和全平台支持的能力。谷歌通过一款 pinball 的小游戏来展示 Flutter 如何通过 Skia 渲染引擎和 Flame SDK 来提供游戏开发的能力。在 3.0 中 Flutter 提升了 macOS 和 Linux 上应用稳定性，让开发者在尽可能多的共享 UI 和逻辑的基础上，更灵活的利用底层逻辑操作系统。


### 🐕 [wakeup in XNU](http://djs66256.github.io/2021/04/03/2021-04-03-wakeup-in-XNU/)

[@水水](https://www.xuyanlan.com/)：关注性能的读者可能会碰到有一种有一种被系统 kill 类型是 weakup，又因为收集到的日志不足以定位问题，本文通过另一种思路去解决这个问题。整体介绍了weakup是什么、系统如何统计的以及关键的是如何治理。
- 为什么要统计 wakeup
- wakeup 是什么
- wakeup 如何统计的
- wakeup 治理
- 监控与防劣化

### 🐕 [What’s new in Swift 5.7](https://www.hackingwithswift.com/articles/249/whats-new-in-swift-5-7)

[@AidenRao](https://weibo.com/AidenRao)：Swift 5.7 变化巨大，新特性中包括正则表达式， `if let` 速记语法，以及围绕 `any` 和 `some` 关键字的一致性改动，在本文中，作者会通过一些示例来介绍这些新特性。

中文翻译：[【WWDC22 110354】Swift 新特性介绍](https://xiaozhuanlan.com/topic/2498765013)

### 🐕 [Flutter 高延迟渲染流水线调度](https://mp.weixin.qq.com/s/Iv7zogoFD38n-92Un-5Bgg)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 长久以来以高性能著称，但你可能好奇 Flutter 上的卡顿是什么引擎的，又应该如何解决。本文由 U4 内核组带你揭秘 Flutter 体系下的渲染流程，并从中找到卡顿的原因，抽丝剥茧，进阶必看

## WWDC22 内参更新

### 🌟 [【WWDC22 110379】创建一个响应速度更快的媒体应用](https://xiaozhuanlan.com/topic/4263197580)

本 session 主要对 `AVFoundation` 中原本不是很合理的同步 API 做了异步优化，同时将 async/await 应用到了更多 API 中，让 API 更安全的同时还能保持易用。涉及到的模块包括视频截图、视频编辑、自定义资源加载。

### 🌟 [【WWDC22 10002】利用 Virtualization 构建虚拟机，从未如此简单](https://xiaozhuanlan.com/topic/4132786905)

本文介绍了平台虚拟化技术的方案类型，分析了 macOS 上的虚拟化方案。通过  Virtualization.framework 和基于这个框架的命令行工具，我们一起创建可用的 macOS 虚拟机、Linux 虚拟机（GUI）、Linux（CLI），感受现代虚拟机强大的性能。利用 Virtualization 打造属于专属自己的虚拟机，从未如此简单！

### 🌟 [【WWDC22 110341】短信过滤器原理和更新](https://xiaozhuanlan.com/topic/8021693745)

本文将主要聚焦于 iOS 16 中 `IdentifyLookup` 框架的新特性。全文共分为 3 个部分：
- 第一部分是回顾整个短信过滤 API 的发展。
- 第二部分是对 短信过滤的原理介绍。
- 最后一部分是一个简单的 Demo 示例实践。

### 🌟 [【WWDC22 10049】探索 iOS 16 中 WKWebView 的新功能](https://xiaozhuanlan.com/topic/7295803164)

本文主要是探索 WKWebView 在 iOS 16 中的新功能，全文主要分为 4 部分：
- 第一部分是 对 Web 内容的交互新增了 3 种方式，同时新增了 20 种 CSS 视口单位和查找交互功能。
- 第二部分是新增了对特定 URL 其显示内容拦截的功能。
- 第三部分是 iPadOS 中新增了加密媒体的功能。
- 第四部分是支持在第三方浏览器中调试 App 内嵌的 Web页面。

### 🌟 [【WWDC22 110350】Swift 并发的可视化和优化](https://xiaozhuanlan.com/topic/0186237549)

本文主要是讨论 Swift 并发代码的优化，并介绍了一个 Instrument 14 提供的一个可视化工具。session 的内容可以分为 3 个部分: 
- 一、回顾 Swift 并发代码基础
- 二、结合代码片段展示如何用 Instrument 来解决性能问题，包括 Main Actor 阻塞 和 Actor 竞争
- 三、最后讨论了一些 Swift 并发的潜在问题包括线程池耗竭和续体误用

### 🌟 [【WWDC22 110354】Swift 新特性介绍](https://xiaozhuanlan.com/topic/2498765013)

Swift 一直致力于让编程变得更简单，并以此为目标不断地进行迭代。本文将对 Swift 5.7 的新特性进行介绍，主要分为以下五个部分：
- 1. 社区最新动态
- 2. Swift Package Manager 插件
- 3. Swift 底层性能优化
- 4. Swift 并发模型
- 5. Swift 语言优化

### 🌟 [【WWDC22 10065】即插即用：将 Apple frameworks 添加到您的 Unity 游戏项目](https://xiaozhuanlan.com/topic/2583470691)

本文将帮助开发者如何在 Unity 应用或游戏中快速集成 Apple 的一些原生功能插件，以提升作品的体验。本次 WWDC ， Apple 为我们带来了六个基于 Unity 版本的插件：Apple.Core、Game Center、Game Controller、Accessibility、Core Haptics 和 PHASE。我们将分别介绍它们的功能，以及如何快速编译、导入到开发者的项目中。文末，还给出了使用这些插件的一些场景以及注意点。

### 🌟 [【WWDC22 110336】 Screen Time API 的新特性](https://xiaozhuanlan.com/topic/7169340528)

本文将介绍 Screen Time API 在 iOS 16 的新特性以及基于此可以实现的功能。全文分为三个部分：
- 1. 回顾 iOS 15 中 Screen Time API 特性
- 2. Screen Time API 在 iOS 16 的新特性介绍
- 3. Screen Time API 新特性的实践

### 🌟 [【WWDC22 10115/10119】优化 CoreData & CloudKit 实现](https://xiaozhuanlan.com/topic/5821964073)

本文将结合开发者个人项目案例，旨在通过单元测试、Instruments、日志收集三方面，覆盖开发流程的三个重要方面：探索、分析与反馈，帮助开发者优化实现方案实现，做出更好的产品。同时了解到 CloudKit 的同步流程与相关系统服务。

### 🌟 [【WWDC22 10040】 探索 In-App Purchase 集成和迁移](https://xiaozhuanlan.com/topic/8024563197)

本文主要聚焦于 App Store Server API 和 App Store Server Notifications。从去年 WWDC21 苹果推出了 StoreKit v2、App Store Server API v1 和 App Store Server Notifications v2，今年 WWDC22 基于这些功能的基础上，增加了一些新的 API 和一些服务的优化。另外，针对大家对这些新特性有一些疑虑，如 JWT/JWS、兼容性、安全性、订阅通知、集成和迁移等等，苹果进行了详细的解答，还提供非常多的最佳实践的案例和优化建议。

## 摸鱼周报

[@摸鱼周报 #57](https://mp.weixin.qq.com/s/e4ZbFBPqclgy7KyfxVyQZA)：第 57 期摸鱼周报来了，这期排版做了一些改动，一起来看下本期概要：

* 本期话题：WWDC22 讲座集锦，Apple 夏令营课程回归
* 本周学习：Xcode Playground Tips
* 内容推荐：苹果开发者大会落幕，介绍一些 WWDC22 推出的新技术和新内容
* 摸一下鱼：Apple Logo Artwork，收录苹果独特多彩风格的媒体版本 Logo

## 内推

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