# 老司机 iOS 周报 #104 | 2020-03-09

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

## 新闻

### [近期 iOS 开发者需要关注的官方新闻](https://developer.apple.com/news/?id=03042020b)

[@looping](https://github.com/looping)：主要内容如下：
- 目前 iOS 13 覆盖率已经达到 77%
- 从 4 月 30 日起，所有提交到 App Store 的 iPhone 应用都必须使用 iOS 13 SDK（Xcode 11） 打包，也就是说要完成 iOS 13 适配
- 再次强调了从 4 月 30 日起，所有提交到 App Store 的应用都必须使用 storyboard 作为 launch screen，并要求 iPhone 应用要适配所有的 iPhone 屏幕尺寸
- 另外，审核条款也有更新（[Updated App Store Review Guidelines Now Available](https://developer.apple.com/news/?id=03042020a)），可浏览知识小集团队整理的变更内容：[划重点：《App Store 审核指南》更新条目一览](https://mp.weixin.qq.com/s/Tzt0jmVt2q7zpL7g8kpb5g)


## 文章

### 🌟 🐕 [Project LightSpeed: Rewriting the Messenger codebase for a faster, smaller, and simpler messaging app](https://engineering.fb.com/data-infrastructure/messenger/)
[@zvving](https://github.com/zvving)：Facebook 新版 iOS Messager 为了达成『更快、更小、更简单』的目标，进行了一项罕见的工作：重构架构并重写所有代码。

- 重写效果：保留大多数功能，启动快一倍，大小为之前四分之一，代码从 170w 行降低到 36w 行
- 追求架构全局最优的四原则：
    - 优先使用系统实现，少部分跨平台逻辑扩展 C 实现
    - 合并重用 UI 逻辑
    - 基于 SQLite 打造通用平台 MSYS：驱动 UI 业务，自动化测试 100% 覆盖
    - 统一客户端与服务端交互&同步机制
- 面对未来的代码增长，为每个功能设置复杂度预算，长期评估质量

架构的抉择来自于 FB 工程师对如何用最新技术打造 IM 项目的整体思考：使用最新系统实现，追求复用，针对 IM 打造 DB 驱动核心，保持简单。读起来颇有『重剑无锋，大巧不工』的味道。

顺带一提：这是一次 native to native 的重写，和 RN 没有直接关系。

> - [@Dan Abramov 在 Twitter 上的回应](https://twitter.com/dan_abramov/status/1234801507805138945)
> - [感谢知识小集提供的译文](https://mp.weixin.qq.com/s/kdezRmk_tgjUTsuCQcAqsw)

### 🌟 🐢 [系列文章 - Swift Intermediate Language 初探](https://mp.weixin.qq.com/s/UQksScr_LZ1n7wLAVjzEMg)

[第二篇 - 真实案例引发的 iOS 底层实现窥探](https://mp.weixin.qq.com/s/KHvWSsvKNxJq9IwAsZu4qw)

[@享耳先森](https://github.com/iblacksun)：Swift 是构建在 LLVM 上，使用 LLVM 中间表示(IR) 和 LLVM 不同后端生成机器语言。除此之外，Swift 编译器在生成 IR 之前，还设计了一门新的高级中间语言 `Swift Intermediate Language`，简称 `SIL`，SIL 会对 Swift 进行高级别的语意分析和优化。

当你遇到一些无法理解的表面现象，没有办法通过文档或者前人经验解读问题的实质，想要尝试探究编程语言背后的实现细节，那么就需要跨越语言本身的了解，向下去专研编译器的实现细节。系列文章使用项目中实际遇到的一个真实案例，从一个具体的 `UITableView` 实现的例子引出，试图通过 `SIL` 这个中间语言，探究 Swift 背后的一些实现细节，帮助我们理解一些问题。

> 推荐人：[@kingnight](https://github.com/kingnight)


### 🐕 [Flutter +MLKit = ❤](https://medium.com/flutter-community/flutter-mlkit-8039ec66b6a)

[@J_Knight_](https://weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)：本文分享了一个 Flutter 与 MLKit 结合起来的 Demo：给名片拍照后提取其中的邮件地址。具体从下面三个步骤来展开：
1. 照相（使用 Flutter 的 camera package）
2. 使用 MLKit 提取照片中的文字（使用 textRecognizer 实例来提取出图片中的文字）
3. 寻找文字中的邮件地址（使用正则表达式）

而且在每一步骤作者都提供了相关代码，并在文章中提供了 Demo 地址：[Business-Card-Mail-Extractor](https://github.com/DaemonLoki/Business-Card-Mail-Extractor)

### 🌟 🐕 [dna --- 一个 dart 到 native 的超级通道](https://juejin.im/post/5e5f1d41518825495b29a05b)

[@老驴](https://www.weibo.com/6090610445)：Flutter 最近是越来越火了，有越来越多的大厂开始进行尝试。

dna 就是饿了么团队针对 Flutter 使用中的痛点：原生能力的调用，做的一个 channel 类型的框架。本文中也叙述了在 Android 和 iOS 下的实现的一些具体细节，有兴趣的同学也可以学习参考一波。

### 🐕 [My experience replacing CocoaPods with SwiftPM](https://www.jessesquires.com/blog/replacing-cocoapods-with-swiftpm)

[@anotheren](https://github.com/anotheren)：Xcode 11 中已经自带集成了 Swift Package Manager，随着越来越多第三方库的支持，切换到 SPM 已经逐渐成为可能。本文介绍了当前切换到 SPM 存在的优势与不足，现在主要影响的问题还有：
1. 不支持 Objective-C 和 Swift 的混合使用
2. 不支持资源文件

### 🐢 [深入剖析 WebKit](https://ming1016.github.io/2017/10/11/deeply-analyse-webkit/#more)

[@kyo](https://github.com/KyoLi)：虽然苹果从 iOS 8 开始就引入了 WKWebView，但在过去很长一段时间里是允许 UIWebview 和 WKWebView 共存的。苹果从 iOS 13 开始将 UIWebview 列为 Deprecated API，意味着开发者将不得不升级至 WKWebView。而 WKWebView 和 UIWebView 是完全不同的。如果想要更好的了解 WKWebView，那么就有必要深入了解一下 WebKit。本文是 @戴铭 老师关于 WebKit 的一篇文章，对于升级至 WKWebView 遇到的一些问题，或者想更深入了解 WebKit ，这里可能就有你想要的答案。

> 推荐人：[@sigsegv](https://juejin.im/user/5a3123a26fb9a044fa19dc7b)

### 🐕 [iPhone可以运行Android了](https://mp.weixin.qq.com/s/hYjmPNxlX8P_BiEo4LveJQ)

[@EyreFree](https://github.com/EyreFree)：Project Sandcastle（沙堡计划，项目地址：[https://projectsandcastle.org/](https://projectsandcastle.org/)），目前支持在 iPhone7 / 7 Plus 设备上运行 Android，本文记录了作者完整的尝试过程，有兴趣的朋友可以看一下。

## 工具

### [MultipeerKit](https://github.com/insidegui/MultipeerKit)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：MultipeerKit 是一个 Swift 软件包，它允许 iOS、macOS 和 tvOS 设备通过 Wi-Fi 网络，点对点 Wi-Fi 和蓝牙在它们之间交换数据。可以通过查看 Public API 文件夹中的 Swift 文件，了解使用 MultipeerKit 的更多信息。

### [Xcode Build Settings](https://xcodebuildsettings.com/)
[@AidenRao](https://weibo.com/AidenRao)：Build Settings 有数百种配置，这个网站整理了每一个配置的含义，可以随时用来查询。结合 [Mattt](https://github.com/mattt) 的 [Xcode Build Configuration Files](https://nshipster.com/xcconfig/)，了解使用 xcconfig 来管理 APP 的 Build Settings。


## 内推

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