# 老司机 iOS 周报 #9 | 2018-03-05

![ios-weekly](../assets/ios-weekly.png)

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

## 文章

### [[译]奔跑吧！RunLoop！](https://juejin.im/post/5a951cb26fb9a0633229d4ec)

揭示了 RunLoop 的本质和 RunLoop 的执行过程。翻译有一些瑕疵，喜欢阅读英文的朋友可以直接看原文。

### [[译] 揭秘 iOS 布局](https://juejin.im/post/5a951c655188257a804abf94)

详细全面介绍了界面布局的相关函数的执行顺序和作用。


### [[译]为什么你的 APP 在 Sketch 上看起来更好: 探索 Sketch 和 iOS 的渲染差异](https://juejin.im/post/5a9572575188257a61326630)

如果你非常严格的比对 Sketch 的效果图和真机上的效果会发现，即使参数一致文字排版、阴影、渐变还是会有微小的不同。文章结合实例展示了这些效果有何不同。坏消息是阴影和渐变的不同并没有解决方案，只能自主调节参数。

### [Hook Objective-C Block with Libffi](http://yulingtianxia.com/blog/2018/02/28/Hook-Objective-C-Block-with-Libffi/)

Objective-C 的方法 hook 可以通过 [Method Swizzling](http://nshipster.cn/method-swizzling/) 实现，但 block 的 hook 并不一样。该文分析了 block 的 hook 原理，参照 [MABlockClosure](https://github.com/mikeash/MABlockClosure) 的实现和 [Aspects](https://github.com/steipete/Aspects) 的 API 设计，基于 libffi 实现了对 Objective-C Block 的 hook —— [BlockHook](https://github.com/yulingtianxia/BlockHook)。

### [More Interface Builder Tips And Tricks](https://useyourloaf.com/blog/more-interface-builder-tips-and-tricks/?utm_campaign=iOS%2BDev%2BWeekly&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B340)

一些 Interface Builder 的使用小技巧，便捷快捷键，小 Tips，如果你的项目中也在使用 IB，这篇文章能给你带来帮助。

### [Ruby 对于 iOS 开发发展的影响](https://medium.com/xcblog/a-history-of-ruby-inside-ios-development-427b5a09f91e)

今年是 Ruby 这门语言诞生的 25 周年，作者特别写了一篇文章介绍了 iOS 开发工具链发展史里 Ruby 发挥的作用，讲述 CocoaPods、Fastlane 等等这些工具当时选择 Ruby 的理由。

### [小程序支持打开移动应用到底是怎么回事?](http://supermokey.com/2018/01/27/miniprogram-open-app/)

文章详细讲解了什么场景下小程序可以打开 App 以及 App 端代码应该怎么写。

### [iOS 编译器](https://objccn.io/issue-6-2/)

本文是 objc.io 第六期文章，还有姊妹篇 Build 过程、Mach-O 可执行文件。文主要探讨编译器主要做些什么，以及如何有效的利用编译器。

### [Synchronous Unit Tests](https://swifting.io/blog/2018/03/03/50-synchronous-unit-tests/)

Swifting.io 的新文章，作者在文中一步一步地实现了一套可读性和执行效率都很不错的单元测试方案，让开发者能以同步的方式编写单元测试。如果你没有足够的时间阅读文章，也可以直接在 [Github](https://github.com/swiftingio/sync-unit-testing-50?utm_source=swifting.io&utm_medium=web&utm_campaign=blog%20post) 查看这套方案的源码。

### [XCTKVOExpectation for native Swift key paths](https://oleb.net/blog/2018/02/xctkvoexpectation-swift-keypaths/)

文章介绍了 XCTest 测试框架新增 API [XCTKVOExpectation](https://developer.apple.com/documentation/xctest/xctkvoexpectation) 的一种使用方式，作者封装了 KVOException 并对 XCTestCase 进行扩展，以方便开发人员完成测试用例的编写。另外，作者已经把所有相关代码都开源在了 [Github](https://gist.github.com/ole/efe13925abd8e8ea2c7926e9a3131abf) 上。

### [iOS 微信内存监控](https://mp.weixin.qq.com/s/r0Q7um7P1p2gIb0aHldyNw)

本文非常详细的从数据收集、数据存储、数据上报，页面展现、降低误判几个方向，讲解如何实现线上内存监控及 FOOM 导致的系统强杀上报。

FOOM 是指 APP 在前台因消耗内存过多引起系统强杀，微信每天 FOOM 次数与登录用户数比例接近 3%，同期 crash 率 1% 不到。为此，微信开发此线上内存监控工具，FOOM 率由 17 年年初 3%，降到目前 0.67%，效果显著。

### [awesome-blockchain](https://github.com/chaozh/awesome-blockchain)

他们说 2016 是 VR 元年，他们说 2017 是人工智能元年，他们说 2018 是区块链元年。可能是新时代的开端，也可能只是昙花一现的潮流。

弄潮儿，如果你做好准备，这里有所有区块链（BlockChain）技术开发相关资料，包括 Fabric 和 Ethereum 开发资料。

## 工具

### [Sketch 49 更新：迈向交互设计领域的第一步](https://sspai.com/post/43466)

Sketch 在最新的 [49 版本](https://blog.sketchapp.com/prototyping-libraries-on-sketch-cloud-and-an-official-ios-ui-kit-in-sketch-49-bf090c70796c)中增加了制作交互设计的新功能，可以使用连线和热点图层来连接 Artboard，并且可以在 Sketch，Sketch Cloud 和 Sketch Mirror on iOS 进行预览。设计和交互在一个软件中统一已经是目前的发展趋势，Sketch 这次的更新可以说是极其重要的一步。

### [An iOS Runtime Headers Search Tool](http://developer.limneos.net/index.php)

通常我们查看系统类的 **Undocumented API** 或者 **Private API** 的时候，需要借助 [Class Dump](https://github.com/nygard/class-dump) 来进行，又或者去直接去寻找业内已经 dump 后[开源的文档](https://github.com/nst/iOS-Runtime-Headers)，而这个工具是实时在线查询平台，支持查询 『**iOS8 ~ iOS11**』的 iOS Framework，并会列出该类或者方法在哪些系统版本中使用。

## 代码

### [腾讯开源了一个高性能图片框架](https://github.com/Tencent/LKImageKit)

去年 Swift 大会上腾讯的工程师介绍过如何构建一个高性能的图片框架，现在这个框架终于开源出来了，合理的架构和线程模型，并特别针对不同场景进行优化，让它能充分发挥硬件的性能。据悉这个项目已经三年了，这个框架在腾讯内部有很多项目都在使用，已经经过了生产环境的考验。

### [FlyoverKit](https://github.com/SvenTiigi/FlyoverKit)

FlyoverKit 可以让你 360° 俯瞰 `MKMapView`，效果令人惊叹，无需额外的操作、所有的配置都保留可用。

### [FluxCapacitor -- This is what makes the Flux design pattern possible](https://github.com/marty-suzuki/FluxCapacitor)

[Flux](https://facebook.github.io/flux/) 是 [React](https://github.com/facebook/react) 开发中很重要的一种编程思想。它在 JavaScript 有很多种实现，比如 [官方的 Facebook Flux](https://github.com/facebook/flux) 和 [很多人熟悉的 Redux](https://github.com/reactjs/redux) 等。但这种单向数据流的设计思想在 iOS 开发中使用的并不多，现在相对知名的有 [ReSwift](https://github.com/ReSwift/ReSwift)，FluxCapacitor 使用 Swift 的 protocols 和 typealias 完成了另一种实现。另外该作者在学习 Flux 这一思维的时候，用多种方式实现了同样功能的 [SimplestCounterSample](https://github.com/marty-suzuki/SimplestCounterSample) 以辅助自己理解，也十分推荐。

### [Swift-Kuery-ORM](https://github.com/IBM-Swift/Swift-Kuery-ORM)

IBM 新开源了 `Swift-Kuery-ORM`，构建于 [Swift-Kuery](https://github.com/IBM-Swift/Swift-Kuery) 之上，可以通过插件连接 `PostgreSQL`、`SQLite`、`MySQL`。

### [XHLaunchAd](https://github.com/CoderZhuXH/XHLaunchAd)

功能丰富的开屏广告、启动广告解决方案，主要优势如下：

- 支持静态/动态图片及 MP4 视频广告；
- 支持全屏/半屏广告，兼容 iPhone 和 iPad；
- 支持广告点击事件，支持自定义跳过按钮、添加子视图、设置完成动画；
- 支持网络及本地资源，自带图片/视频下载、缓存功能；
- 支持设置数据等待时间等；
- 作者长期维护，项目文档较完善，且有技术交流群。

只需简单配置即可实现复杂业务需求，有需要的同学可以尝试使用。

### [MessageViewController](https://github.com/GitHawkApp/MessageViewController)

MessageViewController 是 Swift 版本的 SlackTextViewController，是 slack 聊天界面的一个可交互的基础UI控件。MessageViewController 的功能完成度和代码质量都特别高。如果有类似 slack 聊天界面的需求或者想学习 slack 聊天界面的实现效果，不妨看一下 MessageViewController。

### [Swift-NIO](https://github.com/apple/swift-nio)

苹果官方在try! Swift上发布了Swift-NIO，它是一个事件驱动的非阻塞的网络框架，用来写高性能网络应用。
苹果在 Server-Side 方面努力，看得出对 Swift 的重视和对它的期望都很高。

## 音视频

### iOS 组件化 / 构建优化 / 持续化集成

- [滴滴出行跨地域 iOS 构建优化与持续集成](http://www.infoq.com/cn/presentations/optimization-and-continuous-integration-of-xiaojukeji-ios-construction)

本视频介绍了在滴滴出行业务的不断拓展、客户端开发团队人数激增、代码量急剧膨胀、开发人员物理地域不同、人员间的协同开发成本、代码维护成本成指数型增加的背景下，如何实现稳定高效的协同开发、高效地进行代码复用与持续集成以及避免代码量巨大导致的单次构建耗时长的问题。其中包含了滴滴的一系列自研工具和对现有开源工具的一些魔改，思路值得借鉴。

- [京东金融移动端多业务集成解决方案](http://www.infoq.com/cn/presentations/multi-service-integration-solution-for-jingdong-financial-mobile-terminal)

随着集团业务的不断发展，研发团队规模增大（100+），App 活跃持续增长（千万级），客户端单一的工程已经不能够满足当前业务需求。因此多工程集成的客户端项目应用而生，工程组件化势在必行。本视频对京东金融移动端的组件化做了详细的介绍，正在做组件化或者有类似需要的同学值得一看。

## 本期编辑

[@没故事的卓同学](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)

## 说明

🚧 表示需翻墙


