# 老司机 iOS 周报 #127 | 2020-09-07

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

## WWDC20

本周在周报公众号上我们推送了 3 篇 WWDC20 内参专栏内的文章，每篇都很精彩！

- [Swift 的不安全](https://mp.weixin.qq.com/s/C8IczQKMHS0KWqWw6bsMNQ)
- [在 Swift 里安全管理指针](https://mp.weixin.qq.com/s/eOYMO12ZImplehBdnr8ZEw)
- [探索现代的移动网络](https://mp.weixin.qq.com/s/ds6QkVrBwcurxp3RkvZe8Q)

## 新闻

### [App Review process updates](https://developer.apple.com/news/?id=84w3e5bm)

[@anotheren](https://github.com/anotheren)：苹果正式上线了其在 WWDC20 上公布的应用审核流程优化。对于已经在 App Store 上发布的应用，除了与法律问题有关的应用外，将不再因违反准则而延迟错误修复。现在，除了对应用程序是否违反指南的决定提出上诉外，你还可以对指南提出修改建议。苹果鼓励你提交对于 App Store 和苹果开发平台的建议。

### [Details for app privacy questions now available](https://developer.apple.com/news/?id=hx9s63c5)

[@EyreFree](https://github.com/EyreFree)：正如苹果在 WWDC20 上宣称的，App Store 产品页面将提供一个新的隐私信息部分，以帮助用户了解应用对隐私的处理。此外，从 iOS 14、iPadOS 14 和 tvOS 14 开始，当应用程序需要在其他公司拥有的应用程序或网站上跟踪用户或访问设备的广告标识符时，将需要通过权限询问弹窗来获得用户许可。

## 文章

### 🌟 🐕 [云音乐 React Native 体系建设与发展](https://juejin.im/post/6867722436369416206)

[@looping](https://github.com/looping)：本文介绍了网易云音乐团队在优化会员收银台到达率时，选择了重建整个 RN 技术体系作为长期技术演进的方案。他们从自动部署、离线预加载、RN 框架升级等几个方向进行重构，最终取得了重大突破，到达率提升到 99%。他们未来还会围绕性能、效率、监控这三大方向进行基础建设。对构建跨端开发体系感兴趣的同学，或是在维护年久失修的基础项目，在仔细阅读文章后，相信都能找到一些可供参考的思路。

### 🌟 🐕 [3. CocoaPods 命令解析 - CLAide](https://mp.weixin.qq.com/s/JMG04U-7737GGlnoOKg1Fw)

[@JonyFang](https://github.com/JonyFang)：本篇主要介绍了 CocoaPods 提供的命令行解析器 CLAide，它负责解析我们使用到的 Pods 命令，如 `pod update Alamofire --no-repo-update --exclude-pods=SwiftyJSON` 命令执行时 CLAide 在其中起到的解析作用。作者主要描述的几个点：

- 简介 Ruby 中的 Open Classes 特性，其中需要留意的是 Open Class 可以跨文件、跨模块进行访问。
- 概述 CLAide 功能及其目录结构
- 介绍用于构建命令行界面的基础抽象类 Command。我们添加的命令都需要继承自 Command，不同的配置得到 `abstract command` 和 `normal command`。pod 命令正是由多个 `Pod::Command < CLAide::Command` 的子类组成了 `abstract command`，通过这种方式可以达到多级嵌套命令的效果。
- 接着以 `pod update Alamofire --no-repo-update --exclude-pods=SwiftyJSON` 为例介绍 CLAide 中 ARGV 是如何解析命令行传入的参数的。
- 之后介绍 Command 的管理类 PluginManager 的执行流程。它会在第一次运行命令 `self.run` 时进行加载，且仅加载命令类中指定前缀标识的文件下的命令。
- 最后，结合前面介绍的类职责及执行流程，通过创建一个 CLAide 命令来自己实现一款 🥤 贩卖机。（作者提供的 [Demo 源码](https://github.com/looseyi/BeverageMaker)）

### 🐕 [Abusing iOS’ Screenshot Cropping Mechanism](https://bryce.co/screenshot-cropping/)

[@老驴](https://www.weibo.com/6090610445)：iOS 14 系统中自带的截图工具新增了一个非常好用的小功能：工具在选择截取范围时会自动吸附屏幕上元素的边缘，方便做出更加精准的截取。这个功能之前网上有很多的猜测是怎么实现的，本文的作者就做了深入的研究，并且得出了结论。对实现原理好奇的同学们不妨来了解一下。

### 🐕 [Handling view controllers that have custom initializers](https://www.swiftbysundell.com/tips/handling-view-controllers-that-have-custom-initializers/)

[@张嘉夫](https://github.com/josephchang10)：如果我们在开发中使用[依赖注入（dependency injection）模式](https://www.swiftbysundell.com/articles/different-flavors-of-dependency-injection-in-swift)为对象在初始化时提供外部依赖，我们通常会希望替换 `UIViewController` 等 UIKit 类自带的初始化方法，这篇文章为你介绍如何处理使用自定义初始化方法的 view controller。包括如何实现 `init(coder:)` 方法，在 iOS 13 中使用 `UIStoryboard` 的 `instantiateViewController` 方法，以及通过 `@IBSegueAction` 方法来使用 `storyboard segue` 从而避免手动创建 view controller 等以便兼容 storyboard。

### 🐕 [学 AR 到底学什么？我的 AR 之路反思与展望](https://juejin.im/post/6865650326390145031/)

[@莲叔](http://aaaron7.github.io/)：从近年历届 WWDC 中不难发现，AR 和 ML 一直是苹果坚持的下一代的技术方向，从观感来看的话，AR 可能更加富含科技感。炫酷的效果背后，是 AR 技术包含了非常宽的技术栈。本篇文章可以说是一个不错的扫盲贴，介绍了 AR 技术体系的几个主要组成：SLAM、场景感知、3D 渲染、协作共享，并推荐了一系列学习的教材，不过文章内容停留在一个比较浅的层面，比较适合对 AR 感兴趣不知道从何开始的小白阅读，找找初步感觉。

### 🐎 [多级 MVC 和项目最佳实践](https://github.com/zzyptr/App/blob/master/README.md)

[@J_Knight_](https://weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1)：为了解决在 UIViewController 之间存在依赖的问题，作者介绍了一种新的 MVC 方案：在 UIViewController 之上引入了一组新的 MVC 关系：将 Presenter 作为容器来整合 Controller，View；View 通过 Coordinator 来向 Presenter 通信；而高一级的 Presenter 持有低级 Presenter，低级的 Presenter 通过 Coordinator 向高一级通信。结构如下：

```
RootPresenter: UITabBarController
 ├─ HomePresenter
 ├─ MarketsPresenter
 ├─ TradeNavigationPresenter: UINavigationController
 └─ WalletsPresenter
```

采用该方案的优点是可以随着业务增长不断调整的能力，感兴趣的读者朋友可以原文链接阅读。

### 🐎 [Turning the ChibiStudio canvas into an App Clip for iOS 14](https://rambo.codes/posts/2020-08-29-turning-the-chibistudio-canvas-into-an-app-clip)

[@Damien](https://github.com/ZengyiMa)：Apple 在 WWDC20 上发布的 AppClips 在具有更小的体积的同时也有着和原生一样的用户体验，吸引了众多开发者的目光。本文的作者也将他的一款名叫 ChibiStudio 的 App 在 AppClips 上做了尝试，本文将会深入介绍 App 往 AppClips 上迁移的步骤和注意事项。正在适配 AppClips 的同学不妨一读。

### 🐢 [让 Objective-C 库支持 Swift Package Manager](https://mp.weixin.qq.com/s/pU5d8j4R-4MRokbZIF9MLQ)

[@老峰](https://github.com/gesantung)：Swift Package Manager 已经发布四年，但目前较 CocoaPods 普及率很低，不过今年 WWDC 迎来了最要更新支持二进制分发以及资源文件。本文作者 @[君赏](https://github.com/josercc) 结合自己实际项目经验分享了 Objective-C 源码库支持 SwiftPM 以及 打包二进制闭源 XCFramework 支持 SwiftPM 的经验，对 SwiftPM 感兴趣的读者不妨阅读。

### 🐢 [SF Symbols Changes in iOS 14](https://medium.com/@hacknicity/sf-symbols-changes-in-ios-14-4731937c5dc7)

SF Symbols 是苹果在 WWDC 2019 介绍的一套矢量图形，iOS 14 中，苹果对 SF Symbols 进行了大量更新：

- 新增近 900 个新符号(有些符号的使用受到限制)。
- iOS 13 中的 60 个符号已被重新命名。
- 158 个符号有多色支持。
- 本地化支持：新增许多右到左的符号。
- 错误修复：修复了一些与名称不匹配的图片。

## 工具

### [YYDebugDatabase](https://github.com/y500/iOSDebugDatabase)

[@红纸](https://github.com/nianran)：YYDebugDatabase 来自 [y500](https://github.com/y500) 的远端调试数据库工具，其可以通过阅览器远程调试应用内的数据库。其允许我们直接在浏览器中查看和编辑数据库，包括直接查询，更新，插入和删除数据。我们也可以下载完整的数据库，在 Mac 上进行调试。由于其基于 FMDB 进行开发，支持的数据库格式有限，只能调试 SQLite 格式的数据库。

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

## 代码

### [FlutterUnit](https://github.com/toly1994328/FlutterUnit)

[@极速男孩](https://github.com/ztlyyznf001)：FlutterUnit 是一个 flutter 的开源项目，集成了 flutter 中 260 个左右的组件，适合新手来学习 flutter 的时候来熟悉 flutter 中各种组件的使用。

### 🐎 [Pigeon](https://github.com/fmo91/Pigeon)

[@zvving](https://github.com/zvving)：为 SwiftUI 提供服务端数据异步加载能力，支持可定制的缓存、序列化、分页等。

整体设计借鉴 [React Query](https://react-query.tanstack.com/docs/overview)：声明式语法，实现较简洁，有相关使用经验的同学推荐选用。

### 🐎 [Parma](https://github.com/dasautoooo/Parma)

[@EyreFree](https://github.com/EyreFree)：一个可以用来在 SwiftUI 构建的应用中展示 Markdown 的组件，支持大部分常用的 Markdown 样式，可通过 SPM 集成，有需要可以试用。持续开发中，感兴趣的同学也可以尝试贡献代码。

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（LSJCoding）会推送消息，欢迎关注。

![](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）
