# 老司机 iOS 周报 #201 | 2022-05-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) 提出。

## 新闻

### [阐明 App Store 改善流程的标准和新的限期延长](https://developer.apple.com/cn/news/?id=gi6npkmf)

过去几年，苹果为了保证贯彻在安全和隐私方面的最新改革，陆续下架了 280 万个 App。同时还强调了，在过去三年内从未更新且未达到最低下载量 (即该 App 在连续 12 个月内完全没有或只有极低的下载量) 时，其开发者将会收到电子邮件，告知该 App 已被识别并可能从 App Store 中被移除。具体细节请参照：[App Store 改善的支持页面](https://developer.apple.com/cn/support/app-store-improvements/)

### [SSWG 2021 Annual Update](https://www.swift.org/blog/sswg-update/)

Swift 服务端工作组发布了 2021 年的工作总结：

- Swift Concurrency：社区的各个 HTTP 框架的客户端现在都已经添加了 async/await 接口
- 工具链：
  - 发布了 RPM/Deb 包
  - 发布了 Swift for VSCode 插件
  - 发布了 Setup Swift 的 GitHub Action
  - 加强了对于 ARM Linux 的支持
- 文档：工作组为旗下的项目补充了大量的文档
- 生态：
  - [SwiftMetrics](http://github.com/apple/swift-metrics)，[gRPC Swift](https://github.com/grpc/grpc-swift) 项目完成了孵化
  - [SwiftStatsdClient](https://github.com/apple/swift-statsd-client)，[SwiftPrometheus](https://github.com/MrLotU/SwiftPrometheus)，[MongoSwift](https://github.com/mongodb/mongo-swift-driver)，[Swift Service Lifecycle](https://github.com/swift-server/swift-service-lifecycle)，[Soto for AWS](https://github.com/soto-project/soto) 陆续进入孵化阶段

以及 2022 年的目标：

- 继续扩大生态圈
- 继续加强 Concurrency 的支持
- 拓展工具链
- 缩短编译构建时间
- 提升 Swift 服务端的使用率

##  Developer - 设计开发加速器

### [电商购物类 App 专场：为你的电商购物 App 提升体验](https://developer.apple.com/cn/accelerator/)

2022 年 5 月 10 日至 11 日（报名截止 5 月 09 日）

此活动将全面讲述 Apple 的相关最新技术在电商和购物领域不同使用场景中的最佳实施性，以及推荐的设计理念等，同时，也希望和行业从业者一起探讨目前遇到的问题、机遇和挑战。

### [案例学习：为 iPad 设计卓越的 App](https://developer.apple.com/cn/accelerator/)

2022 年 5 月 12 日（报名截止 5 月 11 日）

通过理论讲座与案例分析，学习如何充分利用 iPad 的大屏幕提供更高效的导航机制和更有效的设计模式，如何利用 iPad 多样的输入能力提供更加丰富的交互方式，以及如何面向全新的超大尺寸小组件进行设计。

![156925166-f0e9ae02-0d06-4806-aa19-e84d84e2fd1f](https://user-images.githubusercontent.com/11873526/162620205-0cddfae9-05e0-4e10-9359-4d914e3ae08b.jpeg)

## 文章

### 🐢 [iOS StoreKit 2 新特性解析](https://mp.weixin.qq.com/s/RrkK5M3qYTs2cMi7sWTqrA)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：StoreKit 2 距离发布已经快一年了，本文对整体的 Client/Server API 使用、抉择升级与否等问题，做出了完整的介绍与阐述。适合有内购开发需求的同学阅读。

### 🐕  [Mutex vs Semaphore: What’s the Difference?](https://www.guru99.com/mutex-vs-semaphore.html)

[@Damien](https://github.com/ZengyiMa)：在多线程我们常用互斥锁和信号量来保证线程安全，在本文中会基于：

* 什么是互斥锁？
* 信号量的使用
* 互斥锁的使用
* 信号量与互斥锁之间的区别
* 关于互斥锁和信号量的常见误解
* 信号量的优点
* 互斥锁的优点
* 信号量的缺点
* 互斥锁的缺点

几个角度来带读者深入理解互斥锁和信号量。对于 iOS 开发者来说，值得一读。

### 🐕 [淘宝小程序体验优化：数据分析和优化实践](https://mp.weixin.qq.com/s/eIeOncrNd_h8-7E8fg4bKg)

[@Barney](https://github.com/BarneyZhaoooo): 本文介绍了淘宝小程序的体验优化，重点介绍了指标的定义和数据实践的探索，并且取得了不错的业务效果。

- 写在前面：如何定义好的体验
- 数据采集
- 数据分析和优化实践
- 工具和平台
- 数据效果

### 🐕 [Flutter PlatformView 优化](https://mp.weixin.qq.com/s/gJXk56yJ5oJREHCUbsdhXg)

[@邦Ben](https://github.com/linwenbang): UC 的 U4 内核团队针对 Flutter 上的 PlatformView 做了深入的研究，并且做了一下优化 PR（部分合入到官方中），主要是针对 Android 的场景，目前官方提供的 Virtual displays 和 Hybrid composition 都存在一些问题，Virtual displays 存在功能性问题，Hybrid composition 存在因为线程合并带来的性能问题，以及死锁风险，且在 Android Q 以下因为内存拷贝导致性能变差。在之前的 Hummer 引擎中实现了挖洞模式，并且通过移植 Roger 大神在 U4 浏览器内核中实现的 Embed Surface 方案，来进一步优化。并且 Embed Surface 方案被合入到主线，后续会逐渐弃用 Hybrid composition。因此可以期待最新的 release 版本。

最终得到的结论：

- 「挖洞模式」的性能仍然是最好的。在挖洞模式能满足的场景下，请考虑优先使用挖洞；
- Embed Surface 除了仅支持 Android 6.0 及以上外，没有明显短板，其帧率在大多数场景下可以与挖洞模式持平；
- 从测试数据看，不合并线程的 HybridComposition 的帧率波动比较大，并不比 Embed Surface 有优势。另外，因为不能完全避免 Android Q 以下的内存拷贝，同时还需要处理部分场景下的同步问题，所以我们不会继续优化该方案。

参考：
[Hummer 引擎优化系列](https://mp.weixin.qq.com/s?__biz=MzUzMjk2ODM1MA==&mid=2247484736&idx=1&sn=c080c85e8eab7152eccc599170613770&chksm=faaa63b1cdddeaa782aee05d96d733623cb4d52f26670b41ab2e9dbf63301aee4995c070fe00&scene=178&cur_album_id=2315269790401298433#rd)


### 🐎 [AVPlayer 播放器对远端缺失 Content-Range 功能的本地支持和处理](https://bbs.noahark.io/t/topic/312)

[@JonyFang](https://github.com/JonyFang): 通常来说 H264/HEVC 编码可以通过 AVPlayer 直接播放，但是相对弱些的后台路由，在定位文件的时候并不支持 Content-Range 和系列相关报头，则会导致无法播放。本篇主要针对这类 case，通过 WebServer 的方式来解决该类问题。

### 🐕 [Binary targets in modern Swift packages](https://www.polpiella.dev/binary-targets-in-modern-swift-packages)

[@AidenRao](https://weibo.com/AidenRao)：本文总结了 2022 年在 Swift 包中使用二进制文件的最佳实践：

- 如果你需要为 iOS/macOS 项目添加预编译库或可执行文件，你应该使用 XCFramework, 并为 iOS 设备、macOS 设备和 iOS 模拟器包含单独的二进制文件。
    
- 如果你需要创建一个插件并运行一个可执行文件，你应该将其嵌入为一个 Artifact Bundles，其中包含适用于不同支持架构的二进制文件。

### 🐢 [Flutter 新一代图形渲染器 Impeller](https://mp.weixin.qq.com/s/PLvlSt3tlX6AjufDm0XVMA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter在2022年的Roadmap中提出需要重新考虑着色器的使用方式，计划重写图像渲染后端。最近该渲染后端 Impeller（叶轮）初见端倪，[本文](https://mp.weixin.qq.com/s/PLvlSt3tlX6AjufDm0XVMA)就从 Flutter 图形渲染优化历史讲起，一步步带你了解 Flutter 下图形渲染的优化，以及最新开发中的 Impeller ，详细带你了解 Impeller 的方方面面

### 🐢[Locking in WebKit](https://webkit.org/blog/6161/locking-in-webkit/)

[@水水](https://www.xuyanlan.com/)：WebKit 团队在 2015 年 8 月用新的 WTF::Lock（WWeb Template Framework）替换了WebKit中所有的自旋锁和操作系统提供的互斥锁，统一了 Lock 的实现，与操作系统提供的锁（如pthread_mutex）相比，WTF::Lock 小64倍、快180倍。与操作系统提供的 pthread_cond 等条件变量相比，WTF::condition 要小64倍。本文首先介绍了一些关于锁的背景知识，重点介绍了如何构建 WTF::Lock 和 WTF::Condition。

### 🐎 [macOS 进化史](https://mp.weixin.qq.com/s/7ozZfNQTNK_Ibpfv1Wo7-g)

[@红纸](https://github.com/nianran)：作为 iOS 的开发人员，我们每天都在使用着 macOS，你对这个系统的历史了解有多少呢？本文将带你了解 macOS 的发展历史，从早期系统不成熟的 Mac OS Classic 到融合优秀特性 NeXTSTEP 后成为 MacOSX。了解 Darwin、XNU、Mach、BSD 的基础概念以及其之间联系、Darwin 的开源之路。

### 🐕 [Use Dependency Injection to Unit Test a ViewModel in Swift](https://swdevnotes.com/swift/2022/use-dependency-injection-to-unit-test-a-viewmodel-in-swift/)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：依赖注入是一种将一个或多个依赖对象传递给另一个对象的技术。本文将基于 Weather App 在初始化时将天气服务传递给天气 ViewModel。这将允许使用模拟天气服务在单元测试中测试 ViewModel，而无需访问 OpenWeather 或任何网络调用。依赖注入使类或结构独立于它所依赖的对象的创建，有助于创建松散耦合的应用程序。

## 代码

### [GRDBQuery](https://github.com/groue/GRDBQuery)

[@anotheren](https://github.com/anotheren)：GRDBQuery 是一个为 [GRDB.swift](https://github.com/groue/GRDB.swift)（一个 Swift 版本的 SQLite 工具库）准备的扩展，提供了 `@Query` 的 property wrapper，简化了数据同步。
它类似于 SwiftUI 中为 CoreData 提供的 `@FetchRequest`。

## 内推

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