# 老司机 iOS 周报 #116 | 2020-06-08

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

## 新手推荐

### 🐕 [3 steps to speed up storyboard](https://fluffy.es/3-steps-to-speed-up-storyboard/)

[@极速男孩](https://github.com/ztlyyznf001)：storyboard 作为 iOS 的一种对 viewcontroller 的控制的方法被广泛使用，本文简单介绍了如何快速的使用 storyboard 来对你的 viewcontroller 进行管理。

## 文章

### 🌟 🐕 [TrampolineHook - 解决栈污染问题支持变参 Hook](http://satanwoo.github.io/2020/05/18/TrampolineHookStack/?from=singlemessage&isappinstalled=0)

本文是 `TrampolineHook` 框架系列文章最新的一篇。`TrampolineHook` 是一个中心重定向框架，可以通过一个函数替换/拦截所有你想要的函数的框架。如果对这个库不了解可以先看前面的几篇文章：

- [基于桥的全量方法Hook方案 - 探究苹果主线程检查实现](http://satanwoo.github.io/2017/09/24/mainthreadchecker1/)
- [基于桥的全量方法 Hook 方案（2） - 全新升级](http://satanwoo.github.io/2020/04/22/NewBridgeHook/)
- [基于桥的全量方法 Hook 方案（3）- TrampolineHook](http://satanwoo.github.io/2020/04/26/TrampolineHookOpenSource/)

本文主要讲该库在之前实现中的一个错误，关于上下文污染的问题，本文从汇编角度比较深入的讲解了这个问题，但并不需要读者很了解汇编的内容，有兴趣的同学可以看一下。

### 🌟 🐕 [移动前端开发和 Web 前端开发的区别是什么？](https://mp.weixin.qq.com/s/kPn-2y3Q_CMjwCB1c1yVTA)

[@张嘉夫](https://github.com/josephchang10)：前端这门技术，从诞生发展至今不过寥寥十余年。如果说前十年是 PC 前端的时代，那后十年一定是属于移动前端的时代。特别是随着网络制式的发展，移动设备在全球范围内得到了空前的普及，在前端领域，Hybird Web、React Native、Weex、Flutter 等等一系列新的移动前端技术也如同雨后春笋般冒出来。在这篇来自阿里巴巴新零售淘系技术部的文章中，作者分享了其对于「移动前端开发和 Web 前端开发」的理解，具体包括前端发展史回顾、移动前端混合技术的前世今生以及对未来回归本源的探讨。


### 🌟 🐕 [How the SwiftUI DSL Works](https://harshil.net/blog/swiftui-dsl-function-builders)

[@莲叔](http://aaaron7.github.io/)：SwiftUI 算是 Swift 近几个大版本中最令人兴奋的 feature，虽然不少同学在试水后都得出了目前还不成熟的判断，但这并不影响其定位了未来的 UI 开发方式。本篇文章作者尝试聊了聊 SwiftUI 实现中的一些关键技术，主要描述了 function builder 机制，文章比较浅显易懂，内容不多，比较适合新手学习。

### 🐎 🚧 [A Type-Safe FileWrapper](https://heberti.com/posts/filewrapper/)

[@xiaofei86](https://weibo.com/xuyafei86)：在 Document Based Apps 中，NSDocument 作为最重要的基类，提供了自动保存、线程安全、iCloud 冲突解决等功能。NSDocument 可以持有 Data 和 FileWrapper 两种类型的文件数据。FileWrapper 为自定义文件类型的容器，本文通过示例简单讲述了 FileWrapper 的应用，有兴趣可以阅读原文了解，也可以通过苹果 [官方文档](https://developer.apple.com/document-based-apps/) 了解更多 Document Based Apps 的开发指南。

### 🐎 [Dealing with memory limits in iOS app extensions](https://blog.kulman.sk/dealing-with-memory-limits-in-app-extensions/)

[@老驴](https://www.weibo.com/6090610445)：Notification extension 和 share extension 算是 iOS 中前两年比较火爆的话题了，这两年似乎热点过去，大家关注的也不多，苹果也没有在这块继续着力，framework 更新的也很少。

这位作者就在开发中遇到了内存上限问题，Notification extension 最高只能支持 24 MB 的内存占用，而 Share extension 最多支持 120 MB 的内存占用。而开发中最有可能遇到内存上限问题的就是图片或者是视频了，作者使用了一些有意思的办法来绕过这样的限制，有兴趣的不妨来看看。

### 🐕 [How We Use Feature Flagging on iOS](https://mobile.blog/2020/05/29/how-we-use-feature-flagging-on-ios/)

[@老峰](https://github.com/gesantung)：Feature Flagging (又名 Feature Toggle、Flip 等)是一种允许控制线上功能开启或者关闭的方式，通常会采取配置文件的方式来控制。本文作者以 WordPress 为例讲解了通过 配置 Build Configurations 等在 iOS 中实现 Feature Flags，WordPress-iOS 是个开源项目，感兴趣的读者可以点[这里](https://github.com/wordpress-mobile/WordPress-iOS)阅读源码。

### 🐎 [Decode and Flatten JSON with Dynamic Keys Using Decodable](https://swiftsenpai.com/swift/decode-dynamic-keys-json/)

[@四娘](https://kemchenj.github.io/)：有时候后端下发的 JSON 文件会采取动态 key 的形式，那在 Codable 里该如何实现呢？这篇文章就介绍了如何动态 key 的结构该如何解析以及封装的方式。

## 代码

### 🌟 [InterposeKit](https://github.com/steipete/InterposeKit)

[@EyreFree](https://github.com/EyreFree)：InterposeKit 是一个可以帮助我们快速、优雅地在 Swift 中进行 Swizzle 的库，它的作者是 Peter Steinberger，你可能对这个名字没什么印象，但你可能听过他的另一个开源库 —— Aspects。InterposeKit 是用纯 Swift 5.2 编写的，有完备的文档并经过了全面的测试。它可以用于 Objective-C 实例方法和被 `@objc dynamic` 修饰的 Swift 函数。推荐在 Swift 中有 Swizzle 需求的同学一试，以下是一些关键点：

- Interpose 直接修改方法的实现，这比基于 `selector` 的方式要好；
- 可以通过调用 `revert()` 轻松实现钩子的撤销；
- 纯 Swift 实现，而不是使用低效的 `NSInvocation`；
- 没有类型检查，虽然带来了一些 crash 风险但也更加灵活；
- 必须手动指定结果类型两次，这是一种为了避免使用 `NSInvocation` 或汇编的折衷；
- 当类在运行时被加载时，延迟插入。

## 内推

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

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

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