# 老司机 iOS 周报 #171 | 2021-08-16

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

### 🌟 线下沙龙

[@Parsifal](https://github.com/ParsifalC)：我们正在周报公众号上陆续发布今年杭州场和上海场沙龙的分享文章、PPT 和视频等内容，欢迎大家继续关注（公众号回复**杭州**即可获取杭州场文章和视频）~

- [基于 Bazel的 iOS MonoRepo 实践 - 张忻正](https://mp.weixin.qq.com/s/zFrKoHPBv3qz8TiwdqP8Fw)
- [Advanced Property Wrapper in Swift - 黄智杰](https://mp.weixin.qq.com/s/psgRgIZlVDtIeQeDmUmXOw)
- [From Idea To Product - Roc](https://mp.weixin.qq.com/s/TZHrFOU65iG7QQwP8b96-w)

### 🌟 [WWDC 21 内参](https://xiaozhuanlan.com/wwdc21)

[@Parsifal](https://github.com/ParsifalC)：本周内参更新，1 篇高质量内容已经发布~

- @陈剑强：[【WWDC21 10036】使用 SoundAnalysis 内置分类器实现声音分类](https://xiaozhuanlan.com/topic/5627914803)

## 新手推荐

### 🐎 [iOS 页面渲染 - UIView & CALayer](https://mp.weixin.qq.com/s/ElGEsJoh3Y1-BWlvz1yJ9w)
[@ChengzhiHuang](https://github.com/ChengzhiHuang)：UIView 所有 iOS 开发想必都接触过，但底下的 CALayer 大家了解就相对偏少，本文适合刚入门的开发者查漏补缺。内容如下：

- CALayer 是如何与 UIView 配合实现动画，以及 内部的三份树形结构：layer tree (model tree)、presentation tree、render tree
- CALayer 在页面的渲染流程中发挥的作用，通过 CALayerDelegate 可以实现手动绘制、异步绘制
- bounds、position、anchorPoint 等属性的介绍，并总结了 frame 与其他属性的关系

## 文章

### 🌟 🐢 [深入理解 Swift 代码覆盖率](https://mp.weixin.qq.com/s/uKfrC2NB3njzF1JQUt_cbg)

[@Parsifal](https://github.com/ParsifalC)：对于基础架构团队，输出产物的稳定性是至关重要的，尤其是像字节这样一个超大型的客户端团队内。为了保障各项 SDK 的稳定性，提高自动化测试的覆盖率是很多团队的一个选择。若你也是 Swift 的长期使用者或关注者，不难发现自从 Swift 2 开始，官方便支持了 Swift 测试代码覆盖率的统计。对于一般的项目而言，只要简单在 Xcode 中开启对应开关，就可以轻松得到项目中的覆盖率。但本文讨论的是基于分布式编译和测试场景下的 Swift 代码覆盖率，这一场景下，精准统计覆盖率就变得不那么容易了。主要原因在于分布式执行 CI 任务，是在相对隔离的环境下进行的，每次任务间的编译路径并不相同，无法简单直接累加覆盖率合成实际完整的项目木覆盖率。抖音团队通过深入研究官方提供的覆盖率测试文档，具体的做法是：

- 将每个测试结果的 `profraw` 文件解析为文本格式的 `profdata` 并且统一路径
- 合并多个 `profdata` 得到真实的覆盖率数据
- 使用 `llvm-cov -path-equivalence` 命令完成源码路径的映射

### 🌟 🐕 [Reverse Engineering UIKit to Fix Our Top Crash | PSPDFKit](https://pspdfkit.com/blog/2021/reverse-engineering-uikit/)

[@Barney](https://github.com/BarneyZhaoooo)：本文是 PSPDFKit 团队通过逆向修复 UIKit bug 的实践经验，分析问题的过程十分详细，值得学习借鉴。

- 崩溃问题定位，Hopper 反汇编。
- 问题分析，拆解。
- UIPageViewController 逆向。
- 通过 swizzling 修复并验证。
- 复盘总结 Floating-point precision errors are vicious。

### 🐢 [听说你想写个 DNS 服务器 - 代理](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247486791&idx=1&sn=2695a508ea45e43527875058ad106e6d&chksm=cf55828ff8220b990eb722b4fb149b8cd424133d05646ea7e369ab4597c1e97503714a6f20dd&token=1722840270&lang=zh_CN#rd)
[@水水](https://www.xuyanlan.com)： 作者用实际代码详细的描述如何编写一个 DNS 服务器的雏形，包括对查询包的解析，然后返回对应的响应包。
整个流程如下：
- DNS 服务器开启本地 UDP 服务。
- 本地 DNS 客户端发起请求。
- DNS 服务器收到请求后，重新构造请求包，转发到公共 DNS 服务器。
- 当收到公共 DNS 服务器的结果后，构造响应包，将数据返回给客户端。

系列关联文章 - [听说你想写个 DNS 服务器 - 记录类型扩展](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247486727&idx=1&sn=a71ed08275433e15593069e010c31c02&chksm=cf5582cff8220bd96ce28f0dd8874f27064e3999792e6ad25d90a0cf2f56651278495a6927de&token=1722840270&lang=zh_CN&scene=21#wechat_redirect)

### 🐎 [深入浅出贝塞尔曲线](https://juejin.cn/post/6995482699037147166)
[@Smallfly](https://github.com/iostalks)：本文详细介绍了贝塞尔曲线的定义和推导过程，以及 iOS 提供绘制曲线能力的相关类和 API。通过实现波浪动图来展现二阶和三阶贝塞尔曲线的应用。最后还介绍了在已知曲线阶数的前提下，根据起点和终点反向推导控制点的计算过程。强烈推荐不了解贝塞尔曲线实现的同学阅读。

### [Stack Overflow 2021 开发者调查报告出炉，开发浪潮中的变与不变](https://mp.weixin.qq.com/s/E6R3dXGBa4YzzuekxPMgOw)

[@Parsifal](https://github.com/ParsifalC)：2021 年 5 月 25 日，Stack Overflow 举办的一年一度的开发者调查重新启动，就在 8 月 2 日，调查结果新鲜出炉，超过 80,000 名开发者参与了调查，JavaScript 连续 9 年获得最常用编程语言冠军，React.js 首次赶超 jQuery 成为最常用的 Web 框架，而 Svelte 后来居上夺得最受欢迎 Web 框架。Rust 连续第 6 年登顶最受喜爱语言，受到超过 86% 开发者的喜爱。我们一起看一看 2021 年，开发者发生了怎样的变化。

## 摸鱼周报

[@摸鱼周报 #22](https://mp.weixin.qq.com/s/JI5mlzX9cYhXJS81k1WE6A)：第二十二期摸鱼周报，一起来看下本期概要：

* 本期话题：聊聊 iOS 博客环境，公众号vs掘金。
* Tips：Reachability 的使用建议，SQL 中 JOIN、UNION 的含义，如何在项目中区分 AdHoc 和 AppStore 包。
* 面试解析：本期讲解 block 类型的相关知识点。
* 优秀博客：如何做电量方面的优化，关于 MetricKit 的使用。
* 学习资料：布朗大学的学生制作的「看见统计」课程；一个 Github 仓库 Hacker Laws，总结各种定律和法则。
* 一个帮助学习正则表达式的在线工具：regex101。

## 工具

### [mxcl/xcodebuild](https://github.com/mxcl/xcodebuild)

[@红纸](https://github.com/nianran)：这是一个基于 Github Actions 的 Action，其作用是帮助开发者去构建签名打出产物包和进行单元测试。其优势在于轻量化的配置方式和 Github Action 完整的自动化体系，只需要一个配置文件即可完成整个配置。如果你的整个持续集成体系是基于 Github Action 的值得进行一试。

## 赞助者

虚位以待..

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

## 内推

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