# 老司机 iOS 周报 #59 | 2019-03-18

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

**热烈欢迎周报团队的第 30 个编辑 - [@极速男孩](https://github.com/ztlyyznf001)！**

## 新手推荐

在年前我们做了一次问卷调查，我们很重视这次问卷结果，专门组织了一次集体语音会议对问卷中反馈的问题和建议进行了讨论。其中很多读者希望我们能够推荐一些对新手更加友好的内容，在接下来的时间里，我们会尝试收录一些对新手入门更友好的文章，[**也欢迎广大读者自荐这部分内容**](https://github.com/SwiftOldDriver/iOS-Weekly/issues)，由于是新手向的，我们对此类文章的深度要求并不高，能通俗易懂地介绍分析某个知识点，利于新手吸收，我们都会考虑收录。

### 🌟 [Help! My app freezes but no error appears](https://fluffy.es/help-my-app-freezes/)

这是一篇非常有趣的关于 “入门 iOS 并发编程” 的文章。作者从一个新手容易碰到的 “界面卡死不响应了” 的问题入手，层层分析了这个问题产生的本质是 - UI 线程即主线程被耗时任务阻塞导致。如果你是一位以 iOS 为入门的新人开发者，这篇文章将能帮助你第一次认识到 iOS 中为主线程减负的重要性，也会为你打开 iOS 并发编程的大门。

> 编辑寄语：可能这篇文章对新手最不友好的一点是它是一篇纯英文的，但作为一名开发者，我觉得一定不能排斥英文。作为 iOS 开发者最好的入门教程是苹果的开发文档和所有 API 文档，都是纯英文的。当然，如果你觉得需要从新手继续进阶，戴铭老师「iOS 开发高手课」将会十分适合你，[点我试读或购买，然后添加微信 AwayZ_T 返还小红包并邀请进入周报读者群和大家一起学习，老司机喊你快上车~](http://gk.link/a/102wQ)。

## 新闻

### 🌟 [WWDC 2019](https://developer.apple.com/wwdc19/)

一年一度的苹果生态开发者盛会又要来了。

WWDC 今年会继续在圣何塞会议中心进行，时间是 6 月 3 日到 6 月 7 日。

今年的主题是 `Write code. Blow minds.`。按照目前流出的信息，今年软件更新的重头戏会在 iOS 13 上，iOS 会有一次非常大的 UI 更新。另外硬件方面，今年也很可能会在 WWDC 上发布模块化的 Mac Pro。

一如既往，WWDC 的门票价格是 1599 美元，票价并没有包括食宿，机票等的费用。如果你有兴趣参加，或者是公司有这个福利的话，需要在 3 月 20 日前去官网注册，苹果会在 3 月 21 日公布抽签结果。

预祝各位参与抽签的读者朋友们好运。

## 文章

### 🌟 🐕 [Why using isEmpty is faster than checking count == 0](https://www.hackingwithswift.com/articles/181/why-using-isempty-is-faster-than-checking-count-0)

`Swift String` 中为什么使用 `isEmpty` 会比判断 `count == 0` 快？该文作者从 `count` 的工作原理中进行分析和对比。
- `Swift` 字符串是复杂的字符集合，单个字符可能是由多个字符进行组合形成，例如 `🇬+🇧=🇬🇧`，但是 `"🇬🇧".count == 1`。每次检查一个字符所需要的最长时间为 `O(n^2)`，因此如果计算的 `String` 很长，则 `count` 会需要较长的计算时间。
- `isEmpty` 的计算则是检查 `String` 起始索引等于结束索引则为空，时间为 `O(1)`。

同时作者提醒，在 `arrays, sets, dictionaries` 没有这种情况。但是建议使用 `isEmpty` 去判空，语义更为清晰，并且有利于 `String` 习惯用上 `isEmpty` 而不是`count`。`SwiftLint` 和 `SwiftFormat` 都有检查该情况。

### 🌟 🐕 [Websites using Swift and AWS Lambda — Part 1](https://www.jasonzurita.com/websites-using-swift-and-aws-lambda/)

本文介绍了如何用 Swift 轻松、愉快地编写并部署一个轻量网站。

1. 使用 Swift + HTML + CSS 编写网站可以充分利用 Swift 的语言优势，例如代码更安全、更容易理解，写起来也更有意思。
2. 使用 Lambda、Layers、API Gateway 以及 Certificate Manager（可选）在 AWS 上免费部署（每个月 100 万次免费请求）。
3. 易于部署和更新，只需要更新 AWS Lambda 函数即可！
4. 网站是动态生成的，也就是说可以在查询数据库、调用另一个 Lambda 函数并请求 API 之后将网站组合起来。
5. 不需要管理传统的、有时会非常麻烦的 JavaScript 依赖。
6. [示例网站](https://swift-aws-lambda-website.jasonzurita.com/)是第一个使用 Swift + AWS Lambda 的网站。

### 🚧 🐕 [Swift Localhost: Making XCUITest Great Again](https://medium.com/quick-code/swift-localhost-making-xcuitest-great-again-115d93954cf1)

关于 UI 自动化测试，特别是对网络请求处理的文章以前有过不少推荐，比如 [第 41 期](https://github.com/SwiftOldDriver/iOS-Weekly/releases/tag/%2341) 的 [iOS UI Automation Tests at Babylon](http://ilya.puchka.me/ios-ui-automation-tests-at-babylon/)，[第 56 期](https://github.com/SwiftOldDriver/iOS-Weekly/releases/tag/%2356) 的 [Painless UI Testing in iOS: Mocking the Network](https://code.egym.de/painless-ui-testing-in-ios-part-1-mocking-the-network-ffbd6ab4809a) 等。

本篇文章对改善 UI 自动化测试的思路是通过搭建本地服务（localhost），再将网络请求重定向到本地的方式来做的。同时这篇文章也是作者在 [iOSConfSG 2019](https://2019.iosconf.sg) 上分享的内容，总结了使用 4 个简单步骤就能在工程里搭建基于本地服务的 XCUITest：

1. 通过 CocoaPods 集成 [SwiftLocalhost](https://github.com/depoon/SwiftLocalhost)（作者自己维护的），编写代码配置本地服务
2. 把代码里的网络请求重定向到本地服务上
3. 在 Info.plist 里设置 ATS 配置，允许访问本地网络
4. 最后就是编写测试代码，模拟请求响应的数据

这里有亮点的地方是集成 SwiftLocalhost 后就不需要太操心服务端相关的事情，用例写完直接 `command+u` 就可以开始测试了，可以避免像环境配置、网络异常等问题，让开发者更专注于模拟测试数据，保证测试流程在可控范围内。

### 🐢 [如何自建 Crash 平台](https://www.xuyanlan.com/2019/01/14/iOS-crash-report/#more)

本文介绍了如何对非符号化的崩溃进行符号化，并介绍一些工具和脚本对崩溃报告进行符号化的操作。并实现了自己的 macho 解析工具和 crash 分析平台：

1. 通过 dSYM 文件对崩溃信息进行分析，从而得到他的具体的堆栈地址和偏移地址。
2. 分别通过 ATOS , lldb , Dwarfdump 对崩溃报告进行符号化。
3. 分别用 dwarfdump 和自己实现的 atosl 脚本，对崩溃进行做符号化。并尝试去搭建一个自己的 crash 分析平台。

### 🐕 [Linking Objective-C Code](https://pewpewthespells.com//blog/objc_linker_flags.html)

本文首先简单介绍了链接器，库，二进制文件，符号，选择器和编译器的相关知识作为铺垫，然后介绍了 Objective-C 程序的链接过程，并且解释了 ``-all_load``，``-Objc`` 以及 ``-force_load`` 三种常用链接标志在链接过程中所起到的的作用。

### 🐕 [一个在 Objective-C 和 Swift 中实现剖面导向编程的故事](https://juejin.im/post/5c86be73f265da2dd94ce3b3)

苹果官方并不支持 AOP？非也。看作者带你走过一段从分析 KVO 原理到设计通用的 AOP 框架的历程。
全文重在设计过程，用植物嫁接打比方，金句不断，细读颇具趣味。

> 注：剖面导向编程 == 面向切面编程 == AOP(Aspect Oriented Programming)

### 🐎 [PSPDFKit and Swift](https://pspdfkit.com/blog/2019/swift-and-pspdfkit/)

PSPDFKit for iOS 是用 C、C++、Objective-C(++) 开发的大型项目。在这篇文章里，PSPDFKit 官方亲自讲述作为 SDK 开发商对于 Swift 的看法，大家都在拥抱 Swift，为何 PSPDFKit ofr iOS 还是坚持使用 Objective-C？在即将正式发布的 Xcode 10.2 中，Swift 5 将包含稳定的 ABI，PSPDFKit for iOS 是否会迁移到 Swift？作者详细分析了 Swift only 的优点和缺点，并得出结论：我们很热爱 Swift，在很多项目里采用了 Swift 语言，并且不断为 Swift 编译器贡献新功能，但 Swift 并不适合我们的 SDK，在可见的将来里，我们会继续坚持使用 Objective-C。

### 🐕 [Why we stopped using fastlane - Life in the slow lane](https://silverhammermba.github.io/blog/2019/03/12/slowlane)

> 相信现在很多团队都在用 Fastlane，推荐本文是期望大家听到更多的声音。

本文作者在 2018 年写了一篇 Fastlane 的使用文章，现在，他来回顾一些 Fastlane 不好的地方：
- 没有解决 Xcode 本身的问题
- Fastlane 本身很庞大，有太多的依赖项
- Fastlane 自身有许多 Bug
- 太多人在用以至于 issue 太多，核心问题得不到解决

### 🐎 [HTTPS 温故知新（一）— 开篇](https://github.com/halfrost/Halfrost-Field/blob/master/contents/Protocol/HTTPS-begin.md)

本文是 halfrost （霜神）[HTTPS 系列](https://github.com/halfrost/Halfrost-Field/tree/master/contents/Protocol) 学习笔记的第一篇，主要介绍了以下几方面：

1. 为什么需要 HTTPS
    - HTTP 数据没有加密
    - HTTP 无法验证通信对方的身份
    - HTTP 无法防止数据被篡改
2. HTTPS 带来的好处
    - 使用 HTTP/2 获得更高的性能
    - 提高 SEO 排名
    - 更好的推荐数据
    - 更高的安全性
    - 提高网站的信任和信誉
    - HTLM5 新特性
     iOS ATS 要求
3. HTTPS 安全的本质
    - HTTPS 采用混合的加密机制，使用公开密钥加密用于传输对称密钥，之后使用对称密钥加密进行通信
    - HTTPS 通过使用 证书 来对通信方进行认证
    - TLS / SSL 提供报文摘要功能来验证完整性
4. HTTPS 中的 TLS / SSL 协议
    - TLS 记录层协议
    - TLS 密码切换协议
    - TLS 警告协议
    - TLS 握手协议
    - TLS 应用数据协议

计算机网络基础是开发者需掌握的知识，但往往会被忽略，了解这些计算机基础知识为我们构建完整的计算机知识体系颇有益处。

### 🐢 [开发小知识](https://www.jianshu.com/p/5a4ba3c165b9)

如作者言，最近一段时间面试中发现很多开发者都只停留在知道、听说过的层面，却很少能回答的好是什么、为什么。作者一口气整理了 78 个 iOS 以及计算基础相关知识点，简短明了直指关键（不错的面试指南😂），如果看完觉得 so easy，恭喜你已经脱离了知道会用的初级阶段了😇。

### 🐢 [最详细版本|UI2Code 智能生成 Flutter 代码——版面分析篇](https://mp.weixin.qq.com/s/AkTgvv0EoydRmspEyfZNGg)

AI 写代码，相信很多同学听到这个命题都会很感兴趣。UI2CODE 项目是闲鱼技术团队研发的一款通过机器视觉理解+AI人工智能将UI视觉图片转化为端侧代码的工具。本文全面分析了这个项目中 UI 前景提取和背景分析是如何做的。通过图像处理与深度学习相结合，在识别准确度，定位精度上都有了明显的提升。有兴趣的同学可以研究一下。

## 代码

### [Flare-Swift](https://github.com/2d-inc/Flare-Swift)

[Flare](https://www.2dimensions.com/about-flare) 是一款强大的设计和动画工具，可以让 app 和游戏的设计师、开发者轻松添加高品质动画。Flare 的主要功能是让设计师可以实时、直接操作最终产品中的 assets，从而实现快速迭代、避免重写代码。Flare-Swift 则是 Flare 的 Swift 运行时，可以通过 Export to Engine 来导出 Flare 文件。

## 音视频

### 🌟 [ggtalk | 聊聊跨平台：后起之秀 Flutter](https://talk.swift.gg/21)
Flutter 现在的热度自然不用多说，国内各个公司都开始了在业务肿的尝试，包括美团。本周的 ggtalk 邀请到了美团御姐(宇杰)一起深入聊了美团在 Flutter 中的相关实践，也聊了很多 Flutter 的过去、现在和将来。

## 内推

老司机周报团队联合知识小集和 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 。

## 本期编辑

[@四娘](https://kemchenj.github.io)，[@享耳先森](https://github.com/iblacksun)，[@Damonwong](https://github.com/Damonvvong)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@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)，[@老老老老老老老驴](https://weibo.com/u/6090610445)，[@小非86](https://weibo.com/xuyafei86)，[@邦ben](http://weibo.com/linwenbang)，[@红纸](https://github.com/nianran)，[@含笑饮砒霜](http://chinafish.news)，[@JimQ](https://github.com/waz0820)，[@老峰](https://github.com/GesanTung)，[@zvving](https://github.com/zvving)，[@J_Knight_](https://github.com/knightsj)，[@极速男孩](https://github.com/ztlyyznf001)

## 说明

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

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


