# 老司机 iOS 周报 #112 | 2020-05-11

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

## 新闻

### 🌟 [Apple 将于 6 月 22 日起召开虚拟全球开发者大会](https://www.apple.com.cn/newsroom/2020/05/apple-to-host-virtual-worldwide-developers-conference-beginning-june-22/)

受今年新冠疫情的影响，早些时候苹果就已经宣布今年的 WWDC 会以线上形式继续进行，而现在正式官宣明确了时间为 6 月 22 日。这是第 31 届开发者大会，而今年的 WWDC 又是以全新的线上形式举行，相信也会带来全新的体验。

> 忘了 WWDC 19 讲了些啥？欢迎查收周报编辑们参与编辑的专题特辑 - [WWDC 19 内参](http://xiaozhuanlan.com/wwdc19)。

### [Flutter 1.17 发布](https://medium.com/flutter/announcing-flutter-1-17-4182d8af7f8e)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：Flutter 2020 年的第一个稳定版本发布了🎉🎉🎉，这次的新版本主要以增强稳定和修复历史 Bug 为主。在 iOS 端支带来了 Metal 的支持，使得性能大幅提升，同时对 Flutter 的包体积做了不小的优化，新组件的增加等等。不想看英文的同学可以看[中文版](https://mp.weixin.qq.com/s/5O7I3irCU-xnX-kluTh93Q), 同样推荐一起发布的 [Dart-lang Release Note](https://medium.com/dartlang/announcing-dart-2-8-7750918db0a)。

## 文章

### 🌟 [一次关于 Swift 在 iOS 生态圈里的现状调研](https://mp.weixin.qq.com/s/Ib48PWpKJNALlNoL4lm4-g)

> SketchK 的一篇数据调研笔记，可以帮助大家看清当前国内 iOS 开发形式。

总的来说，国外 Swift 社区活跃度已经比 Objective-C 高了，国内大厂也在推进，具备 Objective-C 与 Swift 混编能力，如果你还没上车，现在买票吧。

### 🌟 🐢 [百度小程序框架性能优化实践](https://mp.weixin.qq.com/s/F3kYYW5_Iu7ny0p3Rzp3Dw)

在移动互联网时代，众多的跨平台、动态化方案，其本质都是在寻找 NA 和 H5 之间的平衡。从渲染层面上，可分为 NA 渲染（RN、Flutter 等），以及 H5 渲染（小程序）。在一个平台型的 APP 里，目前业界最广泛使用的方案就是小程序，因为它可以有效降低生产者和用户的使用成本。小程序作为 H5 渲染流派，灵活性已经被证实，所以性能一直是最受关注的技术点。本文介绍了百度小程序在性能优化方面的实践，从框架启动、小程序包下载、小程序包加载以及渲染等 4 个方面进行了全面的优化。

### 🌟 🐕 [我是如何让微博绿洲的启动速度提升30%的](https://mp.weixin.qq.com/s/SUHaGD1T2Vce4Ag-qgxtgg)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：启动速度是 App 给用户的第一印象，对用户体验来说至关重要。本文主要讲述对微博绿洲 App 的启动优化并阐述优化原理，主要从以下两个方面入手：

- 动态库转静态库, 优化了 dylib loading time
- 通过二进制重排，让启动需要的方法排列更紧凑，减少了 Page Fault 的次数

### 🐕 [Flutter 势头正盛 | 2020 春季速递](https://mp.weixin.qq.com/s/DS8lAkqtK_Qp37o8ISlthA)

[@邦Ben](https://weibo.com/linwenbang)：Flutter 如今已经发布了 1.17 稳定版本，迭代速度还挺不错的。该文大体介绍了一下目前的应用情况，例如：使用最多的国家前五是：印度、中国、美国、欧盟和巴西；在 Play Store 上 Flutter 应用约 5w 个。还介绍了亚洲以外的最大的数字银行 Nubank 选择了 Flutter 的原因（有视频）。有兴趣可以点进去了解了解。

### 🐎 [The big Facebook crash of 2020 and the problem of third-party SDK creep](https://rambo.codes/posts/2020-05-07-the-big-facebook-crash)

[@张嘉夫](https://github.com/josephchang10)：Facebook SDK 引发了大规模应用崩溃，原因是 Facebook 服务器向其 SDK 发送了错误的数据，并导致 SDK 中的代码崩溃，进一步导致运行该 SDK 的 app 终止运行。这篇文章提出了第三方 SDK 可能带来的问题，由于它们是在编译时链接的动态库，会让 Facebook、Google 等数据收集、挖掘公司对这些 app 拥有控制能力。Facebook 导致的应用崩溃问题就是该能力的体现，他们彷佛拥有了一个 “kill app 开关”。随后作者提出了两种技术解决方案，第一种方案是在不使用 Facebook SDK 的情况下实现 Facebook 登录，另一种方案则是将这种类型的 SDK 和主 app 的代码通过“沙盒”进行隔离。最后作者还提出了人为解决方案，例如限制市场部门向 app 添加第三方数据分析代码的权力。

### 🐕 [拆！对比详解 Flutter Widget 和 CSS，你关心的布局原理都在这儿了](https://mp.weixin.qq.com/s/ZjrcYN6Asq1RpdgTrCUbiw)

[@looping](https://github.com/looping)：本文对比了 Flutter Widget 和 CSS 布局原理的差异，客观地分析了两者的优缺点，并且对它俩的优势能否互补也做了进一步的探讨评估，同时还分享了实践过程中遇到的一些问题和解决方案，对这块技术感兴趣的同学可顺其思路好好研究一番。

### 🐕 [围观 GitHub 重磅推出的四大新功能](https://juejin.im/post/5eb4287a5188255fd54de601)

[@红纸](https://github.com/nianran)：近期 Github 推出了四项新功能，以帮助开发社区协同工作：

- Codespaces: GitHub 中完整的开发环境，云编辑器 + 云托管的开发环境
- GitHub Discussions: 开发者新的对话空间，issue 跟 PR 随时都可能会被关闭，但是 discussion 不会被关闭，可以用来维护 FAQ 或者协作文档
- Code scanning and secret scanning: 利用 Code scanning 对每一次 **git push** 进行安全漏洞扫描，结果会直接体现在 PR 上。Secret scanning 可以监视私有仓库中的已知 secret 格式，并在发现它们时立即通知开发人员。
- GitHub Private Instances: 这是一个面向企业客户的全新的、全托管选项，提供增强的安全性、合规性和策略功能。

### 🐕 [History of Auto Layout constraints](https://sarunw.com/posts/history-of-auto-layout-constraints/)

[@EyreFree](https://github.com/EyreFree)：本文介绍了 Auto Layout 自 iOS 6 引入后如何发展至今的过程，通过举例方式让读者直观感受到苹果如何一步步解决 Auto Layout 的约束代码冗长性问题。在您阅读完本文之后，您可能会考虑淘汰第三方布局库，并开始直接使用标准 API。

### 🐢 [一道 Block 面试题的深入挖掘](https://juejin.im/post/5eaa2a87e51d454db7436726)

[@JimQ](https://github.com/waz0820)：又到了复习 Block 源码（~~找工作~~）的时间，作者从一道 Block 面试题出发，深入源码为大家剖析 Block 存储域，Block 捕获的变量传递类型，__block 修饰过的变量传递类型及其在 Block 中的存储域变化，并结合 __weak 说明符，探讨如何解除循环引用，避免内存泄露。

### 🐕 [Realm.Object 与 NSObject 的转换中 swift 协议妙用的体现](https://mp.weixin.qq.com/s/zR9M9hewQjnVUyShOxJyHA)

[@anotheren](https://github.com/anotheren)：Realm 是一个跨平台的移动数据库引擎，在实际业务中，我们一般会把业务模型和 Realm 的存储模型分开。本文介绍了如何设计协议及其默认实现来快速完成 `NSObject` 到 `Realm Object` 的相互转换。对于还处在大量混编阶段的团队，这是一个不错的案例。

### 🐎 [如何快速列出 App 的所有 +load 方法](https://mp.weixin.qq.com/s/6O3G72-Pdx60zrvots5-3g)

[@水水](https://www.xuyanlan.com)：一个基于 lldb 的 breakpoint 命令快速列出 App 的所有 +load 方法的实用小技巧，大家可以收藏起来，万一要用到呢~

## 工具

### [opentrace-ios](https://github.com/opentrace-community/opentrace-ios)

[@极速男孩](https://github.com/ztlyyznf001)：opentrace-ios 是在 iOS 上实现[ BlueTrace 协议](https://bluetrace.io/)的一个开源 APP。BlueTrace 一开始是新加坡政府开发的一个便于公共卫生机构使用低功耗蓝牙对 COVID-19 的接触者进行追踪的工具，后来这个协议背影用到了全球。同样这个 APP 有安卓版本，具体可以查看[链接](https://github.com/opentrace-community/opentrace-android)。

## 代码

### 🌟 [TrampolineHook](https://github.com/SatanWoo/TrampolineHook)

[@J_Knight_](https://weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)：TrampolineHook 是一个可以替换和拦截目标函数的框架。它可以用来查看任意函数的耗时和调用链路以及帮助实现日志功能等等。其流程设计是：

- 把需要替换的原方法 IMP A 取出来，保存起来。
- 给这个原方法塞一个动态分配的可执行地址 B。
- 当执行这个原方法的时候，会跳转到 可执行地址 B。
- 这个 B 经过一段简短的运算操作，可以获取到原先保存的 IMP A。
- 在跳转回 IMP A 之前，统一拦截函数先做些想做的事情，比如检查是不是主线程调用等等。

而且在该流程下，可以保证参数寄存器、返回地址等不会错乱。读者也可以从下面的三篇文章（框架作者原创）来看一下该框架的从思路到实现的演进过程：

- [基于桥的全量方法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)

### 🐕 [SwiftTrace](https://github.com/johnno1962/SwiftTrace)

[@xiaofei86](https://weibo.com/xuyafei86)：SwiftTrace 是用来追踪 Swift 和 Objective-C 中 non-final 类的方法调用的框架，它是 [Xtrace](https://github.com/johnno1962/Xtrace) 的 Swift 版本，通过将 Swift 类的函数指针替换为指向唯一汇编语言 “Trampoline” 入口点的指针来完成 Hook。通过 SwiftTrace 除了可以追踪类、实例、协议，还可以为成员函数创建切面，以在执行函数实现之前或之后调用一个闭包，在闭包中你甚至可以修改传入的参数或返回值。

### 🐕 [Localize](https://github.com/freshOS/Localize)

[@老峰](https://github.com/gesantung)：Localize 是一个很小的 Swift 实现的运行脚本，来提升本地化工作效率。主要包含：清除空格，按 Key 排序、检测未使用对的 Key、检测缺失的 Key、检测未翻译的 Key、检测冗余的 Key 等功能，使用简单只要在 Build Phases 配置 Run Script 即可，在国际化工作中有类似需求的同学可以研究一下。

## 音视频

### [71: “Polymorphic interfaces” with special guest Dave Abrahams](https://www.swiftbysundell.com/podcast/71/)

[@四娘](https://kemchenj.github.io/)：Swift by Sundell 的播客访谈这期请了一个**重量级嘉宾 Dave Abrahams，他之前是 C++ 委员会的一员，参与过 C++ STL 和 Boost 的早期开发**，后来在 Apple 参与了 Swift 的开发，现在在 Google 做 Swift For Tensorflow 的开发。（如果大家记得 WWDC 讲 Swift POP 的那个 Session，讲者就是他）

这次聊了他早期的 C++ 开发经历和 Swift 标准库的一些设计决策，包括王垠在[Swift 语言的设计错误](http://www.yinwang.org/blog-cn/2016/06/06/swift)吐槽过的 Value Semantic Array，这个决定当时在 Swift 团队内部也引起了成员的强烈反对，对这段故事感兴趣的人非常推荐收听这期播客。

## 内推

> 北京 / 成都 - 抖音：应届 / 高级 / 专家
> iOS、安卓、Server 都有大量 HC，欢迎
> - 应届学生，一起和大佬学习撸码姿势。
> - 熟练老手，一起做有挑战的事情。
> - 行业专家，一起在抖音这个平台，实现更大个人价值。
>
> 保证每一封简历，我都跟进进度，给与反馈。有任何想了解的，可以加我微信: jingmu1994，也可以直接发送简历到 raozhizhen@gmail.com

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