# 老司机 iOS 周报 #162 | 2021-06-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) 提出。

## WWDC 2021

**明天，也就是 6 月 8 日凌晨 1 点，WWDC 21 正式拉开序幕，周报编辑组也将投入到 WWDC 21 的相关活动中去，所以下周周报将会停更一期，欢迎大家关注我们接下来的一系列 WWDC 专题活动！**

### 🌟 [WWDC 21 内参作者招募 & WWDC 20 内参免费领取](https://mp.weixin.qq.com/s/_VdIsQbnnwb1MQUTpAGOyA)

[@Parsifal](https://github.com/ParsifalC)：伴随着 WWDC 即将开幕，由周报牵头举办的一年一度 WWDC 内参活动也开始了筹备工作。今年我们想尝试从广大读者中也邀请一些对 WWDC 内参编写感兴趣的人一起参与内参的编写。另外，我们**所有读者都可以免费领取** WWDC 20 的专栏。不管是想参与 WWDC 21 编辑工作，还是想免费领取 WWDC 20 内参，都可以点这里 - [我是福利](https://mp.weixin.qq.com/s/_VdIsQbnnwb1MQUTpAGOyA)

### 🌟 [WWDC.playground by SwiftGG](https://swift.gg/wwdc/)

[@Parsifal](https://github.com/ParsifalC)：WWDC 21 将于 6 月 8 日凌晨 1 点正式在线上举行，今年国内的 iOS 社区组织了多个不同形式的活动，WWDC.playground 就是其中一项。SwiftGG 邀请了来自世界各地的设计师、产品经理以及 Swift 社区活跃开发者，站在他们各自的视角，和大家一起聊聊 WWDC21。帮助大家更好地跟上 WWDC21 的节奏，尽快把新技术集成到自己的产品中。值得一提的是，本次活动被苹果官方列入了 [Beyond WWDC](https://developer.apple.com/wwdc21/beyond-wwdc/) 的专题列表，快来关注吧~

### 🐎 [A Swift developer’s WWDC dreams - 2021 edition](https://www.swiftbysundell.com/articles/a-swift-developers-wwdc-dreams-2021/)

[@四娘](https://kemchenj.github.io/)：今年 SwiftBySundell 也在博客里分享了他作为 Swift 开发者的心愿单，包括：

- SwiftUI 提供更多可以自定义的接口
- 让所有接口都 Async/await 化
- 可交互的 Widget
- 更加强大可靠的工具链
- Xcode on iPad
- 使用 Swift 全栈开发

期望苹果今年也可以帮助所有开发者喜加一。

### [WWDC NOTES](https://wwdcnotes.com/)

[@老峰](https://github.com/gesantung)：WWDC NOTES 是一个持续更新 WWDC Session 的网站，包含历年新功能、新设计、新框架、新开发工具，也可以在这个网站上提交新的笔记，对 WWDC21 感兴趣的同学可以收藏此网站，接下来会同步更新 WWDC21 相关内容。

## 新手推荐

### 🐕 [Dart 里的类型系统](https://mp.weixin.qq.com/s/aBOUm6E1CXGl-GyKP94TeA)

[@邦Ben](https://weibo.com/linwenbang)：该文是翻译文，文内主要讲述了 Dart 里面的类型系统，适合新手入门的时候看看。里面也提到一些不常见用法，例如 `names.forEach(print)` 等价于 `names.forEach((name){print(name);});`；以及可调用对象 `Foo()();` 这种比较 trick 的用法，详细可以看下文章。

## 文章

### 🐕 [无埋点核心技术：iOS Hook 在字节的实践经验](https://juejin.cn/post/6968275950786215944?utm_source=gold_browser_extension#heading-0)

[@JonyFang](https://github.com/JonyFang)：常见的埋点采集方案是在响应用户行为操作的路径上进行埋点，但由于 App 通常会有比较多界面和操作路径，主动埋点的维护成本会很大。所以行业的做法是无埋点，而无埋点实现需要 AOP 编程。

实现方案的迭代及实践中碰到的坑：
1. 方案的迭代
    - Method Swizzle
    - 代理模式
2. 方案接入后的踩坑
    - 野指针引发的问题的分析定位及修复方案
    - RxCocoa 引发的问题的分析定位及修复方案

Hook 不是很优雅的方式，原因在于随着实际应用场景复杂性的变化，任何 Hook 都有可能存在兼容性的问题。文中最后也给出了相应的建议：
- 谨慎使用 Hook；
- Hook 系统接口一定要遵循一定的规范，不能假想只有你在 Hook 这个接口；
- 不要假想其他人会怎么处理，直接把多种方案集成到一起，构建多种场景，测试兼容性。

### 🐎 [字节小哥带你揭秘 Dart VM 魔术盒](https://juejin.cn/post/6960932663095984136)

[@Damien](https://github.com/ZengyiMa)：本篇文章是由字节移动平台团队带来的 Dart VM 文章，本文会详细介绍在 Dart VM 中的 Dart VM Isolate, Run From Source Via JIT 以及 Running from Snapshots 3个核心运行机制，文章内容层层深入带读者逐步理解其原理，对学习 Flutter 以及 Dart 底层感兴趣的同学可以好好研读一番。

### 🐕 [Adding Swift Code as Custom LLDB Command](https://swiftsenpai.com/testing/add-custom-lldb/)

 [@含笑饮砒霜](https://weibo.com/chinafishnews/)：多数开发者工作中都会使用到 LLDB 命令，但是很多人却不知道可以使用纯 Swift 代码定义自己的 LLDB 命令。本文介绍了如何添加你的第一个 LLDB 命令、添加带参数的 LLDB 命令以及将复杂的 Swift 代码转换为 LLDB 命令。有些自定义的命令特别有用，会让我们在开发中受益。

### 🐎 [🐞 Insidious Bugs #3: Apple App Site Association File Identifiers](https://lickability.com/blog/insidious-bugs-number-3-apple-app-site-association-file/)

[@Smallfly](https://github.com/iostalks)：本文介绍了 Lickability 团队 App 在支持 [Associated Domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains#Overview) 能力时的踩坑经历。根据苹果文档介绍，在创建 `apple-app-site-association` 文件时，其中的 `appIds` 字段值需由 `<Application Identifier Prefix>.<Bundle Identifier>` 格式组成，却没有说明 Application Identifier Prefix 前缀是什么。他们经过一系列的尝试之后，在 Team Identifier 和 App Identifier 之间找到了答案。

> 想了解更多关于 universal link 相关的应用，建议阅读周报编辑 [@味精](https://github.com/Awhisper) 的这篇文章 - [Universal Link 前端部署采坑记](https://awhisper.github.io/2017/09/02/universallink/)。

### 🐢 [What's new in Swift 5.5?](https://www.hackingwithswift.com/articles/233/whats-new-in-swift-5-5)

[@AidenRao](https://weibo.com/AidenRao)：Swift 5.5 的第一个测试版本，即将在 WWDC 上放出。它将带来大量改进，async/await, actors, throwing properties 等，本文通过代码示例，逐一介绍每个改动。

- [async/await](https://mp.weixin.qq.com/s/ofYWD4AHm8qR65n0P2mbeA)：异步函数，允许将异步代码当作线性同步代码来编写
- actors：在并发环境中可以安全使用的类，只能由单个线程访问 actor 内的可变状态

### 🐎 听说你想写个 React

* [听说你想写个 React - dom](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485430&idx=1&sn=6c7e1c1f2e54299305a314a4f79e6422&chksm=cf55883ef8220128caf3c4b07ef53d1f40ce742af40c8a2aef1f5ced37b18d1e2df6934eb80b&token=269095387&lang=zh_CN#rd)
* [听说你想写个 React - jsx](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485430&idx=2&sn=7b738f351870748af72fc7db14877082&chksm=cf55883ef8220128bc4923c1ab1c4d619bc71bcc57750ae9cc71fe56504cd04f4e3d270a8ec6&token=269095387&lang=zh_CN#rd)
* [听说你想写个 React - virtual dom](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485507&idx=1&sn=43a4f84434da7e654e8f5fccbf4d1bb2&chksm=cf55878bf8220e9db00cd7c2587c47197c3580d25fe73e4d9fcfd6c468bf4ae7ce846b9eba89&token=269095387&lang=zh_CN#rd)
* [听说你想写个 React - Component](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247485599&idx=1&sn=f4665f943af6bc916b0d669e7783d2e5&chksm=cf558757f8220e4143282eb9f608e1727326ddb9b68ea0bff467ac1ed16c9e6803fc21e3d549&token=1155900023&lang=zh_CN#rd)

[@老驴](https://www.weibo.com/6090610445)：这是个手把手教你从 0 开始写一个 React 系列文章。目前包含了 4 篇，跟作者一起动手实现 dom，jsx，virtual dom，Component。相信和作者一起写一遍之后，你对 React 的理解能更深入一层。

### 🐢 [论证：iOS 安全性，为什么需要审核？](https://juejin.cn/post/6967199105541996575)

[@anotheren](https://github.com/anotheren): 本文来自 Epic Games 与 Apple 诉讼中，针对 “iOS 安全性” 这个问题进行展开的辩论，即：苹果可以让 iOS 系统，在**应用分发**和**第三方访问**等方面更像 macOS，也*不会在安全性方面受到影响*。辩论中的内容，对于我们近一步了解 iOS/macOS 的安全机制十分有用，推荐阅读。

### 🐢 [揭秘苹果应用审核团队（史上最全版）](https://juejin.cn/post/6970363897668698148/)

[@Parsifal](https://github.com/ParsifalC)：苹果的应用审核团队一直都很神秘，这篇文章从网上可查的一些蛛丝马迹，试图揭开审核团队的神秘面纱，读读还是比较有趣的，毕竟我们长期要与审核团队打交道，多了解一些他们的事情，不是坏事儿。

> 本文由 [iHTCboy](https://github.com/iHTCboy) 推荐

### 🐎 [面试过 500+ 位候选人之后，想谈谈面试官视角的一些期待](https://mp.weixin.qq.com/s/XNv3rYRJvv4N7Xaw-c5ZsA)

[@莲叔](http://github.com/aaaron7): 一篇不错的讲通用面试技巧的文章，内容如标题，从一个大厂面试官的角度给出了一些实用中肯的建议。大厂的面试说难也难，说不难也不难。核心原因就是虽然 bar 很高，却有一套通用的方法论。比如不管哪个公司，面试官考察的套路都差不多。这篇文章乍看上去比较虚，但仔细的一条条看下来就是把这个套路很直白的说给你听。有需要的同学可以多多研究。

### 🐢 [手把手教你 Debug — iOS 14 ImageIO Crash 分析](https://mp.weixin.qq.com/s?__biz=MzI1MzYzMjE0MQ==&mid=2247488918&idx=1&sn=9d3f19288191569d4cdf4a6dcef80270&chksm=e9d0de74dea75762b0b77ccd20f0f50d7b42ba9ca847490f5a22decbd950ebe79b48d8e16c8e&scene=0&xtrack=1#rd)

[@水水](https://www.xuyanlan.com)：记录了一次 iOS 14 上大量出现的 ImageIO 相关堆栈的 Crash 问题的定位、分析、反汇编、最后修复的过程。读者不仅能够参考修复类似问题，也可以学习和借鉴本文 Crash 解决的思路。

## 摸鱼周报

[@摸鱼周报 #13](https://mp.weixin.qq.com/s/qJG74OQsJ1VV1cB6fDX8TA)：本期摸鱼周报讨论了一个 Swift 5 出现的 `module stability` 问题，即使用不同版本 Swift 编译器编译的 binary 如何兼容。

概念篇来到了**程序员必知的硬核知识大全**的最后一节，这节介绍的内容有：BIOS、汇编、虚拟机、外围中断、DMA 等。博客篇收集了一些介绍 watchdog 的文章，这些内容可以帮助你了解什么是 watchdog 以及如何定位这类问题。另外我们还收录了一个非常有意思的软件 [Whatpulse](https://whatpulse.org/)，它可以为你统计你的键盘和鼠标使用情况，比如一天中你敲击了多少次按键以及各个按键的使用频率等。

## 工具

### 🐢 [XD to Flutter 2.0 现已发布！](https://mp.weixin.qq.com/s/VWSzeQb_pV9EWXqdWuu51A)

[@极速男孩](https://github.com/ztlyyznf001): Adobe XD由 gskinner 与 Adobe 联合开发， 你可以将你的设计导出成 Flutter 代码，在 Adobe XD 2.0中，加入了 "堆栈" 和 "滚动组"的支持，可以转换成常见的 Flex Widget、Column、Row 以及 SingleChildScrollView 等Flutter Widget。

## 音视频

### [AirTag 有用，但不是完全有用](https://www.xiaoyuzhoufm.com/episode/60b419020013dcfe5cf0d581)

[@没故事的卓同学](https://github.com/lacklock)：我最近做了一个播客[卖鱼桥分桥](https://www.xiaoyuzhoufm.com/podcast/607e818b3bfd9e4d8913a87b)，里面会有一些内容围绕程序员的生活方式展开，如果有感兴趣的朋友欢迎关注一下。未来也会出几期和 WWDC 有关的内容，也安排一些针对开发者的采访。欢迎大家订阅。

## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 iTDriverr 哦~**

## 内推

> 微医云招聘高级 iOS 开发工程师，详细内容可参考 - [[杭州萧山] 微医 - 微医云 - 高级 iOS/Android 开发工程师](https://mp.weixin.qq.com/s?__biz=MzI2NTAxMzg2MA==&tempkey=MTExNl9Ga1hZTnRZL0orT0l3akY5TzhMWHk1MXNCeGQwX3pkRlB2QWFxQW1kTDJlOFRfU05NUWU5VTJ2dG1tcmRVRUUwa1E3RHRxRlNIb0tRamVzUmJ0b3JMc2ZuU1VXNWF5UF9zWGllemhBd1pzZWpFak9VQWU3dDdXMzlCeTVKYnZrb2Y1Z3RTZEcxYVpSSWtKck5ucHRsSFhaUjZTM29BYmN5d3EzWlZRfn4%3D&chksm=6aa2840b5dd50d1d947adf708480766b26d5729c6c39a24cb2cbf463af109980d5c0a37ddde3#rd)，有意者简历投至邮箱：zhangmw1@wedoctor.com

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