# 老司机 iOS 周报 #14 | 2018-04-09

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

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

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

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

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

## 老司机精选专栏

我们在小专栏上开通了一个收费专栏：[SwiftOldDriver 精选](https://xiaozhuanlan.com/olddriver-selection) 。**专栏的收入会用于周报编辑部日常运营**。平均每周专栏会更新一篇文章，**持续更新至 18 年底**。现在订阅的优惠价格为 49 元，下周价格会恢复为 59 元。如果愿意支持我们欢迎订阅，相信内容也不会让你失望。

专栏的第一篇文章 [《[译] iOS Continuous Delivery 除了 Fastlane 我们还有另外五种选择》](https://xiaozhuanlan.com/topic/3657948012) 。

## 新闻

### [允许用户管理存储在 iCloud 中的数据](https://developer.apple.com/support/allowing-users-to-manage-data/)

为帮助开发者遵守欧盟即将推出的《通用数据保护条例》(GDPR)，苹果提供相应原生 API 和 Web API，支持开发者帮助用户对 CloudKit 里的数据进行导出、限制或者删除。且当用户停用其 Apple ID 或者限制其数据时，开发者需要处理 CloudKit API 返回的错误信息。

### [CocoaPods 1.5 支持 Swift 静态库了](http://blog.cocoapods.org/CocoaPods-1.5.0/)

CocoaPods 这周更新到了 1.5，主要是加强了对于 Swift 静态库的支持，新增一个选项去自动处理 Module 头文件的搜索路径，给 Podfile.lock 增加了更多信息。正在维护开源库的同学建议仔细阅读这篇 Release Note。

## 文章

### 🐎 [Swift Tip: Capture Lists](https://www.objc.io/blog/2018/04/03/caputure-lists/)

通常我们用 `[unowned self]` 这种方式解决引用循环。其实我们也可以通过捕捉列表直接声明使用的实例，这样就不会在闭包里引用到 self：

``` swift
observation = viewModel.observe(\.navigationTitle, options: [.initial, .new]) { [navigationItem] _, change in
    guard let v = change.newValue else { return }
    navigationItem.title = v
}

```

### 🐕 [追踪 Objective-C 方法中的 Block 参数对象](http://yulingtianxia.com/blog/2018/03/31/Track-Block-Arguments-of-Objective-C-Method/)

本文创新地提出了一种监控回调 block 是否有被正确执行的解决方案 — [BlockTracker](https://github.com/yulingtianxia/BlockTracker)。通过将包含 block 参数的函数关联到特定的 tracker 对象上，就可以监听到该函数的所有 block 参数被调用、被销毁的时机甚至调用的次数。在协助我们 debug 问题的同时还能为我们分析一些黑盒函数提供参考。

值得点赞的是，本文毫不吝啬的花了很大的篇幅来讲其实现原理，对 OC Runtime，OC 与 C 交互等方面有兴趣的读者千万不可错过。（建议配合 BlockTracker 的前身：[BlockHook 介绍](http://yulingtianxia.com/blog/2018/02/28/Hook-Objective-C-Block-with-Libffi/) 一起阅读）。

### 🐕 [iOS 中的 Copying](https://joeshang.github.io/2018/04/04/ios-copying/)

本文对 iOS 开发中的拷贝做了较详实的介绍，对浅拷贝与深拷贝的概念进行了解释，并且对可变对象、不可变对象的 Copy 与 MutableCopy 操作进行了分析，同时也给出了如何进行深拷贝与为自定义类添加拷贝操作支持的方法。

### 🐢 [Calling Go code from Swift on iOS and vice versa with Gomobile](https://medium.com/@matryer/tutorial-calling-go-code-from-swift-on-ios-and-vice-versa-with-gomobile-7925620c17a4)

本文详细介绍了作者在 iOS 工程中调用 Go 的踩坑过程，主要包括以下内容：

- 一些常见错误或意外状况，以及针对它们的解决方案；
- 怎样在 Swift 中调用一个 Go 的构造函数来创造一个 Go 的结构体实例；
- 怎样在 Go 中定义一个需要用 Swift 代码来进行实现的接口；
- 将 Swift 实现传递给 Go 的构造函数，并发起双向通信。

对 Go 在 iOS 端的应用感兴趣的同学可以看一下，应该能有不少收获。

### 🐕 [在 iOS 中如何正确的实现行间距与行高](https://juejin.im/post/5abc54edf265da23826e0dc9)

`NSAttributedString` 中的行间距 lineSpacing 并不是设计师和我们通常理解的行间距，要实现和设计稿完全一致的行间距需要结合使用 lineHeight 和 lineSpacing。而如果需要保证 iOS 和各种 Android 设备上的行间距完全相同，则不应使用 lineSpacing，而应该借助于 lineHeight 和 baselineOffset 来实现。

### 🐕 [Swift 项目中涉及到 JSONDecoder，网络请求，泛型协议式编程的一些记录和想法](https://ming1016.github.io/2018/04/02/record-and-think-about-swift-project-jsondecoder-networking-and-pop/)

这篇文章很详细的描述了关于 JSONDecoder 的使用方法及内部实现原理。对于还没有上手使用 JSONDecoder 的各位来说，是一篇很好的教程。

### 🐎 [iOS 程序员效率提升利器之 AppleScript](http://mrpeak.cn/blog/ios-applescript/)

[AppleScript](https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html) 是苹果自家的脚本语言，Peak 利用这款脚本语言提高了自己工作效率，并分享了他的两个应用场景——『自动化跟踪查询 crash 流程』和『重构 Objective C 代码』。

### 🐎 [SnapKit 最佳实践](https://juejin.im/post/5ac6330d518825558a06da47)

[四娘](https://kemchenj.github.io/2018-04-05/)写的 SnapKit 最佳实践文章。主要分享了几个 SnapKit 的使用建议，可以让代码更加简洁和优雅。

### 🐢 [Common iOS development mistakes](https://blog.netcetera.com/common-ios-development-mistakes-28719ba1a6fc)

文章总结了一些常见的 iOS 开发中会犯的错误。涵盖的面比较广，涉及到程序设计、开发、调试和测试等各个阶段。同时还指出了几个提高质量的方向，值得一读。

### 🚧 [越狱 iOS 全局开启 WebView 远程调试](https://blog.chichou.me/%E8%B6%8A%E7%8B%B1-ios-%E5%85%A8%E5%B1%80%E5%BC%80%E5%90%AF-webview-%E8%BF%9C%E7%A8%8B%E8%B0%83%E8%AF%95-4b27cb361cd0)

iOS 7 之后，在移动设备和 mac 端的 Safari 上均开启开发者功能之后，可以打开 Mac Safari 的 WebInspector 从而进行 Web 页面调试。包括页面资源，Dom结构，JS调试，控制台等等，我们可以用 WebInspector 来观察调试自己 App 内部的 H5 页面运行状况。但是这个调试功能只对 Xcode 真机调试状态下的 App 和系统浏览器 Safari 开启，无法查看与调试别人的 App 中的网页，借助这款越狱插件，我们就可以做到全局开启 WebView 的远程调试了，文章中还有[源码链接](https://github.com/ChiChou/GlobalWebInspect)。

## 工具

### [MerchantKit](https://github.com/benjaminmayo/merchantkit)

现代 iOS 内购管理框架，极大地简化了独立开发者的工作，可以追踪被购买的项目、检索购买、管理订阅到期日期、恢复购买、验证购买等等。MerchantKit 为具有一系列内购项目的 app 而设计，是为应用增加 pro 版本的绝佳方式，不论是一次性购买还是采取订阅方式。

## 代码

### [VisualProgrammingLanguage](https://github.com/NathanFlurry/VisualProgrammingLanguage)

这是一个有趣的可视化编程开源库，只需要动动手指或者 Apple Pencil，即可新建语法节点，连接节点的输入与输出，然后生成目标代码。不过它现在只能算一个可行性证明，效率还很低，如果你有兴趣，可以帮助作者一起完善。（也许以后它能让编程教学变得更轻松简单，而且有趣。）

## 本期编辑

[@没故事的卓同学](https://weibo.com/1926303682/profile)，[@四娘](https://kemchenj.github.io)，[@mmoaay](https://weibo.com/u/1302422271)，[@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)

## 说明

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

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


