# 老司机 iOS 周报 #229 | 2023-01-09

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

**周报编辑组又来新人啦～欢迎慕牧（zoeGuo）加入周报组织。慕牧从事 iOS 开发多年，目前在做音视频、直播相关业务场景的开发，除了音视频相关的知识外，对 App 卡顿、稳定性也比较感兴趣。希望慕牧的加入也能为大家带来更多元化的内容输出！**

## 新闻

### [AppCode 2022.3 发布以及停止销售和支持](https://blog.jetbrains.com/zh-hans/appcode/2022/12/appcode-2022-3-release-and-end-of-sales-and-support/)

[@红纸](https://github.com/nianran)：AppCode 是一款由 JetBrains 推出了 iOS 和 macOS 应用开发 IDE。由于没有达到官方希望的市场份额，官方近日宣布，在 AppCode v2022.3 发布后，将停用该产品。在 2023 年 12 月 31 日之前，官方将继续提供专门解决 Xcode 14 兼容性问题的技术支持和版本更新，以及必要的关键安全更新，更新的范围将仅限于这两个领域。

### [Flutter 深度用户，字节跳动如何落地实践？](https://mp.weixin.qq.com/s/s_91C-nSe3grUxOfKCvOJg)

2023 年 1 月 14 日下午 2 点，字节跳动技术沙龙将作《深度解析 Flutter 技术探索与实践》主题分享，带来包括新一代渲染引擎 Impeller、Android 系统渲染线程 GLFunctor 的应用以及 HappinessX 开发套件强大功能等多个分享。此外，阿里集团 aliflutter 组织 Hummer 引擎技术专家也将作为特邀嘉宾带来精彩分享。对 Flutter 感兴趣的同学切勿错过！

## 文章

### 🌟 🐕 [合集：SwiftUI 与 Core Data](https://www.fatbobman.com/tags/swiftui/)

[@JonyFang](https://github.com/jonyfang): 合集共分4篇，依次介绍 SwiftUI 与 Core Data 的问题、数据定义、数据获取及安全地响应数据。

1. 第一篇 - [SwiftUI 与 Core Data -- 问题](https://www.fatbobman.com/posts/modern-Core-Data-Problem/): 列举了一些在 SwiftUI 中使用 Core Data 所遇到的困惑及期许。
2. 第二篇 - [SwiftUI 与 Core Data -- 数据定义](https://www.fatbobman.com/posts/modern-Core-Data-Data-definition/): 从数据（ 对应 Core Data 的实体、属性 ）的定义谈起，尝试通过泛型、类型擦除等方式从定义中移除托管环境。
3. 第三篇 - [SwiftUI 与 Core Data -- 数据获取](https://www.fatbobman.com/posts/modern-Core-Data-fetcher/): 介绍如何在视图从 Core Data 中获取数据的操作这一过程中实现与托管环境解耦，创建一个可以接受 Mock 数据的自定义 FetchRequest 类型。
4. 第四篇 - [SwiftUI 与 Core Data -- 安全地响应数据](https://www.fatbobman.com/posts/modern-Core-Data-Respond-Data-safely/): 探讨如何在 SwiftUI 中安全地响应数据，如何避免因为数据意外丢失而导致的行为异常以及应用崩溃。

### 🐢 [Using C++ from Swift](https://github.com/zoecarver/swift/blob/docs/interop-roadmap/docs/CppInteroperability/ForwardVision.md)

[@AidenRao](https://weibo.com/AidenRao)：目前要在 Swift 中使用 C++ API，必须封装在 C 或 Objecive-C 桥接层中。这些桥接层通常是错误、性能问题和表达能力限制的根源，允许 Swift 直接使用 C++ API 将可以删除这些桥接层。

本文档阐述了 C++ 和 Swift 互操作性的开发愿景草图，它设定了推动项目设计决策的总体目标，概述了一些与 C++ 互操作性相关的高级主题，最后研究了一组特定的 API 模式，并为编译器导入它们提出了可能的方法。

### 🐎 [Prototyping SwiftUI interfaces with OpenAI's ChatGPT](https://www.createwithswift.com/prototyping-swiftui-interfaces-with-openais-chatgpt/)

[@Cooper Chen](https://github.com/cjlcooper)：本文介绍了最近很火的 ChatGPT 可以根据给定的提示生成对应的可使用的 SwiftUI 代码。例如在文章中，用户要求 ChatGPT 创建一个显示所有心形表情的列表和表情的名称的 SwiftUI 应用程序，ChatGPT 能够快速地生成其实现代码。通过 ChatGPT 生成可用的 SwiftUI 代码，可以进行快速原型化或为复杂的界面生成代码，对于开发人员来说是一个比较有用的工具。

### 🐎 [一种大幅提升iOS In-App Purchases 内购测试效率的方法](https://juejin.cn/post/7173942907890565151)

[@Smallfly](https://github.com/iostalks)：大部分 App 都包含内购项，iPhone App 虚拟支付，只允许走 In-App Purchase。苹果推荐使用 TestFlight 包进行内购测试，然而生成该内购包流程需要经过构建上传机审等等，测试成本非常高。本文推荐了一种企业包重签名的方式，将生成内购测试包控制在 30s 内，大幅度提高内购测试效率。

### 🐕 [一文读懂 Xcode 代码索引原理](https://cloud.tencent.com/developer/article/2204613)

[@J_Knight_](https://github.com/knightsj)：本文介绍了 Xcode 代码索引的工作原理：SourceKit 与 Xcode 通过 XPC 通信生成 Index Store；同时也解析了 Index Store 的构成（包括 DataStore 和 UniDB）。然后分享了一种跨设备共享代码索引的方案，在企微落地后优化了90%的全量索引耗时。

### 🐕 [Announcing Lottie 4.0 for iOS. A new rendering engine with significant… | by Cal Stephens | The Airbnb Tech Blog | Dec, 2022 | Medium](https://medium.com/airbnb-engineering/announcing-lottie-4-0-for-ios-d4d226862a54)

[@Barney](https://github.com/BarneyZhaoooo)  : 本文主要介绍了 Lottie 4.0  for iOS 那些令人振奋的改变！
简单总结如下：
1、使用 Core Animation 使性能进一步提升，不再因主线程繁忙而丢帧。
2、支持 [dotLottie 动画文件](https://dotlottie.io/) ，其大小比标准 JSON 文件小得多。
3、新的动画解码实现，比之前基于 *Codable* 的实现快约 2 倍。

### 🐢 [How to manage your Flutter monorepos](https://medium.com/flutter-community/how-to-manage-your-flutter-monorepos-b307cdc9399a)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：源码管理在大型项目上历来都是一个老大难，近年来比较流行的一个解决方案便是 `Monorepos` 。本文即是阐述如何在 Flutter 项目上实施 `Monorepos` ，手把手级别的教程，并且对该方案做了优劣对比，有相关难题亟待解决的同学可以参考学习一下。

### 🐕 [Faster Apple Builds with the lld Linker](https://eisel.me/lld#integrating-lld)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：链接是增量构建的主要瓶颈之一，每年有成千上万的开发人员时间花在等待调试构建链接上，因此链接器优化是一个重要主题。这篇博文将讨论 Apple 平台链接器优化的过去、现在和未来。其中 lld 是更快链接 iOS、macOS 等调试二进制文件的绝佳选择，它的完成时间是 ld64 的 50-80%，不过虽然谷歌将它用于生产构建，但作者认为 lld 目前并不适用于发布版本，lld 缺失 ld64 的某些功能，例如 ld64 的链式修复尚未针对 lld 进行充分测试，不过很明确的是链接速度现在正在获得应有的关注。

### 🐕 [头条稳定性治理：ARC 环境中对 Objective-C 对象赋值的 Crash 隐患](https://mp.weixin.qq.com/s/chR42Vq4kACIEJBDYlbddg)

[@xuyafei86](https://github.com/xiaofei86)：ARC 环境下在多线程中执行赋值代码可能会产生野指针，导致 EXC_BAD_ACCESS 崩溃。这种崩溃发生的概率很低，在开发和灰度阶段即使执行到相应代码也很难崩溃，因此容易遗漏到正式环境。在上亿级用户的 App 往往会成为 Top 问题，对指标造成影响，并且很难排查。
今日头条在治理 Crash 的过程中彻底解决了数十个此类崩溃，发现其具有一定共性。本文详细分析崩溃发生的过程，以及总结了容易出现问题的场景，希望在大家遇到此类问题时能提供一些思路。

### 🐕 [Static vs Dynamic Frameworks on iOS — a discussion with ChatGPT](https://www.emergetools.com/blog/posts/static-vs-dynamic-frameworks-ios-discussion-chat-gpt)

[@老驴](https://weibo.com/u/6090610445)：这段时间 ChatGPT 挺火，很多人开始思考 AI 是不是真的已经到了可以替代人类完成一些技术类型的编码工作了。这篇文章用 ChatGPT 作为引子，给读者介绍了 iOS 开发中静态库和动态库从工作原理到性能影响的区别，介绍的非常深入，值得一度。不过最后，从 ChatGPT 的不完善的回答中，还是能看出现阶段 AI 还是有其一定局限性，还不能完全替代人类在编程上的作用。

### 🐕 [Swift 正则速查手册](https://onevcat.com/2022/11/swift-regex/)

[@zoeGuo](https://github.com/zoeGuo)：Swift 5.7 中引入了正则表达式的语法支持，笔者在文章开头提出：“构建一个正则表达式的方式，分为传统的正则字面量构建，以及通过 Regex Builder DSL 的更加易读的方式。后者可以内嵌使用前者，以及其他一些已有的 parser，在可读性和功能上要强力很多。”文中就常见字面量、Builder DSL、常用 Parser、匹配方式进行了示例和解释；文末还对 Swift Regex 优缺点进行了总结。对 Swift 正则表达式的使用有疑惑的读者也许可以从文中寻找到答案。

## 音视频

### 🐢 [2022 LLVM Dev Mtg: Implementing Language Support for ABI-Stable Software Evolution in Swift and LLVM](https://www.youtube.com/watch?v=MgPBetJWkmc)

[@kemchenj](https://kemchenj.github.io)：今年的 LLVM 大会苹果工程师 Doug 分享了 Swift 实现 ABI Stability 的过程和细节，整个演讲思路清晰，层层深入讲得非常简单易懂，让我感受到了高级开发工程师的深厚功力，其中让我印象最深的是关于 Resilience Domain 这个抽象的引入。

实现 ABI 稳定需要付出一些额外的性能成本，因为不同版本的库，对于同一个结构体可能有不同的实现，例如新版本增加了字段，导致内存布局产生了变化，此时为了抹平这些实现的 ABI 差异，就需要引入额外中间层，一般来说这种性能消耗不会太大。

但对于 iOS/macOS 来说，引入了 Swift 的所有 SDK 都需要保持 ABI 稳定，大量的 SDK 互相调用时中间层带来的性能消耗就变得非常大。仔细想想其实它们之间互相调用时并不需要中间层进行转发，因为它们是一起编译出来的，它们的 ABI 对于同一版本的其它 SDK 来说是确定的。

Swift 将这样的一个“作用域”抽象为 **Resilience Domain**，处于同一个 domain 里的库互相调用的代码不会经过中间层的转发，指定好 Domain 之后 Swift 编译器就会自动为你处理好这一切，在保证 ABI 稳定的同时又尽可能地减少性能消耗，真的是非常棒的一个设计！

## 摸鱼周报

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

* 本期话题： Developer 设计开发加速器｜在 SwiftUI 中管理数据模型
* 本周学习：iOS 堆栈调用理论回顾
* 内容推荐：SwiftUI 文章推荐
* 摸一下鱼：一款个人知识管理工具 MindForger，通过渲染高质量的图像、视频和动画展示数学之美；LearnGPT 了解 ChatGPT 有趣的回答；洞悉开源趋势的网站：ossinsight.io

## 内推

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