# 老司机 iOS 周报 #42 | 2018-11-05

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

## 小专栏

### [北美软件工程师面试简单介绍](https://xiaozhuanlan.com/topic/4263189057)

好多同学都比较好奇北美的软件工程的面试和国内的有什么不同，具体情况又是如何的，这篇小专栏就简单的给大家介绍了一下北美的 Software Engineer 的面试情况，有兴趣的不妨读一读了解一下。

## 新闻

### [App Store Connect API Now Available](https://developer.apple.com/news/?id=11022018)

WWDC 2018 中苹果提及了 App Store Connect 将迎来一次比较大的更新，其中有两个内容比较受国内开发者关注 - TestFlight Public Links 和 App Store Connect API。前者已经在前一段时间发布了，而后者这周也正式发布。

> 相关功能介绍可以在 [What’s New in App Store Connect](https://developer.apple.com/videos/play/wwdc2018/301/) 和 [Automating App Store Connect](https://developer.apple.com/videos/play/wwdc2018/303) 中进一步了解。

## 文章

### 🌟 🐕 [支付宝客户端架构解析：iOS 容器化框架初探](https://mp.weixin.qq.com/s/KGDD-Qe1TLzIVlDIEzM25g) 

你是否好奇一款航母级 App 他的内部客户端架构是怎样实现的？到底什么样的架构设计才能满足几十上百人共同开发迭代一款 App ？这篇文章会带大家深入到支付宝的 mPaaS 框架之中，了解一下支付宝客户端业务容器化的实践 -- 将业务隔离成相对独立的模块，而整个框架作为容器管理着众多子业务子模块，并着力追求模块与模块之间高内聚、低耦合，灵活的插件式开发。

mPaaS iOS 框架源自于支付宝客户端，为了实现这种上千个工程之间的低耦合和相关依赖调用，mPaaS 框架直接接管了 App 的生命周期，负责整个 App 启动托管、App 生命周期管理、处理与分发 UIApplication 的代理事件。mPaaS 框架提供了容器化环境，业务开发人员在这个容器化环境中使用 `微应用` 和 `微服务` 进行具体的业务需求开发。

### 🌟 🐎 [The power of key paths in Swift](https://www.swiftbysundell.com/posts/the-power-of-key-paths-in-swift)

由于 Swift 是一门追求编译时安全和静态类型的语言，它缺少其它更注重运行时的语言（Objective-C、Ruby 和 JavaScript 等）所拥有的动态特征。例如在 Objective-C 里，我们可以在运行时动态访问对象的任意方法和属性，甚至可以替换其实现。虽然动态性的缺失是 Swift 的一大优势之一，有助于写出容易预测、正确率更高的代码，但在某些时候，如果能用更动态的方式来使用代码，会很有帮助。幸运的是，Swift 正在不断推出更多更动态的功能，同时仍然保持类型安全的原则，key path 就是其中之一。在这篇文章里，会为你展示 key path 在 Swift 中的使用方式，以及利用它实现的一些强大功能。此外，还可以参考这篇文章 [Swift Tip: Auto Layout with Key Paths](https://www.objc.io/blog/2018/10/30/auto-layout-with-key-paths/)。

### 🌟 🐢 [Protocol Oriented Programming(POP) in Swift: Is it better than Object Oriented Programming(OPP)?](https://www.appcoda.com/pop-vs-oop/)

自从 Swift 2.0 引入面向协议编程（POP）这一概念以来，已经有成百上千篇关于这一概念的讨论文章，本次作者以专注编码 30 年老司机的身份，在实际开发中大量运用 POP 模式之后，写出了他心目中的 POP。本文将由以下几点展开讨论：

- 为什么 Swift 被认为是一门面向协议的语言；
- 比较 POP 与 OOP 的异同，指出他们主要区别在于能否实现多继承；
- 对比值语义与引用语义的区别；
- 分析了苹果在 WWDC 2016 提出的 “局部推断（Local reasoning）”；
- 举了 Protocol 的几个使用场景：如实现委托模式、作为类型和实现多态；
- Review 作者在 Swift 项目中的实践代码；

至于作者对 POP 最终的态度，点进来看看吧，另外有兴趣的话不妨看看作者的前一篇[关于 POP 的入门文章](https://www.appcoda.com/protocol-oriented-programming/)。

### 🐕 [React Native 重构路线图发布！](https://mp.weixin.qq.com/s/-BXsXp0HnrGMS3CLLvfEtQ)

Facebook 6月中旬发布了他们即将“大规模重构 RN” 的消息，时隔四个月，近期终于公布了他们的一些计划细节，不过大部分都是工具链，流程上的增强。颇有一种裤子都脱了就给我看这个的感觉，不知道是不是对“大规模重构”有什么误解。这些增强虽然普通开发者可能感触不深，但对于一个团队做技术选型时候肯定是有帮助的，但是不是真能抵挡住 Flutter 的冲击呢？我表示不乐观。

### 🐎 [Speeding Up Custom Script Phases](https://indiestack.com/2014/12/speeding-up-custom-script-phases/)

文章主要介绍了三种方案来加速 Xcode 自定义脚本的执行。

- 第一种：勾选配置项中的 `when installing`，标识 APP 只在 `Archive` 模式下才执行脚本。
- 第二种：添加你自己的逻辑代码来标识脚本的执行程度。
- 第三种：利用两个可选项 Input Files 和 Output Files，这两个列表中填写为文件路径或文件夹路径，它们就是 Xcode 来判断脚本是否需要执行的依据。

对于最后一种方案，文中表达不是很明确，我花了点时间做了一个实践，最后归结如下，Xcode 会重新执行脚本的条件如下：1. 两者中任一`文件`有`修改`。 2：两者中任一`文件夹`内有文件`添加/删除/替换`。

> 在 Xcode 10 之后脚本增加为4个可选项，除上面表述的两个外，还有 Input File List 和 Output File List。如有兴趣可以参考 [\[New Feature\] Generate xcfilelist for Script Build Phases](https://github.com/SwiftGen/SwiftGen/issues/441) 文中对于 File List 的看法。

### 🐎 [Running Other Apps' Siri Shortcuts Through Deep Links in Swift](https://swiftrocks.com/running-other-apps-siri-shortcuts-through-deep-links-in-swift.html)

文中作者展示了使用 Deep Link 来打开捷径的案例。通过 `shortcuts//` 这个 URL Scheme 来跳转捷径应用。若 URL 中的 Path 为 `run-shortcut` 则可以去执行捷径，当然我们可以通过参数 `name` 来指定执行对应的捷径，`input` 参数来为你的捷径增加入参，`x-success`/`x-cancel`/`x-error` 参数来为你的捷径提供执行状态的回调处理。此外，作者还介绍了具有导入功能的捷径 URL 和 一些捷径 APP 的配置页面。

### 🐕 [Let's Set Up Your iOS Environments](https://robots.thoughtbot.com/let-s-setup-your-ios-environments)

本文介绍了一些对于新手来说非常实用的 Xcode Project 设置的小知识：使用 .xcconfig 文件来合理设置工程。这东西可能在工程体量还不是很大的时候，显得不是那么的重要，但是当工程逐渐变大，结构也变的越来越复杂的时候，有一个清晰合理的结构，容易配置的工程对整个团队来说都是一个福音。

### 🐕 [Text Kit Tutorial: Getting Started](https://www.raywenderlich.com/5960-text-kit-tutorial-getting-started?utm_source=mybridge&utm_medium=blog&utm_campaign=read_more)

`TextKit` 是 iOS 7 开始推出的图文混排框架，其基于底层的 `CoreText`。`UIKit` 中的 `UILabel`、`UITextView`、`UITextField` 都构建在 `TextKit` 之上。本文介绍介绍了两部分内容：如何适配 `Dynamic Type` 特性；如何实现图文混排及文字环绕图片布局。

### 🐕 [【基本功】深入剖析Swift性能优化](https://mp.weixin.qq.com/s/U95QmOOjeXkk-yC23cuZCQ)

这篇文章的核心内容出自 [Understanding Swift Performance](https://developer.apple.com/videos/play/wwdc2016/416/)，主要讲了 Swift 的一些优势以及苹果做了哪些方面的优化。所以推荐每个 Swift 的开发者都要仔细看一下这个 Session 的内容。

当然，因为 Swift 在不断的优化，视频内容的部分东西已经有点点过时了。我稍微补充一下：

- Existential Container 目前虽然是用 3 个 word 存储数据，但是在 ABI 稳定之前，这个大小一直还没有确认。同时，文中所说的 Existential Container 是 5 个 word 也不太恰当，更合理的是大于 4 个 word。比如 `Any` 的 Existential Container 只有 4 个 word，而 `Codeble` 的 Existential Container 大小为 6 个 word。
- 其次，对于 Indirect Storage With Copy-On-Write 的说法，在 [Understanding Swift Performance](https://developer.apple.com/videos/play/wwdc2016/416/) 指的是 Swift 3 的时候，类似于 Array 这类基础库的大数 struct 如何解决 Copy 问题。而不是对于所有 struct 实现了这个 COW。但是 Swift 4 的时候，苹果改变了策略，在编译器这边做了一定的优化，实现了“自动”实现 COW。

### 🐕 [One Quick Way to Drastically Reduce your iOS App’s Download Size](https://medium.com/@michael.eisel/one-trick-to-drastically-reduce-your-ios-apps-downlsize-ae68aad0d369) 

大家都知道，app 的下载体积越小，用户需要等待的时间就越短，尤其是对于用 Swift 开发的 app，体积动辄几十兆，令人头疼。本文作者分析了影响 app 体积的几个方面和一些优化的方法，包括 bitcode、使用 xcrun 命令分析各部分所占空间等等。

### 🐕 [深入理解 Autolayout 与列表性能 -- 背锅的 Cassowary 和偷懒的 CPU](https://juejin.im/post/5bd5a546f265da0af033cee6) 

Autolayout 的性能一直为人所诟病，也是列表卡顿的原因之一。本文作者从 Autolayout 的算法角度进行分析，介绍了 Cassowary 的基本原理，并根据文字渲染结果做了一些详细的测试，判断性能问题是苹果实现不当所致，而不完全是算法的原因。最后也介绍了作者自己实现的 Panda 框架，基于 Autolayout 算法的概念进行优化，感兴趣的朋友可以试一下。

### 🐎 [Class written in Swift](http://yulingtianxia.com/blog/2018/10/28/Class-written-in-Swift/)

纯 Swift 类的函数调用跟 OC 中的运行时消息发送机制是不同的，是在编译阶段就确定了调用哪一个函数。虽然 Runtime 的接口可以使用，但是却并不能保证返回结果的正确性。作者在自己写的某个开源库上的一个 issue，由于和 Swift 类有关，研究了下 Swift 编写的类。对于在使用 Swfit 过程中，在 Debug 或者其他情况有疑问的同学，可以看一下本文的分析。

### 🐕 [Specializing protocols in Swift](https://www.swiftbysundell.com/posts/specializing-protocols-in-swift)

这周的 Swift by Sundell 介绍了一个很有趣的泛型功能 —— 泛型协议特例化。这是 [Swift 4 时引入的功能](https://github.com/apple/swift-evolution/blob/master/proposals/0142-associated-types-constraints.md)，让我们在继承泛型协议的同时约束 associatedType 的类型，听起来很拗口难懂，目前在标准库里有一个非常标准的示例 `SubSequence`，大家一看就能理解：

```swift
protocol Sequence {
    associatedtype SubSequence : Sequence
    ...
}

protocol Collection: Sequence where SubSequence: Collection { ... }
```

`Collection` 通过 `where` 从句对子序列的类型进行约束，让 `Collection` 的子序列必须也遵循 `Collection`（而不只是 `Sequence`）。

如果你觉得这个例子离业务太远的话，那就可以看看 Sundell 在文章里介绍的一些离业务更近的用例。

## 工具

###  [iOS Project Template](https://github.com/messeb/ios-project-template) 

这是一个可进行代码签名、持续集成、项目分发的项目模版。它为新项目提供了一个起点，可以方便的进行项目构建。这个模版中提供了一个 `Core` 框架，要想用于自己的项目，还需要修改一些文件的某些配置和内容。感兴趣的朋友可以试试看，或许它能够帮到你。

### [Eliminate Unused Swift Code](https://peripheryapp.com)

这是一个可以移除 Swift 项目中所有没用到的代码的工具，帮助你把项目变得更加干净。注意目前版本的 CocoaPods(1.5.3) 会导致它不能正常工作，升级到 1.6.0.beta.2 即可。这个工具免费即可使用，但是充钱可以变得更强。

## 代码

### [CodyFire](https://github.com/MihaelIsaev/CodyFire)

CodyFire 是基于 Alamofire 的 Codable 协议 API 请求管理库，使你庞大的网络请求代码，变的更简洁，易于维护。Swift 由于类型安全的特性，对于像 JSON 这类弱类型的数据处理一直是一个比较头疼的问题。Swift 4 中新增的 Codable 协议解决了字典与模型之间转换的问题，Codable 协议也让 API controller 的构建代码变的十分优雅。 CodyFire 能自动根据所运用的环境，切换 baseURL，能方便的添加公共头、对异常状态统一处理、对请求进行取消、设置超时，或者预防请求返回过快，添加交互式延时（不用再担心，网络太快，等待动画没有很好的执行。小编和 CodyFire 作者都非常喜欢这个功能）。还能串行或并行，使用链式调用进行多个请求，并对结果进行统一处理。

## 内推

- [北京-百度网盘 持续招 iOS 开发](https://talent.baidu.com/external/baidu/index.html#/jobDetail/2/102507)：社招、应届、实习均可。项目在技术上很有挑战性，团队技术氛围极好。诚心希望各路大神前来切磋，也欢迎计算机基础好的小白来共同学习。简历发邮箱 xuyafei01@baidu.com，暂不考虑的也欢迎微博私信 [@小非86](https://weibo.com/xuyafei86) 聊聊~

- [北京-蚂蚁金服 招iOS/安卓/前端开发](https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP031268&from=timeline&isappinstalled=0)：负责支付宝会员及帐号业务线，地点北京国贸，金台夕照地铁站出口 100 米。有兴趣的同学欢迎将简历发送到：weijing.wdf@alibaba-inc.com / weijing.wdf@antfin.com （同一个邮箱）或者微博私信 [@折腾范儿_味精](https://weibo.com/agvicking) 了解情况。

- 上海即刻：如果你认识聪明勤奋、胆大心细、有追求的工程师，那就来加入我们吧！任何推荐或简历可直接发给 Jason（即刻 iOS leader）: jasy@okjike.com，或微博 [@JasonYuh](https://weibo.com/jasonyuh)。

- [杭州奇志科技招聘 iOS、前端](https://www.lagou.com/gongsi/34872.html)：奇志科技自 2016 年起通过行业无人机协同工作流 Mesh 进入物联网与人工智能领域， 并成功为房地产、建筑、测绘、电力巡检等行业提供无人机解决方案。感兴趣可以微博上私信 [@没故事的卓同学](https://weibo.com/u/1926303682) 了解。

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

- [北京字节跳动 iOS 团队持续招人中](https://job.toutiao.com/society)：简历可以发送到邮箱 raozhizhen@gmail.com，或者添加我（[@AidenRao](https://weibo.com/AidenRao)）的微信 jingmu1994 了解更多公司及岗位信息。

- [北京百度教育事业部招 iOS 开发](https://www.baidu.com/s?wd=百度)：百度教育事业部，地点：北京西二旗。部门下面有百度阅读，百度文库，百度爱听等 App 产品。团队技术氛围浓厚，有兴趣的同学欢迎将简历发送到我的邮箱：lizelei@baidu.com。

## 关注我们

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

![](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://kemchenj.github.io)，[@享耳先森](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)，[kyo](https://github.com/KyoLi)，[tom510230](https://xiaozhuanlan.com/u/6682065345)，[anotheren](https://anotheren.com)，[水水](https://www.xuyanlan.com)，[looping](https://github.com/looping)，[@JasonYuh](https://weibo.com/jasonyuh)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)，[@红纸](https://github.com/nianran)，[@含笑饮砒霜](http://chinafish.news)，[@JimQ](https://github.com/waz0820)

## 说明

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

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