# 老司机 iOS 周报 #20 | 2018-05-21

![ios-weekly](../assets/ios-weekly.png)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 专栏

### 🌟 🐕 [再谈 iOS App Crash 防护](https://xiaozhuanlan.com/topic/6280793154)

我们老司机 iOS 专栏内最新出炉的一篇文章。作者分析了几种可能的 Crash 防护方案，并结合自己实践网易 Baymax 防护方案中遇到的各种问题，给出了解决方法，也提出了自己对这套方案的一些思考。

## 新闻

### [MongoDB 官方提供对 Swift 原生支持](https://github.com/mongodb/mongo-swift-driver)

`MongoDB` 是一个基于分布式文件存储的开源数据库系统。现在官方在 C 驱动(`libmongoc`)的基础上，用 Swift 进行封装，提供 Pure Swift 驱动。这或许表明 Server-side Swift 越来越成熟，期待不久的将来能看到大规模应用。

## 文章

### 🌟 🐕 [关于 MVC 的一个常见的误用](https://onevcat.com/2018/05/mvc-wrong-use/)

如何避免把 Model View Controller 写成 Massive View Controller 已经是老生常谈的问题了。我们可以通过
MVVM , Reactive 模式或 Reducer 模式等进行优化改造。但比起模式和框架，更重要的是认识到解决的问题本质在于：我们要如何才能更清晰地管理“用户操作，模型变更，UI 反馈”这一数据流动的方式。本文则是通过一个简单的 To Do 列表来阐述如何清晰地管理数据流动。

### 🐎 [Flutter 原理简解](https://mp.weixin.qq.com/s/CQQXD0TrlbaNWjoClIcDtw)

Flutter 可以说是近期最热门的一个开发框架了，上周已经推过一篇 Flutter UI 绘制流程的文章，本篇文章也 cover 了一部分绘制的流程，不过与之前 focus 在 layout 环节不同, 本篇文章的渲染部分主要讲解了 Flutter 是如何通过 Skia 框架将 layout 之后的元素提交给 GPU 进行绘制。 除此之外，文章还分析了 Flutter 引擎的组件架构以及一些安装配置教学。

简单来说有用的内容不少，不过结构有点乱，看起来略费劲。（逃。。

### 🐢 [『如何使用现代的 App 工程与架构的技术来构建我们的 App』系列文章](https://www.hackingwithswift.com/articles/94/how-to-refactor-your-app-to-add-unit-tests)

