# 老司机 iOS 周报 #92 | 2019.11.25

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

## 新闻

### [​Flutter 智能闹钟挑战赛约你来战！](https://mp.weixin.qq.com/s/mp2XxbP1jfsayw6oVEjb2Q)
[@老驴](https://www.weibo.com/6090610445)：是不是学了 Flutter 却无处练手？机会来了！Google 联合 Google Assistant，联想，一起搞了这个智能闹钟挑战赛，用 Flutter 为联想智能音箱开发一个智能闹钟功能，不仅能让你练手 Flutter， 更能赢得最高大奖：一台顶配的 iMac Pro 哦。心动不如行动，赶紧点击链接参与起来！

## 文章

### 🌟 🐕 [Command-line argument parsing using Swift Package Manager's SPMUtility module](https://rderik.com/blog/command-line-argument-parsing-using-swift-package-manager-s/)

[@looping](https://github.com/looping)：本文介绍了通过使用 SPM 的 SPMUtility 模块配合解析终端命令参数，来完成编写命令行工具的任务。在列举完基本的命令参数概念和设计规则后，就开始工具编写实战，讲解过程非常详细，附带源码，入门教程必备。在文章最后，作者提到了前段时间他自己写的另一篇文章，[Building a CLI tool using Swift and Vapor's Console module](https://rderik.com/blog/building-a-cli-tool-using-swift-and-vapor-s-console-module/)，使用这两个模块都能写出很好的工具，并且也有各自的设计风格，有写命令行工具需求的小伙伴可以深入了解下。

### 🐕 [Thread Sanitizer explained: Data Races in Swift](https://www.avanderlee.com/swift/thread-sanitizer-data-races/)

[@EyreFree](https://github.com/EyreFree)：本文通过对并发编程中经典的数据竞争（Data Race）问题进行了举例、分析，由此引入和介绍了 Thread Sanitizer（也称为 TSan）的使用方法以及它的基本工作原理，并演示了如何依靠它来解决文中举出的数据竞争问题。Thread Sanitizer 是在 Xcode 8 中引入的基于 LLVM 的工具，用于审查 iOS 代码中的线程问题，能给我们的并发编程调试带来很大的便利，值得一看。

### 🌟 🐢 [Flutter 应用性能优化最佳实践](https://mp.weixin.qq.com/s/2CbtwcyKlmB2u2c02gDP0w)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：通常来说，Flutter 技术构建的应用程序在默认情况下都是高性能的。所以你只需要避开常见的陷阱，就可以获得优异的性能，而不需要使用复杂的分析工具对细节做优化. 本文总结了一些 Flutter 应用开发过程中的最佳实践, 可以有效的帮助你避开一些坑点.

### 🐕 [自定义WKWebView显示内容（一）](https://juejin.im/post/5dc41b44e51d456e824cf137)

[@J_Knight_](https://weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)：本文作者结合代码与 Demo 展示分享了的如何通过 WKContentRuleList 来制定 WKWebView 的内容过滤规则（例如更改 http 请求的 URL 为 https ）；以及如何通过 WKURLSchemeHandler 来加载相册中图片显示到 WKWebView 中的方案。

### 🐎 [Message-ID and Mail.app Deep Linking on iOS and macOS](https://nshipster.com/message-id/)

[@四娘](https://kemchenj.github.io/)：这周 NSHisper 给我们带来的是 Deep Linking 相关的内容，讲解 iOS / macOS 里 Mail.app 使用链接跳转时如何编码链接信息，避免信息泄漏。

### 🚧 🐎 [iOS Deferred Deep Link](https://medium.com/zrealm-ios-dev/ios-deferred-deep-link-%E5%BB%B6%E9%81%B2%E6%B7%B1%E5%BA%A6%E9%80%A3%E7%B5%90%E5%AF%A6%E4%BD%9C-swift-b08ef940c196)

[@老峰](https://GesanTung.github.io/)：Deferred Deep Link 是指用户打开一个 Web Page 的时候并没有安装对应的 App，希望用户在安装 App 以后可以 Deep Link 到对应内容，本文作者介绍了首先介绍了 Deep Link 概念以及其局限性，然后通过实例给出使用 [Firebase Dynamic Links](https://firebase.google.com/docs/dynamic-links) 方式实现 iOS Deferred Deep Link 的过程。

### 🐕 [NSCopying uses in Swift](https://swiftrocks.com/nscopying-nszone-uses-in-swift.html)

[@极速男孩](https://github.com/ztlyyznf001)：和 Objective-C
中一样，在 Swift 中同样有 NSCopying 和 NSMutableCopying。本文首先介绍了 NSCopying 的用法和原理。然而在 NSMutableCopying 中，和 Objective-C 不一样，当你不需要定义一个单独的 mutable 类型的情况下，在 Swift 中只需要用 let 和 var 就可以了。

### 🐎 [Flutter 中文文档：使用 Mockito 模拟依赖关系](https://mp.weixin.qq.com/s/e9orvqzdLmFwMXDVLUtcLw)

[@AidenRao](https://weibo.com/AidenRao)：本篇教程介绍了 Mockito 包的基本用法，模拟 Web 服务或数据库，根据条件返回特定结果，解决直接依赖 Web 服务或数据库的以下不便：
- 访问线上服务或数据库会拖慢测试执行效率。
- 原本可以通过的测试可能会失败，因为 web 服务或数据库可能会返回不符合预期的结果。
- 使用线上 web 服务或数据库来测试很难覆盖全所有可能成功或失败的场景。

## 工具

### 🐕 [自动切换输入法 - Mac](https://apps.apple.com/cn/app/%E8%87%AA%E5%8A%A8%E5%88%87%E6%8D%A2%E8%BE%93%E5%85%A5%E6%B3%95/id1470350547?mt=12)

[@水水](https://www.xuyanlan.com)：Mac 上的自动切换输入法 App， 支持所有常用输入法，能够根据当前正在运行的不同的应用程序，自动切换对应的输入法，免去人工手动切换的麻烦～

## 代码

### [IBPCollectionViewCompositionalLayout](https://github.com/kishikawakatsumi/IBPCollectionViewCompositionalLayout)

[@张嘉夫](https://github.com/josephchang10)：在 WWDC 2019 上 Apple 为 UIKit 增加了一个新的 [UICollectionViewCompositionalLayout](https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/using_collection_view_compositional_layouts_and_diffable_data_sources) 类，让创建复杂的自定义 collection view 布局变得简单很多。在 iOS 12 及更早的版本中，我们只能继承 `UICollectionViewLayout` 来实现自定义布局，要重写很多方法，导致容易出现问题。IBPCollectionViewCompositionalLayout 这个库让 iOS 12 及之前的版本也能够支持 UICollectionViewCompositionalLayout，并且可以使用同一套 API，无需同时维护两个代码库。

### [MagazineLayout](https://github.com/airbnb/MagazineLayout)

[@zvving](https://github.com/zvving)：为 UICollectionView 提供易用的垂直滚动网格和列表布局。相较于 UICollectionViewFlowLayout，支持多列、高度自适应，Section 自定义背景，Section Header/Footer 跟随滚动等增强特性。

Airbnb 家出品，在其产品页面中已广泛应用，久经考验，推荐选用。

## 内推

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

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

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

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

## 关注我们

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

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