# 老司机 iOS 周报 #29 | 2018-07-30

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

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

## 新闻

### [Mattt 和一些国内开发者一起重启了 NSHipster.cn](https://github.com/NSHipster/articles-zh-Hans)

自 Mattt 今年从苹果离职并重新投入到开发社区后，先后创建了 [@Flight-School](https://github.com/Flight-School) 和重启了 [@NSHipster](https://github.com/NSHipster) 的更新。而就在上周，有心的开发者会发现 NSHipster 的中文版仓库也开始有更新了，Mattt 已经确认将会和中国开发者一起完成 NSHipster 的翻译工作（[详见这里](https://github.com/SwiftOldDriver/iOS-Weekly/issues/584)）。目前一些旧的文章正在进行一些审校更新工作，相信新的文章也很快会完成翻译更新。同时，也欢迎有能力和精力的开发者一起投入到 NSHipster.cn 更新维护中来！


## 文章

### 🐎 [Updating Strings For Swift 4.2](https://useyourloaf.com/blog/updating-strings-for-swift-4.2/)

Swift 4.2 中的 String 只有一个属性 `characters` 被标记为废弃，因为从 Swift 4 开始 String 已经是集合类型，所以直接删掉 `characters` 属性即可。

一个改进是原来只有获取第一个元素的方法： `first(where predicate: (Character) throws -> Bool)`，在 4.2 中增加了获取最后一个元素的相关方法： `last(where predicate: (Character) throws -> Bool)`, `lastInex(of: Character)`。为了方法名称的统一，原来的`index(of: Character)`重命名为 `firstIndex(of: Character)` ，但是原来的方法名依然可以正常使用，推测下一个大版本 `index(of: Character)` 会被标记为废弃。


### 🐕 [Snapshot Testing on iOS](https://ashfurrow.com/blog/snapshot-testing-on-ios/)

Snapshot Testing on iOS （快照测试）是这样一个想法：拍摄用户界面的屏幕截图并将其存储为参考图像。然后进行单元测试以获取同一 UI 的屏幕截图并将其与参考图像进行比较, 基于此想法应运而生的工具有很多，其中由 Facebook 创建 Uber 维护的 [iOSSnapshotTestCase](https://github.com/uber/ios-snapshot-test-case) 测试框架使这个过程变得非常容易 。
本文作者萌生了在项目中使用快照测试的想法而发起了这个关于快照测试的的讨论，并且整理出了一系列优缺点，对快照测试感兴趣的朋友可以关注下哦~

### 🚧 🐎 [RESTful API Design — Step By Step Guide](https://hackernoon.com/restful-api-design-step-by-step-guide-2f2c9f9fcdbf)

Restful API 的设计对于很多客户端工程师来说可能有一点陌生，但其实这些设计原则不仅仅可以用来指导服务端接口的设计，客户端的一些公用组件的设计依然可以参考其规范来提升可理解性、可复用、可扩展性等方面。本文首先介绍了 restful 接口实践的标杆 - Amazon 的一些经验，然后重点介绍了几个设计的关键原则，其中提到，优先使用名词，而不是动词来命名接口，相信是绝大多数从 C 语言和面向过程编程开始入门的程序员经常犯的错误。文章措辞简练，读起来很轻松，举例也很生动，推荐阅读。

### 🐢 [iOS 启动时间优化](http://www.zoomfeng.com/blog/launch-time.html)

标题虽短但这篇文章却是小编阅读过对 iOS App 启动时间分析和优化类最为系统透彻的。该文从 App 启动的两个阶段 - 『**pre-main 阶段**（点击桌面图标到 main 函数被系统调用这段时间）』和『**main 阶段**』分别进行原理剖析，并对一些涉及到的概念进行释疑，而后针对剖析出的可优化点结合实际项目进行优化实践。其中 pre-main 阶段的优化主要基于 linkmap 分析各个静态库依赖包大小并针对性瘦身，而 main 阶段的优化主要是减少阻塞主线程的任务。

整篇文章阅读下来，会对 iOS 中 App 的启动有一个很清晰深刻的认识，对我们自己动手进行启动时间优化很有参考意义。

### 🐕 [Swift HTTP Server 开发体验](http://posts.enumsblog.com/posts/18014)

从 Swift 开源并支持 Linux 运行之后，Swift Server API 趋热，先后出现了 `Perfect`、`Vapor`、`Kitura` 和 `Zewo` 几个框架。

本文作者使用 `Perfect` 开发了一个 `以 MySQL 和 HDFS 作为支撑，应用了包含 Web 服务、JSON 接口服务、以及基于 Socket 的文件传输和视频直播流服务的项目` 给大家讲解开发体验及部署过程，并介绍如何接入第三方服务(以 `MySQL` 和 `HDFS` 举例)。

### 🐎 [Custom Types for Powerful Matching](http://www.figure.ink/blog/2018/7/23/custom-types-for-powerful-matching)

我们经常会遇到关于 url 解析的场景，输入一个 url，输出跳转的目的地，来实现类似路由的功能。作者利用了 Swift 的强类型、模式匹配和运算符重载的特性，给出了一个相对优雅的解决方案，逻辑清晰易懂，相信会对大家会有所启发。

### 🐕 [Conditional Compilation in Swift, Part 1](https://davedelong.com/blog/2018/07/25/conditional-compilation-in-swift-part-1/)

本文讲述了 Swift 中方的条件编译。当然首先是传统的方法 `arch()`，作者对各个参数都做了详细的介绍。不过随着 Swift 4.1 的到来，你更应该了解一下方便好用的 `targetEnvironment()`([SE-0190](https://github.com/apple/swift-evolution/blob/master/proposals/0190-target-environment-platform-condition.md))。其次是使用配置文件（`.xcconfig`），这个方式其实被 CocoaPods 大量使用。作者也用示例做出了详细的介绍，同学们不妨也在自己的工程中试一试。

### 🐕 [让你的 Swift 代码保持良好的向后兼容性](https://www.swiftbysundell.com/posts/writing-backward-compatible-swift-code)

重构是代码构建过程中不可避免的一个阶段，尽可能保持 API 的稳定对于平稳的迁移是一件很重要的事情，这周的 Swift Sundell 就介绍了一些保持语法稳定的重构技巧，Swift 由于其良好的语法设计，可以在修改接口的同时保持语法的向后兼容性，这篇文章里挖掘了很多相关的语法特性，强烈推荐大家阅读！！！

### 🐕 [Better iOS projects: Getting (nearly) rid of Xcodeproject - A (not so) short Introduction to Xcodegen](https://www.number42.de/blog/2018/07/24/xcodegen-article.html)

在我们日常开发中，绝大部分情况都是手动创建和维护`.xcodeproj`文件。但是在团队开发中，我们经常需要处理项目文件冲突，维护依赖也是一件比较麻烦的事情。本文则是介绍了`Xcodegen`这一工具。通过创建一个描述文件，就可以自动生成项目文件，和管理依赖。

### 🐕 [Password Rules / UITextInputPasswordRules](https://nshipster.com/uitextinputpasswordrules/)

自 iOS 8 以来，Safari AutoFill 已经能够生成随机密码，但只能生成字符加数字（顶多中间补点横杠）。Apple 在 iOS 12 中的 Automatic Strong Passwords 解决了这个问题，其中包括一个新的 UITextInputPasswordRules API，以及其他一些密码管理功能，包括验证码自动填充和联合身份验证。UITextInputPasswordRules API 可以用来指定服务需要的特定密码规则，例如必须的字符种类、允许的字符种类、允许的最大连续字符数、最小密码长度、最大密码长度。但这个 API 是 String Base  的，可以使用更加安全的枚举形式改造一下。

### 🐕 [NSHipster.cn：WKWebView](https://nshipster.com/wkwebview/)

Mattt 重启了 NSHipster.cn 之后，更新了一篇关于 WKWebView 的旧文，列举 WKWebView 与 UIWebView API 差异，还有一些 iOS 11 之后的新特性，包括内容过滤规则，浏览器截屏等等。本次 Mattt 更新文章一大原因就是 iOS 12 苹果将 UIWebView 标记为 deprecated ，还未尽快升级 WKWebView 的朋友们，可以看看 Mattt 的这篇文章复习一下。


## 代码
### [DBDebugToolkit](https://github.com/dbukowski/DBDebugToolkit) | [Wormholy](https://github.com/pmusolino/Wormholy) |  [GodEye](https://github.com/zixun/GodEye)

最早看到监控或是 Debug 类 SDK 完整功能的实现是子循的 Godeye ，最近似乎此类 SDK 又重新被大家关注起来了。

这里提供了几个最近比较有代表性的库的链接，大家可以了解一下。

## 书

### [iOS 面试之道](https://item.jd.com/12403068.html)

故胤道长和唐巧合著的这本《iOS 面试之道》终于在长时间的等待后上架了。

唐巧从他多年招聘经验出发，给出了诸多面试流程，简历修改，Offer 选择的知识，而故胤道长则是从他多年在北美的 iOS 面试经验出发，给出了具体的算法及 iOS 基础指示的准备。

相信读完本书，您一定能对 iOS 面试有一个更深刻的理解和认识。

## 音视频

### 🚧 [Appdevcon 视频](https://vimeo.com/appdevcon)
Appdevcon 是由 App 开发者组织，面向 App 开发者的技术大会，它的前身是 mdevcon。他们目前已经把今年大会上的所有演讲视频都上传到了 vimeo，供大家免费观看学习。当然也可以对照[日程表](http://appdevcon.nl/schedule/)，选自己感兴趣的主题看。

## 内推

### [北京-蚂蚁金服 招 iOS/安卓/前端开发](https://job.alibaba.com/zhaopin/position_detail.htm?trace=qrcode_share&positionCode=GP031268&from=timeline&isappinstalled=0)

蚂蚁金服招聘，负责支付宝会员及帐号业务线，地点北京国贸，金台夕照地铁站出口 100 米。虽然招聘链接只给了 iOS 的 JD，但前端/安卓/iOS 都要，要求相近。有兴趣的同学欢迎将简历发送到：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@bytedance.com，或者添加我（[@AidenRao](https://weibo.com/AidenRao)）的微信 jingmu1994 了解更多公司及岗位信息。


## 关注我们

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

![](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)，[@享耳先森](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)，[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)

## 说明

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

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