# 老司机 iOS 周报 #123 | 2020-08-10

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

## WWDC20

本周在周报公众号上我们推送了 4 篇 WWDC20 内参专栏内的文章，每篇都很精彩！

- [App Clips 探索之旅](https://mp.weixin.qq.com/s/_Uc2EBTk26IjZzS9GmVJ-g)
- [SwiftUI 编程指南](https://mp.weixin.qq.com/s/smQmdXF-3VkHQnUV3G8Z3w)
- [App Clips 开发设计指北](https://mp.weixin.qq.com/s/yBBIkBdwvhJMSWsDnJJMsA)
- [为其他商户构建 App Clips](https://mp.weixin.qq.com/s/2_pmJ0JFtAP0nbSoEj8V9g)

## 文章

### 🌟 🐕 [Flutter 1.20 正式发布，新特性解读](https://mp.weixin.qq.com/s/Ua-463pSzEUiwl4WZMW5bw)

[@邦Ben](https://linwenbang.weibo.com)：Flutter 1.20 正式发布，带来了不少新特性，Flutter 的更新速度还是非常让人满意。

- 图标字体摇树优化（即删除你未使用的图标字体，降低体积）
- 提供 SKSL 预热功能，优化动画效果（需要设置）。
- 优化了鼠标命中测试，提高 web 性能。
- Dart 2.9 优化了 utf-8 解码器，在低端 ARM 设备上，英语文本的解码速度也提升至近 200%，而中文文本更是提升至 400%。
- 支持 Android 和 iOS 自动补全功能。
- 更新了 InteractiveViewer 组件（用于平移、缩放、拖拽以及大小调整等）。
- 更新 Meterial Slider、RangeSlider、TimePicker 以及 DatePicker.
- AboutDialog 用于显示所有用到的 package 的 licenses
- pubspec.yaml 新格式，主要是指定特定平台
- VSCode 集成 Dart DevTools（可以不打开网页了）。
- DevTools 支持网络分析。
- VSCode 重命名或者移动自动更新对应引用。
- Channel 生成器（Pigeon），通过 Dart 声明，工具生成 Channel 三端通信代码。
- 还有很多的 bugfix 以及一些新特性处理。

除了性能优化之外，特别推荐关注一下 Pigeon，可以节省下不少编写 Channel 的时间。

### 🌟 🐕 [Flutter 初学者必读的高级布局规则](https://mp.weixin.qq.com/s/t5R112IIQUc9SXwWeAgsoA)

[@Damien](https://github.com/ZengyiMa)：本文通过 29 个示例来展示了 Flutter 高级布局规则并且总结 Flutter 布局的原理如下：

1. Widget 从其父项获得自己的约束 。一个“约束”是由 4 个 double 值组成的：分别是最小和最大宽度，以及最小和最大高度。
2. Widget 会遍历自己的 子项（Children）列表。Widget 会逐个向每个子项告知它们的约束（各个子项的约束可以是不同的），然后询问每个子项想要设置的大小。
3. 接下来，Widget 一个个确定子项的位置（在 x 轴上确定水平位置，在 y 轴上确定垂直位置）。
4. 最后，Widget 将其自身大小告知父项（当然这个大小也要符合原始约束）。

对于 Flutter 初学者来说，这是一篇很好阐述 Flutter 布局规则的文章。

### 🐢 [Verify your app’s integrity with the new App Attest API](https://developer.apple.com/news/?id=2sngpulc)
[@anotheren](https://github.com/anotheren)：新的 App Attest API 是 [DeviceCheck](https://developer.apple.com/documentation/devicecheck) 框架的一部分，可帮助防止 iOS 14 或更高版本上的应用受到安全威胁，从而减少对服务的欺诈性使用。借助 App Attest，你可以在设备上生成特殊的加密密钥，并在服务器提供对敏感数据的访问之前，使用该密钥来验证应用程序的完整性。其核心类为 [DCAppAttestService](https://developer.apple.com/documentation/devicecheck/dcappattestservice)。Apple 提供了一个系列文章来具体讲述如何使用该新特性，包括：[建立应用程序的完整性](https://developer.apple.com/documentation/devicecheck/establishing_your_app_s_integrity)；[验证连接到服务器的应用程序](https://developer.apple.com/documentation/devicecheck/validating_apps_that_connect_to_your_server)；[评估欺诈风险](https://developer.apple.com/documentation/devicecheck/assessing_fraud_risk)；[准备使用 App Attest 服务](https://developer.apple.com/documentation/devicecheck/preparing_to_use_the_app_attest_service)。

### 🐎 [Dependency Injection via Property Wrappers](https://www.kiloloco.com/articles/004-dependency-injection-via-property-wrappers/)

[@四娘](https://kemchenj.github.io/)：依赖注入是一种解决高低层级抽象耦合的方式，这篇文章介绍了在 Swift 里如何简单地实现这种模式，并且使用 `@propertyWrapper` 优化它的语法：

```swift
struct ContentView: View {
    @Inject var dependency: MyDependency
    
    var body: some View {
        Button("Tap Me", action: dependency.doSomething)
        // prints "Next level injection 💉" when tapped
    }
}
```

### 🐢 [Swiftʼs Collection Types](https://harshil.net/blog/swift-sequence-collection-array)

[@JonyFang](https://github.com/JonyFang)：这篇文章基于 Sequence、Collection 和 Array 进行拓展，解释了一些重要协议的功能及其存在的原因。在深入探讨复杂结构之前引入了两项思考：
- 1.如何设计 API 以达到最低要求？
- 2.如何设计共享和专项的实现？

Sequences 和 Iterators 是构建其他协议和具体类型的基础，文中做了部分介绍。最后以 Collection、BidirectionalCollecton、RandomAccessCollection、MutableCollection、RangeReplaceableCollection 的对比分析，解释了为什么存在这些协议及他们可以实现的改进。为了进一步阅读，也可以深入了解源码，尽管 Swift 本身以 C++ 编写，但标准库大部分是使用 Swift 编写的，包括[公共 API 源代码目录](http://github.com/apple/swift/blob/master/stdlib/public/core)。可以最先从 [Sequence](http://github.com/apple/swift/blob/master/stdlib/public/core/Sequence.swift) 和 [Collection](http://github.com/apple/swift/blob/master/stdlib/public/core/Collection.swift) 类型的源代码看起。

### 🐕 [MessageMock：优雅的模拟 Objective-C 方法](https://mp.weixin.qq.com/s/jm2QvYqnvFCPcRPocpj9ZQ)

在代码测试中，对于一些不容易获取的对象，可以虚拟（mock）出一个对象来帮助完成测试。在 iOS 中，已经有 OCMock 这样比较有名的开源框架去解决这个问题。但是 OCMock 在使用上的问题是比较繁琐麻烦，测试一个小的功能可能在使用上也比较麻烦。本文为这种场景提供了一种新的思路，基于 `objc_msgSend` 来进行方法的“模拟”和“校验”。

[项目源代码](https://github.com/indulgeIn/MessageMock)

### 🐕 [Self-Sizing UITableView Cells with SwiftUI](https://noahgilmore.com/blog/swiftui-self-sizing-cells/)

[@zvving](https://github.com/zvving)：在已有 UIKit 项目中如何 Hybrid 使用 SwiftUI，很多小伙伴都关心这个问题。作者尝试在一个略有复杂度的场景：自适应 UITableviewCell 中使用 SwiftUI。如何解决自适应高度，cell 复用？状态改变如何更新？作者对这些问题做了细致的探索，提供不错的实践参考。

## 工具

### [为啥 Flutter Hooks 没有受到太多关注和青睐？](https://mp.weixin.qq.com/s/L96a8Jc_HAzPdk4VYJ1Q3g)

[@极速男孩](https://github.com/ztlyyznf001)：hooks 最早起源于 React 当中，他可以是我们在不用写类的情况下去管理我们的 state。Flutter Hooks 并不需要掌握 React ，他可以使我们方便的在多个 widget 中共享同一套代码，他为我们提供了状态管理的另一种思路。flutter_hooks 中我们即可以只是用一个函数也同样可以创建一个类去创建一个 hook 。更多的内容可以参考 pub.dev 中的[文档](https://pub.dev/packages/flutter_hooks)。

## 代码

### [ConfigableCollectionView](https://github.com/miku1958/ConfigableCollectionView)

[@老峰](https://github.com/gesantung)：一个类似用 iOS 13 UICollectionViewDiffableDataSource + CellRegistration 配置 UICollectionView 的库, CellRegistration 封装了 DataSource 简洁 API 配置 CollectionView，DiffableDataSource 提供了高效安全数据操作 API, 对 UICollectionView 新特性感兴趣的读者可以尝试一下。

>推荐人：[庄黛淳华](https://weibo.com/augcommaaugust)

### [HappyCodable](https://github.com/miku1958/HappyCodable)

[@EyreFree](https://github.com/EyreFree)：通过使用 SourceKittenFramework 去自动生成 Codable 代码，让人更愉悦地使用 Codable，具有以下优势：

- 支持自定义某个属性的 Coding Key；
- 支持忽略掉某些不能 Codable 的属性；
- 支持自动合成非 RawRepresentable 的 Enum；
- Decode 时支持多个 Coding Key 映射同一个属性；
- 便于调试；
- 可以使用模型的默认值；
- 支持简单的类型转换，比如转换 0/1 到 False/True, "123" 到 Int 的 123 或者反过来。

>推荐人：[庄黛淳华](https://weibo.com/augcommaaugust)

## 内推

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