# 老司机 iOS 周报 #224 | 2022-11-21

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

## 新闻

### [Swift project in 2023](https://www.swift.org/blog/focus-areas-2023/)

Swift 团队发布明年的开发路线图，今年新增了工作组机制：

- **语言组**：负责编译器和标准库的开发
- **网站组**：管理 swift.org 的网站内容
- **文档组**：负责文档工具的开发
- **C++ 交互组**：提高与 C++ 的可交互性，孵化相关提案

这里节选了一些亮点内容：

- **宏系统**开始进行设计和实现，最快可能明年 WWDC 就能看到
- 添加语法层面的功能让我们可以控制值的**所有权**，减少不必要的拷贝和引用计数
- 优化**编译系统**和编译器的交互逻辑，让编译过程变得可靠
- **编译器一部分使用 Swift 进行重写**

## 文章

### 🐕 [云音乐 iOS 端代码静态检测实践](https://mp.weixin.qq.com/s/5ZcGBCnrUYwUA0RXyPJt9w)
[@水水](https://www.xuyanlan.com/): 随着项目的扩大，依靠纯人工 Code Review 来保障代码质量、防止代码劣化变得”力不从心“。此时有必要借助代码静态分析能力，提升项目可持续发展所需要的自动化水平。针对 C、Objective-C 主流的静态分析开源项目包括：Clang Static Analyzer、Infer、OCLint 等。
本文基于可定制性最强的 OCLint 作为代码静态检测工具，从以下四点介绍了 OCLint 的实践应用过程：

- OCLint 环境部署、编译和分析。
- 自定义规则实现。
- 静态检测耗时优化。
- 利用静态检测能力持续对启动性能防劣化控制。

### 🐕 [三代终端容器 KUN 的首次大考【架构演进】](https://mp.weixin.qq.com/s/26SCEM6QPhAazydRUq9h3Q)
咸鱼自研的 KUN 容器框架，是一套用前端编写代码，用 Flutter 来做渲染，目前已经在闲鱼号上应用。本文同时对 KUN 框架、Weex、WebView 渲染做了对比，KUN 框架在体验、性能等方面均表现不错，同时，KUN 框架对双端渲染一致性问题也做了一定的优化，避免代码中大量 if-else 判断。

### 🐕 [HOME ARTICLES BOOK ABOUT When .animation animates more (or less) than it’ s supposed to](https://oleb.net/2022/animation-modifier-position/)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：SwiftUI 中 animation 修饰符，在 iOS 16/macOS 13 中，其相对于非渲染修饰符的放置与决定是否对更改进行动画处理无关。作者在文中列举了自己测试的所有案例对此进行了说明。

### 🐎 [React 中的重新渲染](https://mp.weixin.qq.com/s/ADx8PuNvg4xVVLBeh265kw)

[@Damien](https://github.com/ZengyiMa/)：本文来自阿里巴巴终端技术团队文章，在客户端动态化方案中，React Native 是一个成熟且高效的解决方案，作为动态方案重中之重就是渲染，想知道 React 的重渲染为何如此高效吗？不妨来深入了解下本篇文章内容，本文会深入源码，为我们一步步揭露面纱。

### 🐎 [Binary Targets in Swift Package Manager](https://www.avanderlee.com/optimization/binary-targets-swift-package-manager/#the-upsides-of-binary-targets)

[@Smallfly](https://github.com/iostalks)：Swift Package Manager(SPM) 是苹果官方的 Swift 源代码管理工具，它负责自动化完成依赖库的下载、编译和链接。以源码的方式集成依赖库，会对集成和编译效率有较大的影响。

Binary Target 让 SPM 支持以二进制产物的方式集成依赖库，能有效节约集成时间，同时也适用于分发闭源库。不足之处是二进制格式不支持调试，而且只支持 XCFramework。

本文详细的介绍了 Binary Target 的优缺点，以及使用方式，最后还介绍了如何构建 XCFramework，以支持 Binary Target。

### 🐕 [Combining opaque return types with primary associated types](https://www.swiftbysundell.com/articles/opaque-return-types-primary-associated-types/)

[@zoeGuo](https://github.com/zoeGuo)：Swift5.7 引入了 Primary associated types 的概念，即可以在协议中使用 associatedtype 声明自定义类型。使用 some 声明包含 Primary associated types 的协议的返回值后，调用者可以不再需要使用强制类型转换和手动类型擦除，并且能够保证完全的类型安全。文章就使用 associatedtype 的优点，以及 associatedtype 结合 some、any 关键字的使用进行示例和介绍。

### 🐕 [Flutter 多引擎渲染，在稿定 App 的实践](https://mp.weixin.qq.com/s/fpbVBg-Usuu7I6lCbPhlsQ)

[@老峰](https://github.com/gesantung)：一直以来  Flutter 社区关于 multiple-flutters Flutter 多引擎实践的参考的资料比较少，本文作者介绍了利用脚本开发了一套 FGUIComponentAPI 工具链来链接 Native 与 Flutter UI，自动生成开发基类、宿主调用类、通信层 API、测试用例、开发文档的实践思路，以及在多引擎实践中踩到的坑。

### 🐕 [Stack unwinding](https://maskray.me/blog/2020-11-08-stack-unwinding#中文版)

[@xuyafei86](https://github.com/xiaofei86)：在 C++ 中抛出异常时，当前函数将暂停执行，通过函数调用栈查找匹配的 catch 子句。如果异常没有在抛出它的函数中被处理，就会退出当前函数，从函数调用栈中删除函数实体并释放栈上的局部变量，继续到调用栈上层查找，直到找到可以处理该异常的 catch，这个过程称为栈展开（stack unwinding）。其主要用于调试器、崩溃报告、垃圾回收器中。本文将带大家简单了解 Stack unwinding 的实现，感兴趣的同学可以阅读原文了解。

## 代码

### 🐕 [GitHub - ole/swiftui-layout-inspector: A tool for learning how the SwiftUI layout system works, and for debugging your own layout code.](https://github.com/ole/swiftui-layout-inspector)

[@Barney](https://github.com/BarneyZhaoooo)：对于学习 SwiftUI 布局的朋友们是一个福音，这款工具可以很好地帮助 debug 布局代码，方便大家学习理解 SwiftUI 布局。

A Swift library (and iOS/Mac app) for learning how the SwiftUI layout system works, and for debugging your own layout code. Inspect the layout behavior of SwiftUI views, i.e. what sizes views propose to their children and how a view determines its own size.

## 音视频

### 🐢 [Standardizing build system using modern Swift Packages in LINE](https://attendees.bizzabo.com/417034/agenda/activity/1022649)

[@kemchenj](https://kemchenj.github.io/)：来自 LINE 的工程师介绍了他们使用 SPM 改造构建系统的过程。随着 LINE iOS 端的迭代，代码行数现在已经增长到了两百万以上，编译速度也就慢慢成为了一个“问题”。

他们自然而然也选择业界流行的方案 Bazel 来解决这个问题，整个构建过程分为两步：

1. 所有依赖库都使用 Bazel 进行打包成二进制库
2. 主工程 App 引用上一步的库，使用 Xcode 进行编译和调试

但使用 Bazel 的同时也带来了一些问题，学习成本高，维护成本高，缺乏依赖管理。付出如此高的代价，但实际带来的编译速度提升还不如 Apple Silicon(M1) 的升级。

最后他们将眼光投向了 SPM，打算直接使用它来替代 Bazel 打包二进制库，同时也为此开发了一个工具 [Scipio](https://github.com/giginet/Scipio)，用于将 Swift Package 打包为 XCFramework，并且自定义了一套缓存策略。

## 摸鱼周报

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

* 本期话题：远程工作在国内的推行为什么困难重重？iPhone 14 / Pro 系列卫星 SOS 紧急求救服务已在美国和加拿大正式推出
* 本周学习：iOS16 中的 3 种新字体宽度样式
* 内容推荐：Ask Apple 2022 十月问答汇总；Swift 以及 SwiftUI 相关的好文推荐
* 摸一下鱼：一个快速学习编程语言或开发工具的网站 Learn X in Y minutes、B 站 up 主开源的一套免费商用的字体得意黑、一个 SwiftUI 开发的开源单词游戏项目、Google 推出的能够模拟面试的网站

## 内推

重新开始更新「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）
