# 老司机 iOS 周报 #199 | 2022-04-18

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

##  Developer - 设计开发加速器

### [“订阅优惠”的工程实践](https://developer.apple.com/cn/accelerator/)

2022 年 4 月 21 日（报名截止 4 月 20 日）

学习如何通过 StoreKit 技术的接入向您的用户提供自动续期订阅产品的推介促销优惠、促销优惠和优惠代码。允许新用户或现有用户在特定时限内免费获取或以折扣价购买自动续期订阅。

### [加快您的测试过程](https://developer.apple.com/cn/accelerator/)

2022 年 4 月 19 日（报名截止 4 月 18 日）

探索如何进行自动化测试，进一步有效处理测试结果。改进您的测试套件以加快反馈循环，进而更快地得到修复。了解如何利用 Test Plan 测试计划、xcodebuild 命令行工具及相关 API 来消除永无止境和表现不佳的测试。我们将研究 XCTest 中的测试超时和执行时间余量，检查设备并行化，并详细介绍用于平衡性能和明确故障定位的推荐实践。

![156925166-f0e9ae02-0d06-4806-aa19-e84d84e2fd1f](https://user-images.githubusercontent.com/11873526/162620205-0cddfae9-05e0-4e10-9359-4d914e3ae08b.jpeg)

## 新手推荐

### 🐕 [Design Patterns 的实战应用记录](https://medium.com/p/78507a8de6a5)

[@老驴](https://weibo.com/u/6090610445)：2016年的时候最火的文章莫过于一些设计模式类的分享。当时各种 MVP，MVC 等等的讨论火爆整个移动开发圈。只不过这几年，很难再见到有这类的文章了。这篇文章是作者自荐，记录的是作者完成一个对其他第三方库的封装的过程。对于刚接触移动开发的同学，可以再学习一下设计模式和其中的思路。

对于大家刚接触这类的同学们，还是想再强调下，天下没有最好的设计模式，只有最适合当前项目的设计模式。千万不要陷入为了模式而模式的陷阱中去，过度设计也不可取。

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

## 文章

### 🌟 🐢 [Lookin 原理及 5 个开发难点](https://mp.weixin.qq.com/s/DL28y2qHkuDv4W_zLUbKcg)

[@Damonwong](https://github.com/Damonvvong):Lookin 是一款可以查看与修改 iOS App 里的 UI 对象的软件，相信很多人都使用过它，之前一直好奇这款软件的实现原理，软件作者李凯就带了了实现 Lookin 的原理和 5 个开发难点。其主要通过 CS 架构实现 mac app 和 iOS app 之前的通信机制。同时也从做 Lookin 这款软件的过程中，总结了以下几个经验：

- iOS 程序员如何学习写 macOS 程序？
- 如何在 macOS 和 iOS 之间传输数据？
- 如何正确渲染展开/折叠图像？
- 如何渲染 3D 图像？
- 如何加快刷新速度？

感兴趣的同学，可以阅读原文查看细节。

### 🌟 🐕 [Xcode Cloud: Feedback from leboncoin](https://medium.com/leboncoin-engineering-blog/xcode-cloud-feedback-from-leboncoin-82991326faa0)

[@Damien](https://github.com/ZengyiMa): Xcode Cloud 是专为 Apple 开发者设计的 Xcode 内置持续集成和交付服务。本文来自 leboncoin iOS 团队在使用 Xcode Cloud 的体验，详细介绍了 Xcode Cloud 的方方面面，也介绍了其中的不足和优势，对 iOS 开发 CICD 相关的感兴趣的同学不妨一读。

### 🌟 🐕 [音视频工程示例 AVDemo 7、8、9](https://mp.weixin.qq.com/s/CJAhkk9BmhMOXgD2pl_rjg)

[@JonyFang](https://github.com/JonyFang): 音视频工程示例 AVDemo 7、8、9 篇：

- iOS AVDemo 7: [视频采集 Demo](https://mp.weixin.qq.com/s/CJAhkk9BmhMOXgD2pl_rjg)，实现视频采集逻辑并将采集的视频图像渲染进行预览，同时支持将数据转换为图片存储到相册;
- iOS AVDemo 8: [视频编码 Demo](https://mp.weixin.qq.com/s/M2l-9_W8heu_NjSYKQLCRA)，串联视频采集和编码模块，将采集到的视频数据输入给编码模块进行编码，并存储为文件;
- iOS AVDemo 9: [视频封装 Demo](https://mp.weixin.qq.com/s/W17eLiUeCszNM8Kg-rlmBg)，串联视频采集、编码、封装模块，将采集到的视频数据输入给编码模块进行编码，再将编码后的数据输入给 MP4 封装模块封装和存储;

### 🐢 [得物 App H5 秒开优化实战](https://mp.weixin.qq.com/s/23ZFPK4CaCkinwpZ3SG9Rw)

[@J_Knight_](https://github.com/knightsj)：本文介绍了得物技术是如何将 H5 页面的秒开率从 30% 提高到 75% 的。文章最开始介绍了优化的背景和使用的指标。然后介绍了具体的优化方案，在客户端和 H5 都做了优化：

客户端优化：
- HTML 预加载
- HTML 预请求
- 离线包技术
- 接口预请求
- 预建连 & 链接保活
- 预渲染

H5 优化：
- SSR 服务端渲染
- HTML 预渲染
- CSS 包大小优化
- 图片优化
- 其它优化

在介绍方案的同时，也给出了遇到的难点和方案应用后的效果展示，文章最后也介绍了所使用的前端性能监控的方案

### 🐢 [Introducing Swift Async Algorithms](https://www.swift.org/blog/swift-async-algorithms/)

[@莲叔](http://github.com/aaaron7)：async/await 操作符相信大家都不陌生，在很多语言中都对起进行了支持，比如 js。async/await 最大的意义在于让我们可以用顺序结构来书写异步代码，更加清晰，避免了callback hell。3月份，Swift 维护小组发布了原型版本的 Swift Async Algorithm Package，其中就包含了 async/await 的实现以及专门用来处理异步系列的算子，比如 Zip/CombineLast/Merge/Chain/Buffer/Debounce/Throttle。这些算子相信大家都不陌生，其实用法和在处理集合类型中使用是没有太大区别的，只是搭配 async/await 来使用就能够并发强大的能量，使用简洁的代码描述复杂的异步逻辑。感兴趣的同学可以持续关注这个 package 的后续进展。

### 🐎 [iOS SIGKILL 简单介绍](https://juejin.cn/post/7081995513700024327)

[@xiaofei86](https://github.com/xiaofei86)：当崩溃日志的 Exception Type 为 SIGKILL 时，表示操作系统从上层杀死了我们的进程。本文通过对苹果 [Understanding the Exception Types in a Crash Report](https://developer.apple.com/documentation/xcode/understanding-the-exception-types-in-a-crash-report) 和 [Addressing Watchdog Terminations
](https://developer.apple.com/documentation/xcode/addressing-watchdog-terminations) 文章的翻译整理，介绍了 SIGKILL 不同错误代码的含义，以及如何定位解决这些问题。

### 🐎 [Adding Custom Shortcuts To Xcode](https://digitalbunker.dev/toggling-slow-animations-again/)

[@极速男孩](https://github.com/ztlyyznf001)：在 Xcode 把开启模拟器中的Slow Animations 的 Command + T 去掉以后，如果要打开 Slow Animations 就变得十分麻烦。本文教你如何给 Xcode 设置一些自定义的快捷键。

### 🐢 [终端新玩法：“零代码”的剧本式引导](https://mp.weixin.qq.com/s/HZDcvHAtIgJfgD2mMGaHzA)

[@AidenRao](https://weibo.com/AidenRao)：互联网行业节奏偏快，App 的更新愈发频繁，如何让用户理解产品功能，完成认知迭代，是业务发展中不可忽视的一环。本文介绍了美团外卖终端团队在用户心智建设领域的探索与实践。从业务现状与剧本式思维的思考出发，终端加管理后台的一站式设计，传统 CV 与深度学习结合，大大简化了剧本式引导的接入门槛。

### 🐕 [Xcode13 “消失”的 Info.plist 文件](https://mp.weixin.qq.com/s/mgGjBb9dt714c117xrYGfQ)

[@Barney](https://github.com/BarneyZhaoooo): 本文介绍了 Xcode13 中 Info.plist 文件的官方配置变化。

从 Xcode13 开始，新建的工程不再要求使用配置文件（Info.plist、entitlements）。如果需要修改 Xcode 的配置，请直接在 Xcod e面板 ”target - Info - Custom iOS Target Properties” 和 ”build settings”中设置。

- 消失的 Info.plist 文件
- 如何回到从前的 Info.plist？

### 🐎 [Flutter 代码生成技术 APT 与 AOP 适用场景与对比](https://mp.weixin.qq.com/s/eWG8HiaJFiHd3jxSnnZ4aQ)

[@Damien](https://weibo.com/ZengyiMa)：APT（Annotation Processing Tool）是注解处理工具，AOP（Aspect-Oriented Programming）是面向切面编程，在 Flutter 中也有类似的概念，本文从以下几个方面详细介绍了这 2 项技术：

* APT & AOP 的概念解读
* APT & AOP 的实现原理
* APT & AOP 的使用场景
* APT & AOP 的技术对比

### 🐎 [精确定位页面滑动帧率瓶颈及优化参考](https://juejin.cn/post/7077812846217658381)

[@Leo](https://github.com/leomobiledeveloper)：页面流畅性是一个非常影响用户体验的性能指标。本文从原理和工具出发，讲解了如何定义以及分析卡顿，接着从富文本异步绘制、约束布局、视图创建等几个角度介绍了如何针对性的优化。

### 🐕 [PROTOCOL & GENERIC IN SWIFT](http://nonomori.bitcron.com/post/protocolandgenericinswift/readme)

[@zvving](https://github.com/zvving)：Swift 基于面向协议的设计提供了简明&丰富的抽象手段，这也给复杂场景使用 Protocol 带来不少歧义，官方最近几个版本与之相关的设计也持续被讨论并改进。比如 [Opaque Result Types](https://github.com/apple/swift-evolution/blob/master/proposals/0244-opaque-result-types.md)、[Unlock existentials for all protocols](https://github.com/apple/swift-evolution/blob/main/proposals/0309-unlock-existential-types-for-all-protocols.md)。

本文从一个简单例子对比范型及类型擦除如何应用及二者内部实现的不同，帮助大家加深理解：
- 静态 vs 动态
- 编译器生成模板代码 vs 通过 Existential Container 隐藏类型

### 🐎 [Type placeholders in Swift](https://www.swiftbysundell.com/articles/type-placeholders-in-swift/)

[@anotheren](https://github.com/anotheren)：Swift 5.6 中引入了 **Type Placeholders** 来进一步优化类型推断，允许使用 `_` 来让编译器自动推断类型，对于例如 `CurrentValueSubject<Output, Failure>` 这一类的复杂范型更加友好。

### 🐢 [构建顺滑自然的 Flutter 页面](https://mp.weixin.qq.com/s/6FLMcE67BCbXvnbFSRgHFg)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 以高性能和高一致性渲染著称，但也不是随便写写就能流畅如丝的，本文由阿里巴巴移动团队产出，分享了 Flutter 流畅度优化的挑战、监控工具、优化手段和建议。从代码到工具侧的使用，抽丝剥茧，强烈推荐

## 工具

### [XcodePatch](https://github.com/unixzii/XcodePatch)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：Xcode 13.3 在 LLDB 中使用中文输入就会直接卡死，这个工具通过重签与注入 Patch 的方式解决卡死。近日最新发布的 Xcode 13.3.1 依旧未修复此问题。~~升级 Xcode 竟成高风险行为~~。

### [Xcode13 Tips：构建系统](https://developer.apple.com/documentation/Xcode-Release-Notes/xcode-13_3-release-notes#Build-System)

[@红纸](https://github.com/nianran)：Xcode13 现已提供新的构建参数用于加速 Swift 项目的构建，其能够更好的使用内容，加快构建速度。你可以通过下述全局命令打开此构建参数：

```shell
defaults write com.apple.dt.XCBuild EnableSwiftBuildSystemIntegration 1
```

### [xcframework-maker](https://github.com/darrarski/xcframework-maker)

[@红纸](https://github.com/nianran)：此工具可以将 Fat Framework 作为原料来转化为 XCFramework 文件。生成的 XCFramework 可以作为 SPM 的依赖使用。

## 代码

### [CodeEdit](https://github.com/CodeEditApp/CodeEdit)

[@水水](https://www.xuyanlan.com): CodeEdit 是一个由开发者社区为社区而构建的免费开源的代码编辑器，功能包括语法突出显示、代码完整性、项目查找和替换、代码段、终端、任务运行、调试、git 集成、代码 Review、扩展等。CodeEdit 让不为苹果平台开发的项目像文本编辑一样轻松，但提供类似于 Xcode 的体验。换句话说，希望在保持轻量级、性能和可靠性的同时为开发人员提供完整 IDE 的功能。

## 摸鱼周报

[@摸鱼周报 #50](https://mp.weixin.qq.com/s/6IS0RlytWxjeRHyh0f2fXA)：已经第 50 期了，一个新的节点，一起来看下本期概要吧：

* 话题：WWDC 22 Call to Code，尝试从图标挖掘一些彩蛋
* 面试模块：事件响应与传递
* 优秀博客：复习 iOS 的 rebase 和 bind
* 学习资料：闲话 Swift 协程
* 开发工具：AppleParty 是一款实现快速操作 App Store Connect 后台的自动化 macOS 工具。

## 内推

### [上海/北京/杭州/深圳] 字节跳动音乐团队 - 汽水音乐 - iOS/Android 开发

字节跳动音乐团队秉承『用音乐建立共鸣，用音乐激发表达。』的使命，除了刚刚上线的汽水音乐，字节在音乐业务已持续投入多年，海外产品 Resso 已突破 2kw DAU，抖音、TikTok 音乐场景不断建设、音乐人服务逐步完善。

团队目前 iOS/Android 职位急招（包含初/中高/Leader 职位），Base 上海/北京/杭州/深圳均可。

> 联系方式及更多信息：https://www.yuque.com/iosalliance/article/viprra

### 其他

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

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

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

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

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2021」，领取 2017/2018/2019/2020 内参**

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