# 老司机 iOS 周报 #85 | 2019-09-30

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

## 通知

明天就国庆长假了，本期也是国庆前的最后一期周报，长假期间周报将暂停一期，节后恢复正常节奏。祝大家长假快乐~

## 新闻

### [Swift Release Process](https://swift.org/blog/5-2-release-process/)

[@四娘](https://kemchenj.github.io)：Swift 宣布接下来的 5.2 版本会专注于提升性能。

### [开源 React Native 组件库 beeshell 2.0 发布](https://mp.weixin.qq.com/s/5XgNTQdBm4QxiStj8dFtHg)

[@looping](https://github.com/looping)：近期美团发布了 React Native 组件库 [beeshell 2.0](https://github.com/Meituan-Dianping/beeshell)，共计开源 38（33 个组件与 5 个工具）个功能。同时本文也对这套组件的系统设计和方案实现进行了详细的讲解，并描述了这套工具在测试和开发调试上的探索，最后也列出了他们对组件库开源建设的长期规划。感兴趣的同学可以持续关注下。

## 新手推荐

### [iOS 实践检查清单](https://github.com/Binlogo/iOS-Practice-Checklist)

[@Parsifal](https://github.com/ParsifalC)：一份较细致的 iOS 项目实践检查清单，列举了 iOS 项目从“创建-开发-调优-发布”不同阶段分别需要注意到的一些细节，适合新人入门上手前几个项目时做自查。

## 文章

### 🐎 [将 flutter_web 迁移到 flutter1.9+](https://github.com/SwiftOldDriver/iOS-Weekly/issues/1671)

[@邦Ben](https://weibo.com/linwenbang)：前不久的 Google 大会上公布了 Flutter 1.9，该版本最大的 feature 就是正式支持 Flutter web，这篇文章简要的翻译了一下迁移 Web 到 1.9 版本的方式。按需阅读即可。

Flutter web 还存在不少问题

- 已经的性能问题还没解决
- 不支持 hot reload
- 不支持 flutter plugins
- 不支持 dart:io，只走 http
- 还不支持 Platform.is

### 🐕 [Flutter 无痕埋点](https://juejin.im/post/5d8c6d40f265da5b633cc5a2)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：无痕埋点一直是各端都在不断探索的一个方向, Flutter 由于刚刚诞生不久, 这方面的资料甚少, 作者从 Flutter 源码层面探寻到不少解决方案, 不失为一个不错的参考. 另附上咸鱼技术组的 Flutter 埋点方案作为补充参考:

- [揭秘！一个高准确率的Flutter埋点框架如何设计](https://www.infoq.cn/article/3-vxBwYJXQxXLDlbu09x)

> 本文由 [枫自飘零](https://juejin.im/user/5cf8c575f265da1bb80c1ea1) 自荐。

### 🐢 [Apple Push Notification Device Tokens](https://nshipster.com/apns-device-tokens/)

[@享耳先森](https://github.com/iblacksun)：iOS 13 发布后，不少推送厂商都通知开发者们升级 SDK，`Mattt` 特地写文章介绍此次改动。

APNS `DeviceToken` 的类型其实是 Data，具体含义和格式是个黑盒，只是 App 拿到 Data 后需要提交给各自的服务端，这就涉及到将 Data 进行格式转换的问题。

iOS 7 之前 Foundation 没有 `NSData -base64EncodedStringWithOptions` 方法，开发者们发现可以使用 `NSData description` 方法输出再进行转换，而 `description` 其实是一个 Debug 方法，具体实现随时会改。

### 🐎 [Flutter Face Detection](https://medium.com/flutter-community/flutter-face-detection-ac18e3e2211f)

[@老驴](https://www.weibo.com/6090610445)：这是一篇比较基础的用 Flutter 和 Firebase 来实现面部识别的教程。

作者介绍了如何使用 Firebase ML Kit 和 Flutter 中 CustomPainter 类相结合，在图片上直接显示出面部位置。

总体来说，这算是个不错的入门教程，有兴趣的话不妨看看。

### 🐕 [iOS 13 适配要点总结](https://juejin.im/post/5d8af88ef265da5b6e0a23ac)

[@anotheren](https://github.com/anotheren)：iOS 13 正式发布已经快两周了，本文总结了各种看得见和看不见的迁移问题，如果你还没有动手迁移，是时候开始了。例如 Dark Mode / Sign In with Apple 这类改动更是需要联动产品和设计，需要尽早准备。

### 🐕 [Xcode 11 初体验](https://juejin.im/post/5d8b0b6951882502c5533e9b)

[@J_Knight_](https://github.com/knightsj)：本文作者从工作流，编辑器，设计工具，代码管理，Debug 工具，性能分析工具，模拟器等方面介绍了 Xcode 11 的更新内容；本文图文并茂，介绍得比较全面，值得参考。

### 🐢 [SwiftNIO —— Swift 版的 Netty](https://juejin.im/post/5d774b2ce51d453b5c121948)

[@xiaofeu86](https://weibo.com/xuyafei86)：SwfitNIO 是一款基于事件驱动的跨平台网络应用程序开发框架，其目标是帮助开发者快速开发出高性能且易于维护的服务器端和客户端应用协议。本文是一篇整理性文章，从网络编程的几种并发模型到 Netty 的介绍再到 SwfitNIO，内容比较全面，适合想要了解 SwfitNIO 和并发编程的人阅读。

### 🐕 [Swift Concurrency Manifesto 中文翻译](https://gist.github.com/yxztj/7744e97eaf8031d673338027d89eea76)

[@极速男孩](https://github.com/ztlyyznf001)：这篇文章旨在来为 Swfit 讨论出一种 first-class 的并发模型。这个提案主要提供了 async/await 和 Actor 两种不同的方法。更多的内容可以参考作者的[原文](https://gist.github.com/lattner/31ed37682ef1576b16bca1432ea9f782)。

### 🚧 🐎 [一个 delegate 被声明为强引用又被悄悄地改掉了](https://twitter.com/chockenberry/status/1171102488205787141?s=20)

[@JimQ](https://github.com/waz0820)：本 tip 来自一条 tweet。`UIViewController.presentationController.delegate` 的 delegate 在 iOS 13 之前的声明是 strong 的，导致 delegate 的两端相互强引用无法正常释放，苹果在 iOS 13 悄咪咪地改为了 weak，但对于 iOS 12 及之前的版本这个内存泄漏问题则会一直存在，有使用 UIPresentationController 的同学留意一下。

### 🐎 [WCCgiMock - 客户端模拟网络回包工具介绍](https://juejin.im/post/5d834380e51d4561ea1a9514)

[@红纸](https://github.com/waz0820)：CgiMock 工具可以帮助开发者在不侵入代码的情况下，构造模拟数据，模拟网络回包。**WCCgiMock** 实现了两种工作模式：

1. 第一种是在 Cgi 请求阶段拦截请求，返回预设好的模拟数据给业务层。
2. 第二种模式是，在请求阶段不拦截，等到后台返回回包后，将模拟数据与后台回包进行合并，再返回给业务层。

与此同时，此工具具有以下特点：编写语言跨平台、内部DSL设计、响应式数据、用例组织能力、热更新调试等。遗憾的是 **WCCgiMock** 暂时还未开源，作者正在筹划准备当中，尽情期待。

### 🐕 [一种查看 Block 中引用的所有外部对象的实现方法](https://juejin.im/post/5d7e3b8de51d4561ac7bcd5f)

[@looping](https://github.com/looping)：本文通过分析 Block 内部布局结构来查看一个 block 所引用的外部对象，原理如下：

1. 系统在编译 block 时会把所有要访问的外部对象或变量复制到 block 对象实例内部；
2. 当一个 block 中有引用外部对象或变量时，它的 `Block_layout->flags` 值中就会有 `BLOCK_HAS_EXTENDED_LAYOUT` 标志；
3. 如果有 `BLOCK_HAS_EXTENDED_LAYOUT` 标志，那么所有引用的外部数据成员的扩展描述信息就能在 block 的 `Block_layout->descriptor` 中找到；
4. 其中布局描述信息又能在 `Block_descriptor->layout` 上找到，包括引用对象的指针修饰类型和数量；
5. 这样一来，就能通过计算偏移来得到外部对象的地址，并转化成 OC 对象输出。

作者在文中不仅对 block 结构进行了解析和说明，同时还给出了完整的代码实现和使用方式，是一份很好的学习资料。

### 🐎 [我开发了一个 SwiftUI 库，将 CSS 引入 iOS 开发](https://mp.weixin.qq.com/s/I0HMHBBzhxsKj528mUqXmg)

[@Damonwong](https://github.com/Damonvvong): 今年 WWDC 推出的 SwiftUI 和以往 iOS 接触的界面开发方式完全不同，是一套全新的设计。坦率的说，整套设计更接近于目前的 Web 开发。作者也正是看到了这点，对是否能将 CSS 的设计引入到 SwiftUI 中做了一些探索，写了一些总结。并开源了 [SwiftUI-CSS](https://github.com/hite/SwiftUI-CSS) 感兴趣的可以了解一下。

当然，目前 SwiftUI 还处于极度不稳定的阶段，不建议大家盲目跟风学习，学有余力稍微了解一下是不错的，现阶段学习并运用到实际应用中是不切实际的。

## 音视频

### [ggtalk | 从石油到 iOS，听听思琦的转行经历](https://talk.swift.gg/45?from=timeline&isappinstalled=0)

[@Parsifal](https://github.com/ParsifalC)：关注我们周报的读者相信对思琦（[@SketchK](https://github.com/SketchK)）都会有印象，因为他是我们目前 Logo 的设计者。这次 GGTalk 思琦和梁大一起聊了他是如何从石油相关专业转化成功到 iOS 开发的历程。

> 梁大：在我认识的人当中，思琦绝对是最厉害的那一批。当然我说的不是天赋，有些人就是天才，你怎么努力也无法超越。思琦厉害的地方在于思考分析能力和执行力。从有转行想法开始，收集信息、了解行业、分析不同职位，最终确定 iOS。然后开始转行，培训班、自学、开源项目、发文章、准备面试、拿到 offer。入职美团之后，完善知识体系、尝试不同方向、不断给自己提出挑战，每一年都在飞速成长。

## 内推

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