# 老司机 iOS 周报 #212 | 2022-08-08

![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)

> 上周一共更新了 12 篇文章，目前总共已经更新了 86 篇，每篇质量都非常高，由于篇幅问题，开头先推荐 3 篇可能大家更感兴趣的，其他的放到周报最后了~

### 🌟 [【WWDC22 110352/110353】拥抱 Swift 泛型](https://xiaozhuanlan.com/topic/7651204893)

本文主要介绍 Swift 5.7 中关于泛型新增的语言特性。通过一个示例程序与你探讨泛型的使用场景与协议的接口设计，帮助你理解 some 与 any 修饰符在泛型中的使用。

### 🌟 [【WWDC22 10068】UIKit 新特性](https://xiaozhuanlan.com/topic/3805624917)

UIKit 作为 iOS 开发过程中非常核心的一个 framework，每年的更新换代都会对其做出一些升级和调整。只不过以往更多是针对单独的改动出独立的 session，没有专门出一个 session 成去体系地介绍 UIKit 里的改动。自从 WWDC 2021 开始，第一次系统地介绍了 What's new in UIKit ，主要围绕的方面包括针对生产效率提升的改动，UI 改动及 API 的改动等等。今年沿用了去年的思路，继续围绕这几个方面展开介绍。这个 session 虽然没有办法展开介绍所有的 UIKit 改动的技术细节，但它会把 UIKit 新特性里最重要的部分归纳到一起，起到提纲挈领的作用，让大家对 UIKit 的变动有一个整体的了解。文中会附有一些 session 的链接以及苹果的官方文档，方便读者了解其更进一步的改动细节。

### 🌟 [【WWDC22 10136/10137/110340/110342】Swift Charts 高效图表的实现与优质图表设计要素](https://xiaozhuanlan.com/topic/2164358790)

本文将会基于各种实例和 Swift Charts API 实现从简单到复杂的图表；同时了解一些优质图表的设计体验要素；相信会对计划在桌面小组件场景应用 SwiftUI ，提供一些图表绘制的帮助和指南。

## 文章

### [Switching between SwiftUI’s HStack and VStack](https://www.swiftbysundell.com/articles/switching-between-swiftui-hstack-vstack/)

