# 老司机 iOS 周报 #23 | 2018-06-18

![ios-weekly](../assets/ios-weekly.png)
上一周在[掘金](juejin.im)的支持下，我们联合“知识小集”、SwiftGG 针对 WWDC 18 一共完成了 28 篇技术文章。希望广大的开发者多多转发，不要错过：[老司机x知识小集xSwiftGG WWDC 18 专题目录](https://www.jianshu.com/p/6f95f7631d36)。

## 新闻

### 🐎 [FB正在大规模重构React Native，预计今年发布](https://mp.weixin.qq.com/s/afJzC_Pya2S27tmmuSidzA)

这毫无疑问是个好消息，和原生代码的协同一直是 React Native 的一个痛点，Facebook 愿意亲自解决这个问题，这对 RN 生态的超级利好。业内一些公司选择 Weex 而不选择 RN 的原因就是因为 Weex 和 Native 之间交互更加方便，这样可以最大限度的复用自己积累的 Native code base(毕竟目前 iOS 业内没多少新项目， 大部分都是有一定历史包袱)。如果 RN 解决了这个问题想必会给 Weex 带来新的压力。

## 文章

### 🌟 🐕 [Enumerating enum cases in Swift](https://oleb.net/blog/2018/06/enumerating-enum-cases/)

本文介绍了 Swift 4.2 新引入了 `CaseIterable` 协议。因为 Enum 会自动实现 `CaseIterable`  的方法，所以作者先介绍了 `CaseIterable` 协议中 `allCases` 方法在 Enum 上的几种使用场景，其中就包括了在 TableView 上的使用。然后作者详细讲解了如何让其他类型去实现 `CaseIterable` 协议。这是 Swift 4.2 非常重要的一个新增项，值得关注！

### 🐕 [iOS 流量监控分析](http://zhoulingyu.com/2018/05/30/ios-network-traffic/)

在移动开发早期，流量监控一直是 APM 里很重要的部分。但随着 WiFi 覆盖率的提高以及流量资费的下降，客户端的流量监控渐渐显得不是那么重要了。饿了么基于自己的业务场景需要，分析比较了圈内各大已知 APM 流量监控方案的优缺点，最终实现了自己的流量监控模块。该文章对于加深理解 iOS 客户端内 HTTP 请求流程是很有帮助的。

### 🐢 [SR-7380, Ambiguous KeyPath](http://matt.diephouse.com/swift/0/)

> 作者是 GitHub 和 Apple 的前员工。

作者在编码过程中发现 Swift `KeyPath` 的一个 bug，从定位和修复问题的过程非常清晰，值得一看。

Swfit 的编译前端是 `swiftc`(为什么不是 Clang ? 参考 https://www.youtube.com/watch?v=Ntj8ab-5cvE) 文章写了如何给编译器加参数让其打印出更多信息、如何生成 `AST(抽象语法树)`、`语义分析`如何做类型检查等。

> 关于 Swift 编译过程，可参考 [向开源的 Swift 贡献代码](https://academy.realm.io/cn/posts/tryswift-jesse-squires-contributing-open-source-swift/)

### 🐕 [WWDC 中提到的浏览器 Fingerprinting 有多可怕？](https://juejin.im/post/5b17de31f265da6e397b70f4?from=timeline&isappinstalled=0)

Web 浏览器上的 fingerprinting 技术指通过 IP 地址、JavaScript 行为、Flash 与 Java 插件、字体、Canvas、WebGL 等多维度信息，来给每一个浏览器打上一个不同的 fingerprint。你修改浏览器的常见配置，fingerprint 往往并不会发生改变，而你换一台电脑，或者换一个浏览器，都会产生不同的 fingerprint。通过这项技术，就能给一个运行在某个 OS 平台上的浏览器打上唯一标识，识别 Cookie 泄露产生的用户伪装，不过目前 fingerprinting 被广泛用于在不同的网页上识别用户，去投放合适的广告。

### 🚧 🐕 [iOS 12: Notable UIKit Additions](https://medium.com/the-traveled-ios-developers-guide/ios-12-notable-uikit-additions-b50beb0e3729)

作者 Jordan Morgan 每年 WWDC 之后都会深入探索新版本的 iOS 并为大家带来 UIKit 新增的 API，这次包括用于提示密码的 UITextInputTraits、用于图像渲染的 UIGraphicsImageRenderer、自动填充验证码、通知设置等等值得花时间研究的新 API。

### 🐕[Training a Text Classifier with Create ML and the Natural Language Framework](https://flight.school/articles/classifying-programming-languages-with-createml/)

CreateML 是今年 WWDC 苹果发布的新的深度学习训练工具，允许开发人员在不太了解机器学习的情况下，便可以训练自己的 models。本文作者 Mattt 在很短的时间，只写了很少的代码，就通过 CreateML 训练了一个文本分类的 Model，可见 CreateML 在使用上的简单和迅速。我一直认为机器学习慢慢一定会随着各种工具，框架的出现，变得越来越简单，可以让更广大的开发人员使用。虽然 CreateML（目前 CreateML 还是 Beta 版本）还不能完全代替诸如 TensorFlow 这样的框架，但我认为这是一个很好的开始。

### 🐕[MessageThrottle Performance Benchmark and Optimization](http://yulingtianxia.com/blog/2018/05/31/MessageThrottle-Performance-Benchmark-and-Optimization/)

MessageThrottle 是 OC 消息节流和防抖的库，换句话说就是控制方法调用的频率，主要利用 OC 的 runtime 机制来实现。由于 Hook 消息转发流程带来了一定的性能损耗。作者在原有基础上，通过改进存储结构和缓存策略，对库的性能进行了优化，使得消息转发流程的耗时下降 50%，同时节省 6% 的 CPU 耗时，并加强了线程安全。建议读者在读这篇文章前，如果对这个库或者 runtime 机制不是太熟悉的，可以先看一下 MessageThrottle 这个库的实现细节。

### 🐢 [When your CA turns against you](https://scotthelme.co.uk/the-power-to-revoke-lies-with-the-ca/)

目前主流的网站基本都采用了 HTTPS，而证书都是通过 CA 颁发。TSL 证书主要有三种类型，分别为 DV、OV 以及 EV。其中，EV 是最贵的。而我们知道，CA 总是想引导我们购买更贵的证书，但从安全性而言，它们三个其实并没有多大区别（当然，本文重点不在介绍 EV，主要是证书发布后的问题）。CA 不仅可以颁发证书，还具有撤销证书的权利。本文以实际的案例，Ian Carroll 在美国注册的一家名为 Stripe Inc. 的公司被 CA 撤销了证书，来讨论 CA 的权利是否过大，是否存在滥用职权的问题。

### 🐎 [WWDC 2018 见闻](http://blog.cnbang.net/internet/3578/)

Bang 参加 WWDC 2018 的见闻，不仅仅提到了 WWDC 中，大家在最近几周看过很多相关文章的 WWDC Session ，还提到了 WWDC Lab 这个现场与苹果开发者，全世界开发者交流探讨的环节，另外 Bang 作为 JSPatch 的作者，也向苹果询问了官方对这类工具，这类热修复，热更新的态度，苹果的回答也颇有意味。

### 🐕 [[译]现代 js 框架存在的根本原因](https://juejin.im/post/5b111436e51d4506d06205fd)

作者从数据状态与UI响应的方向集中阐述了在传统前端开发模式下带来的痛点，因此而产生了现在诸如 React，Angular 或 Vue 等现代 js 框架。在文章中提到此类框架的基本策略是通过虚拟dom来高效操作渲染，使用观察者监听来即时响应状态变化。作者为了大家理解方便，用原生 js 与虚拟 dom，实现了一个响应式 UI 框架的基本流程。


### 🐕 [Harnessing Code Generation to Increase Reliability & Productivity on iOS at Uber](https://eng.uber.com/code-generation)

本文的中心是利用代码自动生成能力提高 Uber iOS 上的可靠性和生产力。主要通过资源访问器（Resource accessors）和模拟（Mocks）两个例子来介绍代码自动生成能力如何提高代码可靠性和生产力。


### 🐢 [Modular iOS](https://edit.theappbusiness.com/modular-ios-strangling-the-monolith-4a6843a28992)

下面四篇文章是一个系列文章，主要描述了「如何将我们的项目进行模块化拆分」

- [Modular iOS Part 1: Strangling the Monolith](https://edit.theappbusiness.com/modular-ios-strangling-the-monolith-4a6843a28992)
  
    第一部分描述了项目模块化的好处，以及可以将一个庞大的项目通过 Main App、Feature、Shared、Common 等层级进行划分。

- [Modular iOS Part 2: Splitting A Workspace into Modules](https://edit.theappbusiness.com/modular-ios-splitting-a-workspace-into-modules-331293f1090)
  
    第二部分主要描述了如何让将一个项目拆分出一个模块的实战演练。

- [Modular iOS Part 3: Configuration & Testing of Modules](https://edit.theappbusiness.com/modular-ios-part-3-configuration-testing-of-modules-2f287b19eeef)
  
    第三部分主要是模块化测试相关的内容，通过 CocoaPods 对不同的模块进行依赖配置，并将测试模块作为主项目的一个模块，并支持多个模块复用一块测试逻辑。

- [Modular iOS Part 4: Sharing Configuration Between Modules](https://edit.theappbusiness.com/modular-ios-part-4-sharing-configuration-between-modules-b08a31490447)
  
    最后一部分描述了如何解决不同模块之间传递配置信息。作者使用一个面向协议的方式去解决不同模块之间的初始化配置信息的传递问题。

上述四篇文章篇幅不大，但是每篇文章都对模块化过程中产生的问题提供了一个很好的思路，对于正在写模块化的你们来说，值得都看一遍。

### [细说 Swift 4.2 新特性：Dynamic Member Lookup](https://www.jianshu.com/p/13e6aa1ad584)

Swift 4.2 中新增加的 dynamic member lookup 对 swift 未来的动态特性有着很大的影响。同时也增强了和动态语言如 python 和 js 的交互。是个值得关注的新特性。

## 设计

### [【国内首发 + 中国价】Design+Code 绝佳 iOS 设计和开发教程一年订阅](https://h5.youzan.com/v2/goods/36abe77d0mm0u)

Design+Code 系列教程教你从 0 到 1 设计、开发一款完整的 [iOS app](https://itunes.apple.com/cn/app/design-code/id1281776514?mt=8)，非常适合希望入门设计或编程的朋友，包括 Sketch、Swift 4、Xcode 9、CocoaPods、Core Data、Realm、动画、SpriteKit、TestFlight、发布 App 到 App Store 等等内容，不仅有文字教程，还有超过 40 小时的视频课程以及 10GB 可供下载的资源文件。

## 工具

### [Mac Bootstrap](https://github.com/bestswifter/macbootstrap)

这是一个针对新 Mac 开发的，快速配置开发环境的脚本，里面集成了一些常用的配置。所有的配置和功能都有文档说明， 它既是使用手册，也是教学指南。

虽然环境配置是一件非常主观的事，不同的人审美和需求不一样，但也可以看看文档，了解一些好玩的用法，看看它是怎么实现的，然后把部分函数抄走并提高自己的工作效率。

### [Sonar](https://fbsonar.com/)

Facebook 出品，一个可扩展的移动应用调试工具，同时支持 iOS 及 Android，让你能够从桌面可视化地控制你的应用。Sonar 基于插件化设计，已经内建了 Logs (日志)、Layout Inspector (布局检查器)、Network (网络检查器)。当然，你也可以自己为其编写插件来满足自身业务需求。不过当前[还没有支持 Swift](https://github.com/facebook/Sonar/issues/13)，项目中全面使用 Swift 的同学还得再等等。

### [在线 AI 生成 LOGO](https://app.brandmark.io/v2/)

相信每位开发者都有会自己做的应用却不会自己做 Logo 的窘境，也更不希望和不靠谱的收费设计师来回扯皮，那么快让这款 AI 工具来帮助你。输入名称、标语、关键词并选择配色方案，然后等待数秒，就会得到若干个基于你配置的设计结果，总有一款适合你。

## 音视频

### [Swift Unwrapped #62: Interview with Ted Kremenek](https://spec.fm/podcasts/swift-unwrapped/154699)

这期 Swift Unwrapped 采访了 Swift 的核心团队负责人 Ted，主要讲了 Swift ABI 相关的内容，很大的篇幅都在讨论 ABI 稳定的概念以及影响，例如 ABI / API / Module Stability 的概念和区别，Swift Runtime 跟系统的交互，以及 Swift 稳定对于操作系统 SDK 开发的影响。

## 内推

### [字节跳动](https://job.toutiao.com/society) 北京 iOS 团队持续招人中

这是一家非常年轻的创业公司，充满活力与激情，只招优秀的人，一起做有挑战的事情。直接内推可以将简历及心仪岗位发送至我的邮箱 raozhizhen@bytedance.com，或者添加我的微信 jingmu1994 了解更多公司信息。有需要的我也可以直接帮你对接技术 Leader 详聊。

### [深圳头条研发中心诚招各路 iOS 好手一起做取悦自己的项目](https://job.toutiao.com/2018/spring_referral/?token=alPR8WCv8nnnc5QqtsyKjw%3D%3D&key=MTY1MDMsMTg0MTQsMjA1MjAsMTk1NjEsMTU2ODksMTc0ODk%3D)
如想了解更多深圳头条的信息，可以加小T微信：tomtan，切磋技术和聊情怀都可以喔~~~~

### [杭州/广州/深圳 奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)
奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。Mesh 在运用 yarn, rollup, vue 等技术栈的同时，利用 Couchbase 设计多端数据同步方案，并深入研究 React Native。也可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

## 关注我们

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

![](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)，[@EyreFree](https://weibo.com/eyrefree777)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@Parsifal](https://weibo.com/parsifalchang)， [@叶孤城](https://weibo.com/u/1438670852)，[@aaaron7](https://weibo.com/aaaron7)，[@方秋枋](https://weibo.com/100mango)，[kyo](https://github.com/KyoLi)，[tom510230](https://xiaozhuanlan.com/u/6682065345)，[anotheren](https://anotheren.com)

## 说明

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

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