# 老司机 iOS 周报 #99 | 2020-01-13

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

## 通知

本期周报也是年前最后一期周报了，提前祝大家春节愉快~

## 新手推荐

### 🌟 🐕 [Flutter 如何高效的 JSON 转 Model](https://juejin.im/post/5e12eb566fb9a0480b415de2)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：由于 Flutter 禁用运行时反射，所以在 Flutter 中是没有 Mantle 等这类解析 JSON 的库。本文介绍了三种方式在 Flutter 中进行 JSON to Model :

- 手动序列化 JSON
- 使用 json_serializable
- [使用工具网站](https://app.quicktype.io/)

## 文章

### 🌟 🐢 [Using Type Erasure to Build a Dependency Injecting Routing Framework in Swift](https://swiftrocks.com/using-type-erasure-to-build-a-dependency-injector-in-swift.html)

[@Damonwong](https://github.com/Damonvvong)：Swift 编译器的类型检查为 Swift 项目减少了很多错误的产生，但是过于严苛的校验机制，使得很多功能实现起来较为复杂。
比如，作者在做模块拆分的时候，遇到了模块之间相互依赖的问题，最后他采用了**类型擦除**的办法，构建了一套依赖注入的路由框架思路，实现了模块之间的依赖的解耦，是一个不错的思路，做组件化的同学可以看一下具体的实现细节。
同时，由于 Swift 复杂的类型系统，**类型擦除**的使用范围还是蛮广泛的。比如 Codable 的实现、RxSwift 中的 Signal、SwiftUI 中的 View 等，如果不了解**类型擦除**也可以看一下文章，了解一下**类型擦除**的概念。

### 🌟 🐕 [静态拦截 iOS 对象方法调用的简易实现](https://juejin.im/post/5e1280fae51d4540e47ca450)

[@Parsifal](https://github.com/ParsifalC)：过去的 2019 年，在启动优化这一专项上，社区有了一个新的研究方向 -- 二进制重排。早之前的周报推荐过的两篇文章，「[手淘架构组最新实践 | iOS 基于静态库插桩的⼆进制重排启动优化](https://mp.weixin.qq.com/s/YDO0ALPQWujuLvuRWdX7dQ)」 和 「[抖音研发实践：基于二进制文件重排的解决方案 APP 启动速度提升超 15%](https://mp.weixin.qq.com/s?__biz=MzI1MzYzMjE0MQ==&mid=2247485101&idx=1&sn=abbbb6da1aba37a04047fc210363bcc9&scene=21#wechat_redirect)」，详细介绍了这种方案的两种实现方式。

做二进制重排中，必不可少的一步便是统计所有函数的调用频次。欧阳大哥针对这一步，提出了自己的一个新的思路 -- “利用静态库会将自己引用的外部符号单独保存在一张表中” 这一切入点从而替换 `objc_msgSend` 方法。

> 目前社区内常用的统计函数使用频次的方案，值得一提的是，这些方案并不局限于统计函数使用频次这一场景：

> - 基于运行时的 hook 方案：fishhook 等能提供动态修改 `objc_msgSend` 实现
> - 静态插桩
>     - 借助于 LLVM 语法树分析来实现代码插桩
>     - 将源码编译为静态库，并通过修改静态库中 .o 目标文件的代码段来实现代码插桩
>     - 将所有静态库字符串表中的 objc_msgSend 统一替换为另外一个长度相同的字符串：hook_msgSend（名字任意只要长度一致并唯一）即可

### 🐕 [移动开发者的必知音视频基础知识](https://juejin.im/post/5e12fe306fb9a0481467d399)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：作为移动开发者，有些时候会需要接触到音视频相关的开发。作者通过从基本概念、常见问题、应用场景等不同方面来科普音视频开发的基础知识，有助于帮助我们了解音视频开发中的一些常识性问题。

### 🐕 [Web 离线技术原理](https://juejin.im/post/5cd4fda8f265da03a00febe1)

[@looping](https://github.com/looping)：本文列举了业界比较常见的四种离线方案，介绍的很全面，并且还从公共资源包、预加载 webview、预加载数据等问题展开进行了探讨分析，是一份很好的离线技术选型参考和方案原理学习的资料。不过正如作者所说，“对于一个优秀的 Hybrid 框架，这些还是远远不够的, ...还有很多东西需要我们探讨学习”。同样，作为一项技术，我们得清楚地认识到它的局限性和使用场景，才能用对、用好并改进它，这也是我们学习技术原理的目的之一。

### 🐕 [Turning Property Wrappers into Function Wrappers](https://medium.com/flawless-app-stories/turning-property-wrappers-into-function-wrappers-2be3a49229f5)

[@老峰](https://github.com/GesanTung)：周报之前推荐过 Swift 5.1 中新特性 Property Wrappers 的[相关文章](https://www.vadimbulavin.com/advanced-guide-to-userdefaults-in-swift/), 本篇文章作者分享了属性包装器在 function 下的应用，如 @Delayed(delay: 0.3) 、 @Debounced(delay: 0.3) 等，思路比较新颖，感兴趣的读者可以尝试。

### 🐕 [CONTINUOUS INTEGRATION USING GITHUB ACTIONS FOR IOS PROJECTS](https://andreaslydemann.com/continuous-integration-using-github-actions-for-ios-projects/)

[@老驴](https://www.weibo.com/6090610445)：Github Actions 是 Github 2019 年的重磅功能，上线之后也得到了很多开发者的响应，开发了很多针对不同框架，不同语言的各种 actions。

网上在 iOS 项目中使用 Github Actions 的内容相对还是比较少的，目前大家主要还是依赖以前几个比较常用的持续集成平台对项目做持续集成。本文就介绍了如何使用 Github Actions 来做 iOS 项目的持续集成。步骤虽然不算太多，但是也不算特别简单，有兴趣的读者朋友们可以在自己的项目中尝试一下。


### 🐕 [从客户端角度窥探小程序架构](https://juejin.im/post/5e0dfb8cf265da5d2076ef69)
[@莲叔](https://weibo.com/aaaron7): 微信小程序并不是新鲜事物，但是近年来小程序 SDK 的概念越来越流行，接入 SDK 就能直接直接接入一整个生态，确实非常有吸引力。本文比较完整的分析了小程序的发展历程，以及简单剖析了小程序的实现方式。探讨了小程序基于 H5 的技术栈是如何实现展现与逻辑的解耦，也 cover 了小程序相关领域的常用技术方案，比如离线包和预加载等。最后简单介绍了支付宝小程序的架构。整篇文章内容相对全面，适合入门的同学阅读。

### 🐕 [为什么 TCP 协议有性能问题 · Why's THE Design?](https://draven.co/whys-the-design-tcp-performance)
[@水水](https://www.xuyanlan.com)：TCP 协议可以说是今天互联网的基石，作为可靠的传输协议，在今天几乎所有的数据都会通过 TCP 协议传输，然而 TCP 在设计之初没有考虑到现今复杂的网络环境，本文会分析 TCP 协议为什么在弱网环境下有严重的性能问题。
在弱网环境下（丢包率高）影响 TCP 性能的三个原因：
- TCP 的拥塞控制算法会在丢包时主动降低吞吐量；
- TCP 的三次握手增加了数据传输的延迟和额外开销；
- TCP 的累计应答机制导致了数据段的传输；

### 🐕 [UINavigationBar 在 iOS 13 中的变动](https://sarunw.com/posts/uinavigationbar-changes-in-ios13/)

[@AidenRao](https://weibo.com/AidenRao)：苹果在 iOS13 中带来了很多外观更改，这篇文章主要讲导航栏的变动，大标题样式导航栏的默认外观已从半透明更改为透明。这个变动不大，可以添加部分代码恢复半透明。iOS13 下添加了 UINavigationBarAppearance 类，可以对导航栏外观进行自定义，去设置样式，阴影，背景，标题位置，按钮样式等。现在你可以删除你的自定义导航栏的代码，前提是 APP 的最低支持版本升到 13 (微笑)。

### 🐕 [How to make an augmented reality decorating experience app with AR Quick Look](https://engineering.nodesagency.com/categories/ios/2019/12/31/How-to-make-an-Augmented-Reality-decorating-experience-app-with-AR-Quick-Look)

 [@张嘉夫](https://github.com/josephchang10)：[AR Quick Look](https://developer.apple.com/augmented-reality/quick-look/) 能够为用户提供强大的增强现实体验，包括移动、缩放物体等交互方式，以及 people occlusion 功能，此外还可以分享“开箱即用”的模型。因此现在 AR 项目的大部分工作都来自于准备模型。这篇文章会为你介绍如何寻找合适的模型、对模型的尺寸进行适当的调整、生成并测试 USDZ 模型文件，并最终通过 Quick Look 功能制作为一款 AR app。

## 工具

### [为 iOS 审核操碎了心！用岩鼠提升 iOS 审核通过率吧](https://mp.weixin.qq.com/s/Mgywz7KO1tDh8POS2Agnsw)

[@JimQ](https://github.com/waz0820)：UC 研发效能团队建立的这套 iOS 预审工具可以有效地排除 iOS 审核上可能遇到的诸多坑点，尤其是针对不小心误用私有 API 库的痛点，团队收集了所有已知的私有 API 库，且在不断地完善与更新。开发者可以免费试用。

## 代码

### [BetterCodable](https://github.com/marksands/BetterCodable)

[@享耳先森](https://github.com/iblacksun)：Swift 4.0 开始引入 `Codable` 解决数据到模型转换的问题，但实际使用过程中经常需要自定义 `init(from decoder: Decoder) throws` 方法，`BetterCodable` 结合 Swift 5.1 引入的 `Property Wrappers` 来解决这个问题。

## 书

### [《谷歌方法》](https://book.douban.com/subject/33430445/)

不要被书名骗了，这不是一本严肃的谈论“方法”的书，相反，读起来像一个冒险故事一样吸引人。

这本书介绍了一家地图软件公司（KeyHole）被谷歌收购后，一路成长最后成为一个超 10 亿用户的明星产品的故事。和其他创业故事的区别在于，谷歌地图的核心壁垒是技术门槛。很少看到一个技术驱动型产品，从早期到最后大获成功的完整记录。在这个过程中，你也可以一窥谷歌如何打造一款成功的产品。

## 音视频

### 🌟 🐎 [推荐订阅播客节目：`[weak self]`](https://weakself.dev/)
[@zvving](https://github.com/zvving)：三名台湾 iOS 工程师带来的高质量播客节目《弱弱的我》第一季正式完结！🎊🎉

虽常被垃（le）圾（se）车打断，也总是录音设备故障，内容却欢乐且丰富：语言交流、Test CI 踩坑、管理心得、职场烦恼，鸡汤大饼，尽情畅聊。老司机团队倾情推荐！

`weak self, strong together!` 快乐的时光总是短暂的，期待第二季带来更多欢乐～

## 内推

> **字节跳动抖音商业化团队急招客户端工程师，速上车：**
> - 字节跳动旗下抖音和TikTok的商业化研发工程师，负责抖音内所有赚钱的需求！不管是广告、dou+、企业号、抖音电商还是抖音小游戏，都有我们的身影！
> - 团队base 北京、上海、杭州、深圳，我们不局限技术栈，对于新技术保持开放的态度。
> - 简历以【姓名+投递岗位+手机号】格式发送至 fulei.bill@bytedance.com 或者直接加微信 `fuleiac`

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