# 老司机 iOS 周报 #168 | 2021-07-26

![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

### WWDC 21 内参

老王身体抱恙，停更一周~

## 新手推荐

### 🌟 🐢 [干货 | Flutter 控件 CustomScrollView 原理解析及应用实践](https://mp.weixin.qq.com/s/dF5Id3w_To4aXeXDbUnUjQ)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：CustomScrollView 可以说是 Flutter 开发中一定会用到的一个控件，List，Grid，Sliver 等都是基于 CustomScrollView 实现的，那么如何用好 CustomScrollView 是一个技术活，本文由携程技术产出，从原理上讲解如何更好的使用 CustomScrollView，文中涉及诸多开箱即用的知识点，小编强烈推荐各位仔细学习一遍。

## 文章

### 🌟 🐢 [深入理解 WKWebView（基础篇）—— 聊聊 Cookie 管理那些事](https://mp.weixin.qq.com/s/jZP2DsAa5OV91wdNMw39cA)
[@享耳先森](https://github.com/iblacksun)：本篇是系列第三篇，文章首先介绍了 Cookie 相关 API，然后深入介绍 WebKit 内部 Cookie 管理方式及技术原理。前两篇见：

- [深入理解 WKWebView（入门篇）—— WebKit 源码调试与分析](https://mp.weixin.qq.com/s/VdkVBIQwj7WkAk8-5wppmQ)
- [深入理解 WKWebView（基础篇）—— WKWebView 加载生命周期与代理方法剖析](https://mp.weixin.qq.com/s/ZFui9IiMTWyLXGKZlbnzwQ)


### 🐕 [详解：mach-o 文件如何分析多余的类和方法](https://mp.weixin.qq.com/s/z0eK4cOfvYWFhHl16rGnEg)

Mach-O 是 Mach Object 的缩写，是 Mac 上的可执行文件的格式。本文通过对 Mach-O 的介绍，让我们了解到如何通过 Mach-O 来分析无用类，从而减少包体积的大小。作者还基于此封装了一个分析工具，有兴趣的读者可以了解一下。

### 🐕 [iOS 优化 - 瘦身](https://mp.weixin.qq.com/s/wDcYvea5dTq0dh0PBwRu4A)

[@Barney](https://github.com/BarneyZhaoooo)：本文介绍了 iOS 的经典问题，瘦身优化，从最基础的概念讲起，新人友好，同时也适合大家温故而知新。这是一个优化的专题系列，可以持续关注。

关键点脉络梳理如下：
- APP 的**下载大小**简单介绍
- 瘦身方向
- App Thinning
- 资源文件瘦身
- 编译选项优化
- Mach-O 可执行文件瘦身

### 🐎 [Mutating and non-mutating Swift contexts](https://www.swiftbysundell.com/articles/mutating-and-nonmutating-swift-contexts/)

[@xiaofei86](https://github.com/xiaofei86)：Swift 帮助我们编写更健壮代码的方法之一是通过其广泛使用的值类型。在使用值类型时，所有更改默认情况下仅对我们正在使用的副本执行，并且实际执行更改的 API 必须清楚地标记为 mutating。本文将探讨 mutating 及其不太常用的对应项 nonmutating 的能力和使用场景，感兴趣的同学可以阅读原文了解。

### 🐎 [Fixing a hard-to-find bug in Dark Mode](https://www.jessesquires.com/blog/2021/07/15/fixing-a-hard-to-find-bug-in-dark-mode/)

[@Smallfly](https://github.com/iostalks)：市面上主流 iOS App 基本都支持了系统的深色模式。本文作者在支持深色模式时，遇到 UIButton 在系统主题切换后，部分颜色没有被正常更新。经过一系列的分析，最终定位到问题出在 [Dynamic System Colors](https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/color/) 上。这个坑在支持换肤时还是比较容易踩到的，有需求的同学可以关注一下。

### 🐎 [重磅开源|AOP for Flutter 开发利器——AspectD](https://mp.weixin.qq.com/s/lvP2UFHOG0HrtqMMf7na0g)

[@Damien](https://github.com/ZengyiMa)：面向切面的编程意为：通过预编译方式和动态代理技术在不侵入代码的前提下在指定位置插入功能代码，由于在 Flutter 中禁止了反射的功能，所以在 Flutter 实现 AOP 框架只能另辟蹊径。本文是咸鱼团队在实现 FLutter 的 AOP 框架带来的新的思路，通过对 FLutter 的 dill（Dart Intermediate Language）文件的修改来实现了 AOP 的功能，在 Flutter 中有 AOP 需求的同学不妨可以仔细阅读。

### 🐎 [听说你想写个 DNS 服务器 - 记录类型扩展](https://mp.weixin.qq.com/s?__biz=Mzg4MjU2Mzc1MQ==&mid=2247486727&idx=1&sn=a71ed08275433e15593069e010c31c02&chksm=cf5582cff8220bd96ce28f0dd8874f27064e3999792e6ad25d90a0cf2f56651278495a6927de&token=87205550&lang=zh_CN#rd)

[@J_Knight_](https://github.com/knightsj)：本文是《听说你想写个 DNS 服务器》系列的第三篇，介绍了记录结构以及除 ipv4 映射记录之外的其他四种记录类型：

- AAAA：域名与 ip 映射记录，ipv6 地址
- NS：DNS 域名服务器记录
- CNAME：域名对应的另一个域名，表示真正查找的域名
- MX：邮件服务器域名记录

并结合代码展示了如何处理记录读取扩展和记录展示扩展。

## 摸鱼周报

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

- 本期话题通过对《暗时间》里内容的总结，分享了一些学习和记忆的方法。
- 开发 Tips 讲了如何区分 `minimumLineSpacing `和 `minimumInteritemSpacing` 这两个属性及本地化关于日期的注意事项。
- 面试解析讲解了属性及属性关键字的几个知识点，由@师大小海腾和@反向抽烟整理，内容非常之详细。
- 优秀博客整理了几篇卡顿优化的优质文章。
- 学习资料有两个内容，Combine Operators：帮助理解 Combine 操作符的手机端 App；还有 Stanford 最新的 SwiftUI 2.0 双语教程。
- 开发工具带来了一个基于 linkmap 分析执行文件大小的工具：LinkMap。

## 工具

### [Xcodes.app](https://github.com/RobotsAndPencils/XcodesApp)

[@AidenRao](https://weibo.com/AidenRao)：一个可以安装多个 Xcode 版本，并在它们之间快速切换的应用。

- 可安装所有可用的 Xcode 版本
- 自动化安装，并使用多达 16 个链接，下载速度比直接通过 URLSession 快 3-5 倍
- 一键安装对应版本的 xcode-select
- 可查看发布说明，操作系统兼容性。


### [Flutter 应用内调试工具 UME 开源啦](https://github.com/bytedance/flutter_ume)

[@ChengzhiHuang](https://github.com/ChengzhiHuang): 由字节跳动开源。UME 当前内置了如 性能浮层、日志展示、颜色吸管、代码查看 等 10 个插件，可以按需注册插件。已满足大部分日常开发所需。[pub 地址 >>>](https://pub.dev/packages/flutter_ume)
- 优点：
    - 插件可以按需注册，且支持开发者自己定制件，UME 欢迎大家共建
    - 对 ``1.12.13``，``2.0.1`` 等几个较为稳定的版本都有兼容
    - 有单测保证工具稳定性
- 不足：
    - 有一定侵入性。由于 UME 内部管理路由，因此 APP 内其余 showDialog 等方法需要传入参数 ``useRootNavigator: false``
    - 部分功能依赖 ``VM Service``，本地运行需对脚本进行修改（添加 ``--no-dds`` 参数）
    - 插件内部实现还未兼容 ``nullsafety``，当前只能通过 ``dependency_overrides`` 覆盖版本在 ``no-sound-null-safety`` 模式下使用的，期待适配

## 代码

### [GodL/Binder](https://github.com/GodL/Binder)

[@JonyFang](https://github.com/JonyFang)：Binder 是一个由 `PropertyWrapper` 驱动的数据绑定库，实现了一些类似 RxSwift 的变换操作函数，函数之间支持相互组合。

### [CalendarApp](https://github.com/richardtop/CalendarApp)

[@Parsifal](https://github.com/ParsifalC)：[@Richard][https://github.com/richardtop] 录制了一期关于使用 [CalendarKit](https://github.com/richardtop/CalendarKit)  打造一个简单仿原生日历 App 的视频教程 - [Create iOS Calendar App in Swift with CalendarKit](https://www.youtube.com/watch?v=iC4XxmExqFA)，这是他最后完成的一个 Demo 代码。Calendar 相关的教程不多，[CalendarKit](https://github.com/richardtop/CalendarKit) 可以迅速帮你在 App 内创建类似系统日历 UI 的功能。

> 由 [@Richard][https://github.com/richardtop] 自荐

## 赞助者

虚位以待..

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

## 内推

> bilibili 主站技术中心招聘 高级/资深 移动开发工程师 （包含 iOS Android C++ 等方向）
本团队为核心团队，包含基础架构，播放业务，流量业务，创新业务，通用业务等等众多选择，是内部最大的移动端团队。
负责横向支撑整个平台，追求极致的用户体验，对新技术保持敏感，是国内少数使用 bazel 的团队。
联系方式：简历发送至 zhaohan01@bilibili.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）