- [How to refactor your app to add unit tests](https://www.hackingwithswift.com/articles/94/how-to-refactor-your-app-to-add-unit-tests)
- [How to add CocoaPods to your project](https://www.hackingwithswift.com/articles/95/how-to-add-cocoapods-to-your-project)
- [How to clean up your code formatting with SwiftLint](https://www.hackingwithswift.com/articles/97/how-to-clean-up-your-code-formatting-with-swiftlint)
- [How to streamline your development with Fastlane](https://www.hackingwithswift.com/articles/98/how-to-streamline-your-development-with-fastlane)

上述四篇是一个系列文章， 围绕一个核心问题来讲述：如何使用现代的 App 工程与架构的技术来构建我们的 App。不得不说作者写的是很良心的，整体文风对新手都很友好而且做到了循序渐进、抽丝剥茧的叙事逻辑，是不可多得的项目教程。

系列文章从一个普通的、设计缺乏考量的 demo 工程开始，首先为其添加了单元测试框架的支持，然后整合了 CocoaPods 来管理第三方的依赖，引入了 SwiftLint 来对代码进行静态检查，最终介绍了如何配置 Fastlane 来把传统打包提审流程中最繁琐的截屏步骤给自动化。基本涵盖了现在的 iOS App 项目的核心工程要素，尤其适合小公司的“多面手”型工程师阅读。

### 🐎 [Tips for using Xcode Playground](https://fluffy.es/xcode-playground-tips/)

虽然 Xcode Playground 老爱崩溃，但 Playground 的确很适合测试一小段代码。文章介绍如何设置手动运行，来降低 Playground 的 CPU 使用率及崩溃率，以及如何为手动运行添加 `⌘R` 快捷键。另外 Playground 在最后一行代码执行完毕之后就会立即停止，并不会等待还没有执行的异步回调，可以设置停止方式为手动停止，或者代码来控制停止。

### 🐎 [Running Xcode Playgrounds on Travis CI](https://flight.school/articles/running-xcode-playgrounds-on-travis-ci/)

Playgrounds 是一个很好的展示代码的方式。Mattt 新写的 [Guide to Codable](https://gumroad.com/l/codable) 就是基于 Playgrounds 去传递他的想法。而他为了解决及时发现自己的代码还是否适配最新的 Swift 版本和 SDK 版本，借助了 Travis CI 自动的去检查版本的适配。

### 🐢 [TouchID 和 FaceID 实战使用的一些经验](http://michael-brown.net/2018/touch-id-and-face-id-on-ios/)

`LocalAuthentication` 虽然只有 `LAContext` 一个 class，但并不代表清晰好用，其文档不够清晰甚至有错误。作者在实际 App 中使用过 `LocalAuthentication` 之后列出了文档的一些错误并给出了许多最佳实践。

### 🐕 [手机京东技术团队对 iOS 自动化埋点探索](https://mp.weixin.qq.com/s/u-HmmrSAgtER1N2pKxCm0A)

客户端埋点是产品分析用户数据的重要途径，常见的埋点方式有以下三种：

- 代码埋点，最直接的手动埋点方式，由开发人员完成；
- 可视化埋点，本文将会介绍的方式，可由埋点维护人员自行完成；
- 无埋点，相当于全埋点，网易 [HubbleData](https://neyoufan.github.io/2017/04/19/ios/%E7%BD%91%E6%98%93HubbleData%E6%97%A0%E5%9F%8B%E7%82%B9SDK%E5%9C%A8iOS%E7%AB%AF%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0/) 中有使用到。

本文整体介绍可视化埋点的使用方式和技术细节，另外针对可视化埋点中遇到的问题，尝试给出解决方案和并提出了一些思考。

### 🐎 [如何在实现类似于 rx 的命名空间](https://medium.com/@thibault.wittemberg/versatile-namespace-in-swift-3e8bbd6b6250)

大家应该在 Kingfisher 和 RxSwift 这些库里见过 `kf` 和 `rx` 的命名空间，刚开始用的时候会觉得有点陌生，但习惯之后就会理解这是一种多么优雅的代码组织方式，这篇文章会一步一步教大家如何实现这样的命名空间。

如果觉得英文阅读比较困难的同学，也可以考虑一下看 Enjoy 的 iOS 工程师写的这篇博文 [Swift 命名空间形式扩展的实现](https://blog.nswebfrog.com/2017/03/23/swift-namespace/)。

### 🐎 [监控启动崩溃](http://sindrilin.com/apm/2018/05/12/observe_crash_at_launch.html)

一套监控启动闪退的方案，与以前通过检测 App 在某段时间后是否仍然存活的方式相比，这套方案的检测时机更加提前，通过 hook `msg_send` 函数实现，并且自己处理了 crash 后的日志上报功能。

## 代码

### [Parade](https://github.com/HelloElephant/Parade)

Parade 是一个简单易用的视差效果引擎，适用于基于 UIScrollView 任何视图。除了简单易用以外，Parade 的源码和示例代码质量都很高，是一个不错的 Swift 开源库。

### [ClassicKit](https://github.com/Baddaboo/ClassicKit)

一套 Windows 95 风格的 UI 样式库。比较有意思的是它支持 `@IBDesignable`，这样就可以在 Xib 或者 Storyboard 中直接查看效果。

## 工具

### [Scheduling Services](https://152percent.com/blog/scheduling-services)

一个微型 Swift 计划服务框架，基于 NSNotification 实现，用于计划未来（重复的）事件。使用 Codable 持久化任务内容，支持存储和恢复事件状态，API 简单、清晰。

### 🐢 [Catching smiles with Google’s ML Kit on iOS](https://martinmitrevski.com/2018/05/11/catching-smiles-with-googles-ml-kit-on-ios/)

Google I/O 大会推出了谷歌的全新移动端机器学习框架 MLKit，可以实现在本地跑机器学习模型的能力，各方面都很像苹果已经推出的 CoreML 框架。这篇文章教大家如何使用 MLKit，包括设置 Firebase 服务，然后在 iOS 上进行代码开发，实现了一个对照片进行微笑检测的功能。

## 关注我们

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

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

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

## 本期编辑

[@没故事的卓同学](https://weibo.com/1926303682/profile)，[@四娘](https://kemchenj.github.io)，[@mmoaay](https://weibo.com/u/1302422271)，[@享耳先森](https://github.com/iblacksun)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@Parsifal](https://weibo.com/parsifalchang)，[@aaaron7](https://weibo.com/aaaron7)，[@方秋枋](https://weibo.com/100mango)

## 说明

🚧 表示需翻墙，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）


