# 老司机 iOS 周报 #131 | 2020-10-12

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

## 新闻

### [还没全面替换 UIWebView？苹果又给我们续了一命！](https://developer.apple.com/news/?id=edwud51q)

[@Parsifal](https://github.com/ParsifalC)：早在 2014 年苹果就发布了 WKWebView 来替代 UIWebView，并且一直鼓励开发者早日完成迁移。去年苹果直接宣布将停止接受使用 UIWebView 的 新 App，同时表示在 2020 年 12 月份起老 App 如果仍使用 UIWebView 则也无法提交。**但日前苹果表示 2020 年 12 月份这个 Deadline 被延长了**，具体日期待定，对于还没切换 WKWebView 的开发者们，时间上会更充裕一些。

如果你的 App 仍然未完成迁移，以下 2 篇周报收录过的文章，会有所帮助：

- [mattt 关于 WKWebView 特性及如何升级 UIWebView 至 WKWebView 的建议](https://nshipster.com/wkwebview/)
- [如何检测 App 内是否还有 UIWebView 相关内容](https://blog.kulman.sk/determining-which-frameworks-use-uiwebview)

### [苹果推迟 APNs 提供商 API 适配的截止时间](https://developer.apple.com/news/?id=c88acm2b)

[@Parsifal](https://github.com/ParsifalC)：去年 11 月苹果开始要求开发者适配基于 HTTP/2 的 APNs 提供商 API，并且给定了一年的过渡期。这次苹果宣布这个截止时间从 2020.10.30 推迟至 2021.03.31，延长了整整 4 个月。有必要提一下，这个主要是后端推送服务的适配，主流第三方推送服务应该都已经适配了，若你们是使用的自建推送服务，那还是有必要和后端确认一下是否完成适配。

### [Apple 特别在线活动 - iPhone 12 真的来了](https://mp.weixin.qq.com/s/QhoHQNfaMkKNXBD0oKRTAg)

[@Parsifal](https://github.com/ParsifalC)：前不久的秋季发布会，苹果让 iPhone 12 缺席了，但好饭不怕晚！这周（北京时间 10 月 14 日周三凌晨 1 点）苹果将再次举办特别在线活动，据报道此次发布会的主角便是 iPhone 12 系列产品。

###  [Flutter 1.22 正式发布](https://juejin.im/post/6879048672597213198?utm_source=gold_browser_extension)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 又又又发布新版本了，估计很多同学 1.20 来没捂热呢，1.22 版本发布。本次版本的升级又带来了新一轮的功能发布，性能改进和问题修复。恰逢移动平台新版本（iOS 14/Android 11）的发布季，此次的版本更新保证了 Flutter 应用在 Android 11 和 iOS 14 上的兼容性，面向 iOS 14，本次更新包括了对 Xcode 12，新 Icon 的更新以及 App Clips 功能的预览。对于Android 11，此次更新包括了多种屏幕适配以及软键盘动画的流畅性优化。

## 文章

### 🌟 🐕 [Flutter 性能优化的利器 —— Tracing](https://mp.weixin.qq.com/s/qlCSF7tCPbERiTm7chXNMA)

[@邦Ben](https://weibo.com/linwenbang)：工欲善其事，必先利其器。如果你需要分析某项功能耗时，那首先你需要解决的，如何去计算耗时，最简单的就是打 log，前后节点时间戳相减得到耗时。对付简单逻辑是没问题的，但是如果遇到像 `Flutter Engine` 这类超长流程的耗时分析，那么你不可能一点点加 log 来处理，费力不讨好。因此该文讲述了 Tracing 的使用，也就是分析耗时常用的"火焰图"。

`Tracing` 是 `Chrome` 开发者工具中强大的性能分析工具之一。

大致流程，通过 `Tracing` 的 API 去埋入各个点，然后生成一份复杂格式 json，最后拖进 `Chrome` 中 `chrome://tracing` 进行解析这份 json 生成一个很直观的火焰图。（一图胜千言，这句话是真的。）

该文会专注在 `Flutter Engine` 中 Tracing 原理与实践，会分为原理篇与实践篇，原理篇会涉及到具体实现，实践篇主要包括如何使用、分析、定制。具体代码分析较多，直接打开看文章吧。

### 🌟 🐕 [Introducing Swift Atomics](https://swift.org/blog/swift-atomics/)

[@EyreFree](https://github.com/EyreFree)：Apple 官方发布了一个新的可以在 Swift 代码中直接使用低级原子操作的开源软件包 `Swift Atomics`，该库为以下 Swift 类型实现了原子操作，所有这些类型均符合 `AtomicValue` 协议：

- 标准符号整型（Int、Int64、Int32、Int16、Int8）
- 标准的无符号整数类型（UInt、UInt64、UInt32、UInt16、UInt8）
- 布尔值（Bool）
- 标准指针类型（UnsafeRawPointer、UnsafeMutableRawPointer、UnsafePointer<T>、UnsafeMutablePointer<T>），以及它们的可选包裹的形式（如 Optional<UnsafePointer<T>>）
- 非托管引用（Unmanaged<T>、Optional<Unmanaged<T>>）
- 一种特殊双字（DoubleWord）类型，由两个 UInt 值 low 和 high 组成，提供双倍宽度的原子基元
- 任何 RawValue 是原子类型的 RawRepresentable 类型（例如简单的自定义枚举类型）
- 对选择原子使用的类实例的强引用（通过遵守 AtomicReference 协议）
  
### 🌟 🐢 [【译】SE-0282 Low-Level Atomic Operations ⚛︎](https://kemchenj.github.io/2020-10-02/)

[@四娘](https://kemchenj.github.io/)：前一段时间 Apple 团队发布了 [swift-atomics](https://github.com/apple/swift-atomics)，让我们可以通过这个 package 用纯 Swift 代码实现高性能的**无锁并发数据结构**，这里我就把它的前身 [SE-0282 Low-Level Atomic Operations](https://kemchenj.github.io/2020-10-02/) 翻译出来，希望可以帮助大家更好地理解 swift-atomics。

### 🐕 [官方推荐 | 在 Flutter 中使用 TensorFlow Lite 插件实现文字分类](https://mp.weixin.qq.com/s/cdcirQCKMS3fkSnz4tL5ig)

[@莲叔](http://aaaron7.github.io/)：Flutter 技术目前已经逐渐被主流的移动开发者接受，几乎绝大多数大 App 都已经或多或少的拥抱了 Flutter 技术。这个趋势带来的额外收益就是插件生态越来越繁荣，甚至开发者已经把目光投向了端智能领域。本篇文章介绍了基于 tflite_flutter 插件在 flutter 侧实现一个简单的文本情绪分类器，场景还算比较有趣，但整体比较简单，偏教程。想试水端智能的小白可以看看。

### 🐕 [Dark side of extensions in Swift](https://dmtopolog.com/dark-side-of-extensions/)

[@极速男孩](https://github.com/ztlyyznf001)：Extensions 在 Swift 中类似于 Objective-C 中的 category，但是比 category 更加灵活和强大。Extensions 可以在一些现有的类中添加一些功能，甚至包括一些没有源码的系统的类，甚至你可以对一个协议进行扩展。本文主要介绍了如何在 Swift 去使用 Extensions, 并讨论如何处理对象和他的扩展之间的边界的问题。

### 🐎 [iOS 后台锁屏也能监听摇一摇？](https://juejin.im/post/6881420727371694093)

[@享耳先森](https://github.com/iblacksun)：直觉来说，iOS App 如果进入后台了能做的东西就非常少了，碰到「后台检测手机摇一摇」类需求时如何实现呢？作者给出了完整的研究和实现过程。

### 🐎 [iOS 是如何获取夜间模式启动图缓存路径？](https://ai-chan.top/hexo/2020/09/27/iOS-Snapshots/)

[@J_Knight_](https://weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)：本文作者首先验证了通过启动图文件名是无法获取夜间模式启动图的。然后介绍了通过分析系统文件来获取夜间模式启动图的过程。具体方案是通过解析``applicationState.db``文件并通过测试找出了夜间模式启动图缓存路径。另外作者也给出了 dump ``applicationState.db`` 文件后得出的信息，有兴趣的读者可以阅读原文查看。

### 🐕 [How Swift API Availability Works Internally](https://swiftrocks.com/how-availability-works-internally-in-swift)

[@老峰](https://github.com/Gesantung)：Swift 2.0 中引入了可用性的概念, 对于函数、类、协议等，可以使用 #available 声明这些类型依赖于特定的平台或操作系统版本。本文作者 Bruno Rocha 结合撰写 swift #unavailable evolution 的过程深入研究分享了 #available 的工作原理及实现细节。

### 🐎 [Binary Frameworks as Swift Packages](https://pspdfkit.com/blog/2020/binary-frameworks-as-swift-packages/)

[@四娘](https://kemchenj.github.io/)：今年 Swift Package Manager 最重要的更新之一就是支持了二进制分发，PSPDFKit 第一时间就做了 SPM 的支持，也给 Swift 团队提了一些反馈意见（Bug），并且赞助 CocoaPods 团队去开发 xcframework 相关的功能，文章里简短地介绍了 SPM 的接入流程和遇到的问题，感兴趣的朋友可以看一下，在这里也感谢他们对开源社区的回馈。

###  [UC 内核团队再出发，打造全新 Flutter 渲染引擎 —— Hummer](https://juejin.im/post/6877716124117663757)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 可以说是近两年来最火爆的移动跨平台方案，无论是创新型应用还是老牌旗舰型应用，都在或多或少地尝试 Flutter 技术。虽然 Flutter 看起来非常美好，但是它毕竟只是一个有潜力的新生儿，有待完善的地方还很多，UC 团队对此做了大量的工作，对 Flutter 引擎的性能和相关配置工具等做了大量优化，就有了定制化 Flutter 引擎 [Hummer](https://juejin.im/post/6877716124117663757), 目前 Hummer 已经取得了不少喜人的成绩：

- 混合栈开发方案优化
- 启动及首帧性能优化
- 自适应的 DarkMode
- 网络库增强

## 工具

### [XcodeGen — Collaboration Made Easy](https://medium.com/dev-jam/xcodegen-collaboration-made-easy-9d1fdef548de?source=friends_link&sk=e13d571c9544f878a3c1510778a988c9)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：相信每一位开发者在合并代码的时候都会遇到与 .xcodeproj 文件相关的冲突，解决这种冲突并不容易。有没有比较好的方式或工具可以解决这种问题？没错，XcodeGen 可以提供很大帮助，XcodeGen 是用 Swift 编写的命令行工具。它使用文件夹结构和项目规范来生成 Xcode 项目，其中包含生成项目所需的所有信息，例如目标，方案，设置等， 同时允许我们将配置拆分为多个文件，更易于管理。尽管 XcodeGen 会改变配置项目的方式，但在大型团队工作时使用 XcodeGen 会受益良多。

## 代码

### 🐎 [Announcing Swift Algorithms](https://swift.org/blog/swift-algorithms/)

[@zvving](https://github.com/zvving)：Swift 官方新开源 Swift Algorithms 项目，旨在为 Swift 算法代码提供通用基础能力。目前包含集合 Chunked, Sampling，Rotate 等辅助方法。

项目尚在早期阶段，以独立库的方式存在，初步对纳入算法标准提出建议，经过社区长期论证的算法，最终会纳入标准库。

官方出品，品质保证。日常写算法比较多的同学可以先用起来。

### [Swift System](https://github.com/apple/swift-system)

[@xiaofei86](https://weibo.com/xuyafei86)：苹果在 WWDC20 "What's New in Swift" 公布 Swift Archive 框架时，提到其文件流构造函数用到了今年引入的另一个新框架 Swift System。之后简单介绍了 Swift System 为 Apple Archive 的系统底层 API，提供更加现代、易用的系统接口，以及更加底层、通用的类型。除此之外，没有公布更多的信息。

最近，苹果开源了 Swift System，并引入了对 Linux 的支持。旨在提供多平台的系统接口封装，让 Swift System 充当所有受 Swift 支持平台的系统底层接口的唯一宿主。

## 赞助者

[Woodpecker](https://apps.apple.com/cn/app/woodpecker/id1333548463?mt=12): 是一款 iOS 开发调试辅助工具，提供沙盒文件、UserDefaults、视图层级在线查看和编辑等功能，在实际工作中能极大提升开发效率和幸福感！

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 iTDriverr 哦~**

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（LSJCoding）会推送消息，欢迎关注。

![](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）