[@zvving](https://github.com/zvving)：`HStack`、`VStack` 是 SwiftUI 基础的布局工具，在涉及设备横屏竖屏切换时，我们也会期望布局在 `HStack`-`VStack` 间动态转换。

`GeometryReader` 看似是可行的方案之一：通过计算容器宽高来选择布局方式，但同时也会带来布局细节及（横竖屏切换时的）动画问题。本文介绍如何使用 `Size classes` 和 iOS16 引入的 `AnyLayout`、`ViewThatFits` 更好地解决类似问题。

### 🐎 [使用 deno_core 开发一个 JavaScript 运行时](https://mp.weixin.qq.com/s/CLYFgEKnjPufoE07wKnzdQ)

[@Smallfly](https://github.com/iostalks)：本文介绍如何创建一个自定义 JavaScript 运行时 runjs，可以把它近似为简易版的 Deno。目标是开发一个命令行程序，实现执行本地的 JavaScript 文件，可以读文件、写文件、删文件，以及一个 console API。

### 🐢 [tcmalloc 源码解析](https://dirtysalt.github.io/html/tcmalloc.html)

[@xuyafei](https://github.com/xiaofei86)：tcmalloc 是 Google 开发的内存分配器，在 Golang、Chrome 中都有使用该分配器进行内存分配。其有效地优化了 ptmalloc 中存在的问题，当然为此也付出了一些代价。感兴趣可以阅读原文了解 tcmalloc 的具体实现。

### 🌟 🐎 [可支持动态插入业务元素的混合 MP4 方案 - YYEVA](https://juejin.cn/post/7126797460189478920)

[@JonyFang](https://github.com/JonyFang)：本篇主要介绍 YYEVA 整体框架，YYEVA 是 YY 推出的一款 MP4 支持动态元素的解决方案，包括 AE 插件、在线预览工具、渲染 SDK（支持 iOS、Android、Web），文末附有 YYEVA 开源的地址。YYEVA 框架相关的一些文档介绍：

- [第一篇：直播间礼物动效 - 实现方案](https://github.com/yylive/YYEVA/blob/main/%E7%9B%B4%E6%92%AD%E9%97%B4%E7%A4%BC%E7%89%A9%E5%8A%A8%E6%95%88%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%A1%88.md)
- [第二篇：透明 MP4 礼物](https://github.com/yylive/YYEVA/blob/main/%E9%80%8F%E6%98%8EMP4%E7%A4%BC%E7%89%A9.md)
- [第三篇：变换矩阵在动画上一些应用](https://github.com/yylive/YYEVA/blob/main/%E5%8F%98%E6%8D%A2%E7%9F%A9%E9%98%B5%E5%9C%A8%E5%8A%A8%E7%94%BB%E4%B8%8A%E4%B8%80%E4%BA%9B%E5%BA%94%E7%94%A8.md)
- [第四篇：YYEVA , 让 MP4 静态资源也能够动态起来](https://github.com/yylive/YYEVA/blob/main/YYEVA-%E8%AE%A9MP4%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%E4%B9%9F%E8%83%BD%E5%A4%9F%E5%8A%A8%E6%80%81%E8%B5%B7%E6%9D%A5.md)
- [第五篇：YYEVA 设计规范](https://github.com/yylive/YYEVA/blob/main/YYEVA%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83.md)
- [第六篇：YYEVA 数据结构](https://github.com/yylive/YYEVA/blob/main/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.md)

### 🐕 [一文了解字节跳动“埋点验证平台”](https://mp.weixin.qq.com/s/4SnwKSswo0LJDUg6NoaAQw)

[@Barney](https://github.com/BarneyZhaoooo)：本文主要从宏观视角介绍了字节跳动的埋点验证平台。从多角色、多节点、多方面，全方位保证了埋点质量，值得学习。

介绍大致分为：
- 埋点验证流程
- 技术架构总览
- 产品流程总览
- 技术挑战和结果收益

### 🐕 [解决 Flutter 引起的 iOS 内存崩溃问题](https://juejin.cn/post/7123765829929762847)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 目前主流版本的 Flutter 在 iOS 平台上存在内存问题，但是却不易解决，本文通过两种方案帮助读者解决问题。同时，提供了保姆级魔改 Flutter Engine 的操作流程。小编提醒⚠️ : 该方案不建议小白用户尝试。

### 🌟 iOS 16 UIView/UIViewController 新变化

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：最近在适配 iOS 16 时发现了一个新的异常：``Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Application circumvented Objective-C runtime dealloc initiation for <UIViewController> object.'``

经过 [pudge62](https://github.com/pudge62) 研究，iOS 16 里 UIViewController 多了一个方法叫 ``_objc_initiateDealloc``，内部代码是用来保证 VC 在主线程释放的。 调用链为：
> release - > -[UIViewController _objc_initiateDealloc] -> dispatch_async(_objc_deallocOnMainThreadHelper) -> -[UIViewController dealloc]

以前的系统也有这个机制，看起来是 iOS 16 换了实现方式。而 ``_objc_initiateDealloc`` 这个名字和异常里的 ``dealloc initiation`` 看起来关联很大。

具体原因：工程内有代码覆盖了 UIViewController 的 ``+initialize`` 方法，这样会导致不调用 ``_class_setCustomDeallocInitiation([UIViewController class])``，最终发生崩溃。

解决方案：由于系统 UIView/UIViewController  有了 ``initialize`` 方法，推荐大家不要覆盖 UIViewController 的 ``+initialize`` 方法；如果一定要覆盖 ``+initialize`` 方法，那就要想办法先调用官方的，再调用自己的 ``+initialize`` 方法（不建议这么做）。

> 该具体分析与解决方案由 [pudge62](https://github.com/pudge62) 提供

### 🐢 阿里跨端技术演进

[@kemchenj](https://kemchenj.github.io/)：阿里巴巴的千牛团队为我们带来的跨端技术演进分享，这个系列总共三篇文章：

- [跨全端 SDK 技术演进](https://mp.weixin.qq.com/s/NMsZWEzP3oE-KexRQMesmQ)：伴随业界跨平台技术发展与演进，千牛团队也沉淀了一整套基于 C++ 的跨平台技术体系，本文将以消息 SDK 为例，详述这一技术演进历程。
- [跨桌面端 Web 容器演进](https://mp.weixin.qq.com/s/cAPAHzlChV-TjbAIj4YQ_Q)：从容器的架构演进，容器的功能增强和稳定性保障及未来的演进，这 3 个方面介绍一下千牛的应用程序如何对接浏览器的能力。
- [跨桌面端之组件化实践](https://mp.weixin.qq.com/s/t7apHNc9ZHF__dab1KKwIQ)：主要介绍了千牛 PC 跨端框架中，关于组件化部分的思考、方案选择、遇到的一些问题和解法。

### [iOS 16 Live Activity](https://mp.weixin.qq.com/s/aKD-WBYHsepg96zOC378cg)

[@享耳先森](https://github.com/iblacksun)：WWDC22 Keynote 中介绍了 iOS 16 中一个比较亮眼的更新：Live Activity，开发者可以在锁屏页面上放置一个可以「实时」更新的 Widget，比如外卖或者打车应用，开启 Live Activity 后在锁屏页上实时看到 外卖小哥/司机 与我们的距离及预计到达时间。

这一 API 及对应功能终于在 iOS 16 Beta4 一起放出，但 Apple 明确不会随正式版的 iOS 16.0 一起发布，而是在今年晚些时候释出，具体时间没有给。

本文介绍了 iOS 16 Live Activity 的适配及注意事项，也分享了下开发 / 使用体验，文章最后也提供了一个 Demo 供大家参考，可以与[Experimenting with Live Activities](https://oleb.net/2022/live-activity/) 关联阅读。

## WWDC22 内参更新

### 🌟 [【WWDC22 10058 & 110343】SwiftUI on iPad](https://xiaozhuanlan.com/topic/3145670289)

本文基于 10058 和 110343 两个 Session 的内容梳理，以官方 Places App 为范例，介绍了 SwiftUI 在 iPadOS 16 上的新特性。

### 🌟 [【WWDC22 10142】 通过并发编程更优雅的管理后台任务](https://xiaozhuanlan.com/topic/4708519362)

这篇 session 结合场景和案例，基于 SwiftUI 和 Swift 并发特性来讲解如何以更好的方式来管理异步的后台任务执行流程，并介绍了 URLSession 的后台模式，以更贴合实际的方式来解释后台任务的原理和规则。

### 🌟 [【WWDC22 10066/10101/10104】 探索 Metal3](https://xiaozhuanlan.com/topic/9276153048)

Metal 是 Apple 的高效低销图形计算 API 。它旨在以最快、最高效的方式驱动 Apple 产品背后强大的 GPU。本文介绍了 Metal 3 强大的新功能，包括快速加载资源、离线编译、MetalFX、Mesh Shaders、光线追踪管道、机器学习支持等内容。

### 🌟 [【WWDC22 10079】提高应用程序和服务器的 DNS 安全性](https://xiaozhuanlan.com/topic/4802516793)

本文旨在探索如何确保 DNS 在应用程序中安全使用的最新方法。首先介绍了为什么 DNS 是不安全的，以及如何通过 DNSSEC 和使用 DDR 加密的 DNS 来保护他的安全性。

### 🌟 [【WWDC22 10032】使用新框架实现 Shortcuts](https://xiaozhuanlan.com/topic/7083456912)

使用新框架 AppIntents 来为 App 扩展功能，以支持 Siri 和 Shortcuts app。

### 🌟 [【WWDC22 110367】使用 Concept 简化 C++ 模版](https://xiaozhuanlan.com/topic/6302984517)

本 session 主要介绍了 Xcode14 上新支持的 C++20 中比较有代表性的新特性 concept，并从实际例子出发，使用 concept 对 C++ 的模版代码进行简化，最后还介绍了用于编译时计算的 constexpr 特性。

### 🌟 [【WWDC22 10016】使用 CarPlay 扩展你的 App](https://xiaozhuanlan.com/topic/5913846702)

本文主要是介绍了 iOS 16 中 Carplay 的新特性，包括四个部分：第一部分是对 Carplay 的 UI 渲染方式-模板的讲解。第二部分介绍了新增的两种应用类型以及对应的一些应用。第三部分是讲解了新增的一种 Caplay 测试方式的使用讲解。最后则是介绍了 Carplay 如何和汽车的仪表盘联动。

### 🌟 [【WWDC22 10128】利用现实物体搭建 AR 场景](https://xiaozhuanlan.com/topic/5789132064)

从你手边的现实物体（以及脑海中关于 AR 的 idea），到一个有趣的 AR App，需要经历什么过程？这个 session 也许能给出答案。本文对 Object Capture 进行了回顾，介绍了 ARKit 相机增强可与其结合使用的新 API，并以一个 AR 象棋游戏作为例子，展示了从获取现实物体的 3D 模型到构建 AR 应用的基本工作流。


## 摸鱼周报

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

* 本期话题：Apple 企业家培训营已开放申请
* 本周学习：Swift 当中的 Sequence
* 内容推荐：WWDC22 & SwiftUI 好文推荐
* 摸一下鱼：React 实现的 Win11 在线体验，模拟 Windows 和 x86 系统的网站


## 关注我们

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