# 老司机 iOS 周报 #16 | 2018-04-23

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/raw/master/assets/ios-weekly.png)

老司机 iOS 周报，只为你呈现有价值的信息。

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

## 专栏
### [钟颖的开发笔记](https://xiaozhuanlan.com/devnotes)

钟颖前后供职于腾讯、阿里巴巴、微软，同时也是业内知名的独立开发者，个人开发过 Pin，JSBox 等备受好评的高质量应用。『钟颖的开发笔记』记录了他的一些开发经验与技能，内容主要有：

- 独立开发经验（Pin & JSBox）
- 通用编程技能
- 大公司面试与研发流程（BAT & 微软）
- iOS 与 Mac 领域相关技能
- 我的应用相关的故事

比如本期周报的[『JavaScriptCore 与 Promise 那点事』](#-javascriptcore-与-promise-那点事)就是出自他的小专栏，专栏内已产出 6 篇心得，目前仅需 ¥64 即可订阅。

## 新闻

### [非 Touch Bar 版 13 寸 MacBook Pro 存电池隐患，苹果将免费修理](https://www.apple.com/cn/support/13inch-macbookpro-battery-replacement/)

> Apple 已经确定，少数 13 英寸 MacBook Pro（无触控栏）电脑的某个组件可能会出现故障，导致内建电池发生膨胀。这并不是安全问题，Apple 会免费更换符合条件的电池。受影响的设备生产日期在 2016 年 10 月至 2017 年 10 月之间，根据产品序列号确定电池是不是符合更换条件。

## 文章

### 🐢 🌟 [深入理解 iOS Rendering Process](https://juejin.im/post/5ad3f1cc6fb9a028d9379c5f)

文章深入的介绍了一下 iOS 的渲染机制，从整体的 iOS 渲染架构总览，到 OpenGLES 与 Core Graphics 的渲染管道，再到渲染提交前的 Layout Display Prepare Commit ，最后又介绍了一下 animation 的动画实现，更深刻的了解了渲染机制有助于在日常的开发工作中遇到渲染性能问题时，能够梳理归纳检测问题代码的思路。

### 🐕 [JavaScriptCore 与 Promise 那点事](https://xiaozhuanlan.com/topic/9631852407)

文章使用 [JavaScriptCore](https://developer.apple.com/documentation/javascriptcore) 构建一个 JavaScript 和 Native 代码混合的环境。为了解决 JavaScript 里的 [Callback Hell](http://callbackhell.com/) 引出 [Promise 对象](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)，并实现一个 Native 的 [Thenable](https://javascript.info/promise-chaining) 对象，达到在 Native 环境下实现 Promise 的函数的效果。

### 🐕 🚧 [Conditional conformances in Swift](https://medium.com/@johnsundell/conditional-conformances-in-swift-f6601d40aabb)

介绍了 Swift 4.1 新引入的特性 Conditional Conformaces 的基本用法以及优势，并分析了两个实用场景：递推设计（Recursive design）和多重请求（Multipart request）。

### 🐢 [Behavior-Driven Testing Tutorial for iOS with Quick & Nimble](https://www.raywenderlich.com/182118/behavior-driven-testing-tutorial-ios-quick-nimble)

相比于传统的 UI Testing，行为驱动测试（BDT，Behavior-Driven Testing，类似的概念还有用于软件工程开发领域的 BDD，Behavior-Driven Development）只专注于 App 在某一操作后的表现行为是否如预期，而不关心表现行为具体是怎么实现的。RW 这篇文章介绍了 BDT 的概念，并通过一个例子生动形象地教学了如何使用 Quick 和 Nimble 两个测试框架进行行为驱动测试。对于想通过优化测试流程来提高项目质量的同学，这篇文章的内容很值得阅读与尝试。

### 🐎 [Video Depth Maps Tutorial for iOS: Getting Started](https://www.raywenderlich.com/185885/video-depth-maps-tutorial-for-ios-getting-started)

iOS 11 推出了一个全新的特性：针对双摄像头设备录制的视频可以提供深度信息。这对于视频处理而言是一个巨大的进步，在以前纯基于 2D 图像分析的基础上，结合深度信息可以更轻松的实现背景虚化、风格变换等很 fancy 的效果。

Raywenderlich 这篇文章介绍了这个特性的应用，文章秉承其一贯的优点：非常易读且结合实践，建议做音视频的同学可以阅读，尽早尝试在业务中应用这个新特性。

### 🐕 [实现一个自定义检查规范的 Clang 插件](https://www.jianshu.com/p/c27b77f70616?utm_campaign=hugo&utm_medium=reader_share&utm_content=note)

作者从 **给OC代码添加类型检查** 的需求入手，大致介绍了一下 **Clang 插件能做什么** 和 **Clang插件怎么去开发** 两件事情。对于想尝试 **Clang插件开发** 的人来说，是一篇不错的参考文章。

### 🐕 [What's New in Swift 4.2](https://www.hackingwithswift.com/articles/77/whats-new-in-swift-4-2)

Swift 4.2 马上要发布了，作者简单介绍了一下 4.2 已经落实的功能。

- **Enum** 新增 **CaseIterable** 协议，支持 **allCases** 属性；
- 新增编译标记 `#warning` 和 `#error`；
- 动态成员变量查找 `@dynamicMemberLookup`, 这是一个比较有意思的改动，是 **Chris Lattner** 为了支持 **Python** 而加上的。推荐阅读 - [关于这个改动的讨论](https://forums.swift.org/t/se-0195-introduce-user-defined-dynamic-member-lookup-types/8658/126)
- 布尔值切换 `toggle()`；
- 集合移除支持过滤器。

中文版可以看一下 @知识小集 的这篇 [文章](https://mp.weixin.qq.com/s/9LkThhKnjsZS6y5VmaxwcA)。

### 🐕 [metalkit.org 全站翻译](https://juejin.im/post/5a31fcdc51882531b15b8294)

推荐一个学习 Metal 的资源：[`metalkit.org`](http://metalkit.org) 有一系列 MetalKit 教程，网友 [@XanderXu](https://github.com/XanderXu) 将其翻译成中文，推荐给对 Metal 有兴趣的同学。

### 🐢 [深入剖析 JavaScriptCore](https://ming1016.github.io/2018/04/21/deeply-analyse-javascriptcore/)

现在大前端的发展大潮下，JS 与客户端结合越来越紧密，大家都知道 JS 可以任意下发代码，在运行期动态执行，这一切都是通过 JavaScriptCore 这个 JS 引擎来实现的，本篇作者会带着大家深入剖析 JavaScriptCore 最底层的工作原理，去探索 JS 代码从编译到执行都是怎样运作的，内部都包含了哪些模块，最后还介绍了除了 JavaScriptCore 之外其他的 JS 引擎。

### 🐎 [iOS 应用逆向工程资料汇总](https://everettjf.github.io/2018/01/15/ios-app-reverse-engineering-stuff/)

逆向是一个神秘有趣的领域，很多需求借助逆向可以看看其他 App 怎么实现的，这两年也有若干常用工具发生了变化，产生了一些新的工具。这篇文章总结下基础的 App 逆向的方法，也全方位收集了多种资料包括工具 / 书籍 / 文章 / 论坛。

### 🐕 [Making your iOS application easy to read with these simple steps.](https://medium.com/ios-os-x-development/making-your-ios-application-easy-to-read-with-these-simple-steps-b63067900b72)

优秀的程序员会用尽可能简单的方式来解释他们的代码，几个步骤，让你的 iOS 代码容易阅读。理解代码不应该是去理解“如何”实现的，而是要理解想要“达成”什么。

### 🐢 [How to Make a Game Like Candy Crush with SpriteKit and Swift: Part 1](https://www.raywenderlich.com/180638/how-to-make-a-game-like-candy-crush-with-spritekit-and-swift-part-1)

这个教程分为三个部分，教你如何使用 SpriteKit 和 Swift 制作一款类似 [Candy Crush Saga（糖果传奇）](https://itunes.apple.com/us/app/candy-crush-saga/id553834731?mt=8)的游戏。在这个教程中可以学习到与 Swift 有关的枚举、泛型、下标、闭包和扩展等知识，还可以学习到游戏的架构和最佳实践。

### 🐕 [RTL 适配历程](https://www.jianshu.com/p/3383ca5f6de0)

RTL 语言（如阿拉伯语）的适配一直是一个比较令人头疼的问题，本文以 [Apple 官方文档](https://link.jianshu.com/?t=https%3A%2F%2Fdeveloper.apple.com%2Flibrary%2Fcontent%2Fdocumentation%2FMacOSX%2FConceptual%2FBPInternational%2FSupportingRight-To-LeftLanguages%2FSupportingRight-To-LeftLanguages.html) 为基础同时结合作者的自身实践，从布局、手势、图片等多个方面对 iOS 9 之后的 RTL 适配做了详细的归纳与总结，同时给出了具体的示例代码，有相应需求的同学绝对不要错过。

## 工具

### [谷歌开源 iOS 辅助功能自动测试框架 GTXiLib](https://opensource.googleblog.com/2018/03/open-sourcing-gtxilib-accessibility.html)

[GTXiLib](https://github.com/SwiftOldDriver/iOS-Weekly/issues/318) 采用 Objective-C 编写，能与现存的 XCTests 测试框架整合。并在 XCTest 结束调用 tearDown 前，执行所有注册的可用性检查。当 GTXiLib 检测失败时，XCTest 的测试也会失败，两者相辅相成，能够帮助开发者更好的为每个人提供无障碍服务。

## 代码

### [JPVideoPlayer 3.0 使用介绍](https://juejin.im/post/5ad168c2518825555e5e44dd)

JPVideoPlayer 是我使用过最棒的基于 AVPlayer 的封装库。曾经在某个在足球项目中深度使用过。当时除了下载这个功能还不完善其他使用体验接近完美。比如，一句话就可以把任何 View 当做播放容器。
现在作者重构了项目的边下边播功能和 Cell 中的内嵌播放器功能。只能说，如果你的项目中有这类需求，那么 JPVideoPlayer 是不二选择。
另外，代码的结构和风格也值得阅读。

### [Swift Tagged](https://github.com/pointfreeco/swift-tagged)

同样都是 id，同样都可以用 `Int` 来表示，但用户的 id 和文章的 id 明显是不能混用在一起的，Swift Tagged 这个库就为我们提供了一种便利的类型声明方式 `typealias Id = Tagged<User, Int>`，能够让我们在编译期避免字段误传的问题。

BTW，这是 Kickstarter 两位前任工程师，创办的网站 [Point Free](https://www.pointfree.co/episodes/ep12-tagged) 出品的一部分内容。

## 关注我们

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

![](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)

## 说明

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

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