# 老司机 iOS 周报 #230 | 2023-01-16

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

## 新闻

### [Design Priorities for the Swift 6 Language Mode](https://forums.swift.org/t/design-priorities-for-the-swift-6-language-mode/62408)

[@kemchenj](https://kemchenj.github.io)：Swift 5 发布到现在已经快要五年了，Swift 6 预计最快明年就会发布，此前关于 Swift 6 的开发计划也曾在周报里收录过，这次 Swift 团队又发布了另一份关于功能开发优先级的声明，包括：

- **Data-race safety by default**。Sendable 和 actor-isolated 检查将会默认以最严格的级别执行。
- **Performance predictability**。大概率会有 source-break 的修改，以便提高运行速度和编译速度，另外也有一部分编译器 bug 需要调整语义才能够修复。
- **Package ecosystem scalability**。

虽然 Swift 6 会有 source-break，但这个版本也会提供源码兼容模式，可以用 Swift 5 的模式进行编译，所以大家也不用过多担心。

## 新手推荐

### 🐕 [iPad大屏&Flutter多引擎适配之路](https://mp.weixin.qq.com/s/lgW6nOzz3dyA_smxRD-9Pw)

[@极速男孩](https://github.com/BarneyZhaoooo): 本文介绍了在大屏中如何适配分屏的几种方式，并简单介绍了在 Flutter 中如何通过修改 c++ 层的代码，实现一个多引擎的方案既能同时显示两个视图，也能让 isolate 以及图片字体等资源实现共享。

## 文章

### 🐢 [Swift Native method swizzling](https://www.guardsquare.com/blog/swift-native-method-swizzling)

[@Cooper Chen](https://github.com/cjlcooper)：本文对 Swift 原生的方法交换的原理进行了分析。其中 Swift 的运行时将动态函数分派的责任从调用者转移到被调用者。Swift 在进行方法交换时，使用全局数据结构取代了对中间 objc_msgSend 函数的需要，这种设计保证了动态函数更好的运行时性能，并且对没有使用此功能的代码没有性能影响。随着新的动态特性的加入，Swift 和 Objective-C 之间的差距变得更小。

### [iOS APP添加桌面快捷方式](https://mp.weixin.qq.com/s/z_CfthCni7m1mKtM0KzH6g)

[@JonyFang](https://github.com/jonyfang): 诉求：APP 内的某些功能，能够把入口添加到桌面，点击桌面的入口可以直接跳转至 APP 对应界面。其实很多APP目前都已经实现了类似的功能，比如支付宝、云闪付等等，其中的每一个独立功能都可以单独添加到桌面，本篇做的是方案调研、整理及试错，有类似诉求的读者可以参考下。

### 🐕 [Rive · GitHub](https://github.com/rive-app)

[@Barney](https://github.com/BarneyZhaoooo): Rive 是一款全平台轻量级动画库，官网描述比 Lottie 体积小 10 倍，运行更快。这又小又快的 Rive 还不快来试一试~

### 🐎 [Limit Swift Concurrency's cooperative pool](https://alejandromp.com/blog/limit-swift-concurrency-cooperative-pool/)

[@EyreFree](https://github.com/EyreFree): 本文介绍了如何通过设置和修改环境变量 `LIBDISPATCH_COOPERATIVE_POOL_STRICT` 来调整并发线程数，可以强制 Swift 运行时将协作池限制为特定数量个线程，对于某些调试情况和学习目的很有用，有需要的朋友可以看看。

### 🐕 [Swift Concurrency – Things They Don’t Tell You](https://wojciechkulik.pl/ios/swift-concurrency-things-they-dont-tell-you)

[@zvving](https://github.com/zvving)：Swift Concurrency 宣称为并发编程带来安全性的同时，也带来性能提升和更易读易维护的代码表达，避免数据竞争/线程爆炸/代码难以维护等一系列问题。在理想情况下（比如规避如下所有问题的情况下），的确可以达到『卖家秀』的效果：

- 主线程调用 async / Task 不能假设执行是在特定（主）线程，包括同一函数的挂起/恢复，前后线程也不一定一致
- Swift 并发模型应避免与经典同步方法（锁、信号量等）混合使用
- Actor 不意味着不存在数据竞争
- Task 需要管理优先级比避免 UI 任务阻塞
- 模拟器与真机并发行为不一致

作者整理了 Swift Concurrency 使用的典型问题，通过这些问题的理解&规避，可以帮助你更好的使用苹果提供的并发编程模型。

### 🐕 [How to build a Chrome extension with Flutter Web](https://medium.com/flutter-community/how-to-build-a-chrome-extension-with-flutter-web-6518f9845171)

[@Crazy](https://github.com/jiyan135960)：本文是一篇关于 Flutter Web 在 Chrome 插件领域的一种运用，这是对 Flutter 应用场景的一种新的拓展。本文详细的阐述了从配置 manifest.json 到最后构建 pipeline 发布到 Chrome Web Store 的全部流程。大家可以根据文章中的图文讲解自己进行实践，创建一个属于自己的 Chrome 插件。

## 工具

### 🐎 [Managing multiple versions of Swift locally](https://www.polpiella.dev/managing-multiple-swift-versions-locally)

[@zoeGuo](https://github.com/zoeGuo)：我们的本地的可能会有多个 Swift 版本：可能有 Swift 发布的正式版本、 Swift Development Snapshots，还有可能有为其他架构而下载版本（比如 [WebAssembly](https://github.com/swiftwasm/swift/releases/tag/swift-wasm-5.7.1-RELEASE)）。那么当本地有多个 Swift 版本时用什么工具管理呢？文章介绍了两种工具和他们简单的用法：
1. 使用 [Xcode ToolChains 功能](https://www.swift.org/download/#snapshots)可以切换或者删除相应 Swift 版本；
2. 使用命令行工具 [swiftenv](https://github.com/kylef/swiftenv) 可以安装、删除还可以指定 Swift 版本的作用域为全局或者某个目录下。

关于这两种方式的更多解释和用法可以到对应官网进行深入了解。

## 代码

### [swift-dependencies](https://github.com/pointfreeco/swift-dependencies)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：这是一个灵感来自于 SwiftUI 环境启发的依赖管理库。依赖项是应用程序中与不受控制的外部系统交互的类型和功能，这可能会在你的代码库和开发周期中导致许多问题：
- 不受控制的依赖性使得编写快速、确定性的测试变得困难
- 许多依赖项在 SwiftUI 预览中无法正常工作
- 与第三方、非 Apple 库（如 Firebase、web socket 库、网络库等）交互的依赖项往往是重量级的，需要很长时间才能编译

由于这些以及更多原因，我们应该控制依赖项，但是控制依赖项仅仅是个开始，一旦控制了依赖关系，就会面临一整套新问题：
- 如何才能以一种比在任何地方显式传递它们更符合人体工程学但又比拥有全局依赖性更安全的方式在整个应用程序中传播依赖性
- 如何只覆盖应用程序的一部分的依赖项
- 怎么能确定覆盖了一个功能在测试中使用的所有依赖项

这个库解决了上述所有问题，可以通过[查看文档](https://pointfreeco.github.io/swift-dependencies/main/documentation/dependencies/)来探索这个库附带的所有工具。

## 摸鱼周报

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

* 本期话题： Developer 设计开发加速器｜探索 iPad 最新技术，Apple 推出 Apple Business Connect
* 本周学习：基础知识回顾：iOS 中的 const 修饰符
* 内容推荐：本期将推荐近期的一些优秀博文，涵盖如何保护剪切板内容、SwiftUI 的视图风格、iOS 应用启动优化等方面的内容
* 摸一下鱼：基于 MarkDown 的写作工具以及一文多发的工具 openwrite；从 TimeMachine 中移除开发依赖包的工具 Asimov；查看个人 Github 全年使用趋势的 Github Trends；一份开源软件使用指南；AI 辅助 Code reivew 的工具。

## 内推

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