阅读 5026

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

老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

WWDC20

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

文章

🌟 🐕 Flutter 1.20 正式发布,新特性解读

@邦Ben: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 初学者必读的高级布局规则

@Damien:本文通过 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

@anotheren:新的 App Attest API 是 DeviceCheck 框架的一部分,可帮助防止 iOS 14 或更高版本上的应用受到安全威胁,从而减少对服务的欺诈性使用。借助 App Attest,你可以在设备上生成特殊的加密密钥,并在服务器提供对敏感数据的访问之前,使用该密钥来验证应用程序的完整性。其核心类为 DCAppAttestService。Apple 提供了一个系列文章来具体讲述如何使用该新特性,包括:建立应用程序的完整性验证连接到服务器的应用程序评估欺诈风险准备使用 App Attest 服务

🐎 Dependency Injection via Property Wrappers

@四娘:依赖注入是一种解决高低层级抽象耦合的方式,这篇文章介绍了在 Swift 里如何简单地实现这种模式,并且使用 @propertyWrapper 优化它的语法:

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

@JonyFang:这篇文章基于 Sequence、Collection 和 Array 进行拓展,解释了一些重要协议的功能及其存在的原因。在深入探讨复杂结构之前引入了两项思考:

  • 1.如何设计 API 以达到最低要求?
  • 2.如何设计共享和专项的实现?

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

🐕 MessageMock:优雅的模拟 Objective-C 方法

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

项目源代码

🐕 Self-Sizing UITableView Cells with SwiftUI

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

工具

为啥 Flutter Hooks 没有受到太多关注和青睐?

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

代码

ConfigableCollectionView

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

推荐人:庄黛淳华

HappyCodable

@EyreFree:通过使用 SourceKittenFramework 去自动生成 Codable 代码,让人更愉悦地使用 Codable,具有以下优势:

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

推荐人:庄黛淳华

内推

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

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

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

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

关注我们

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

说明

🚧 表示需某工具,🌟 表示编辑推荐

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)