# 老司机 iOS 周报 #208 | 2022-07-11

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

> [苹果 App Store 审核问题和体验收集](https://docs.qq.com/form/page/DZUxDcVdPQWpJc0hL#/fill)
> 老司机准备做一次社区内关于 App Store 审核这方面的问卷调查，旨在了解我们社区内 App Store 审核的体验与存在的问题。收集完问卷后我们会不定期组织有经验的开发者进行圆桌讨论，并将典型的问题整理成文发布。可以[点击链接](https://docs.qq.com/form/page/DZUxDcVdPQWpJc0hL#/fill)填写。

## [《WWDC22 内参》](https://xiaozhuanlan.com/wwdc22)

> 上周一共更新了 14 篇文章，目前总共已经更新了 48 篇，每篇质量都非常高，由于篇幅问题，开头先推荐 5 篇可能大家更感兴趣的，其他的放到周报最后了~

### 🌟 [【WWDC22 10056】在 SwiftUI 中组合各种自定义布局](https://xiaozhuanlan.com/topic/1507368249)

在本 Session 中介绍了 SwiftUI 用于编写应用程序视图布局的一些新工具。

- 我们可以使用 Grid 来构建高度可定制的静态信息二维布局。
- 我们可以使用布局协议来定义自己的通用布局、可重用布局或特别定制用例的布局。
- 当我们想让 SwiftUI 从一组视图中选择最适合屏幕可用空间时，我们可以使用 ViewThatFits。我们可- 以使用 AnyLayout 在不同的布局类型之间平滑地过渡。
- 以及关于 GeometryReader 的讨论。

### 🌟 [【WWDC22 10106】游戏内存调试与优化](https://xiaozhuanlan.com/topic/4258936701)

本文展示了 Apple 平台游戏 App 内存的计算、分配、和调优技巧。全文分四个部分：
- 第一部分讲解了内存的基本概念；
- 第二部分展示如何使用 Instruments 工具和 Game Memory Template 来分析游戏，通过游戏内存快照来监测当前内存使用情况；
- 第三部分介绍了使用 Xcode Memory Debugger 和命令行工具进行分析优化；
- 第四部分探索 Metal Debugger 中的 Metal 资源，并提供提示和技巧以进一步优化内存使用。
通过本文的探索，您可以更好地理解游戏的内存构成和优化游戏的内存使用。

### 🌟 [【WWDC22 110370】使用 LLDB 调试 Swift](https://xiaozhuanlan.com/topic/4809126537)

本文主要介绍了在使用 LLDB 调试 Swift 代码时常见的问题，包括源代码索引问题以及 po 指令失效问题，通过分析问题出现的原因和解决方案，帮助各位开发者更深入地了解 LLDB 的调试信息和工作原理，并且学会在复杂场景下设置 LLDB 友好的 Swift 项目。

### 🌟 [【WWDC22 10122】提升 “通过 Apple 登录” 的体验](https://xiaozhuanlan.com/topic/8752349016)

本文主要介绍如何通过 “通过 Apple 登录” 将基于密码的账户升级为拥有安全便捷的一键登录凭据，增强和简化应用的登录体验，同时并探索如何无缝处理 App 中用户会话的更改和账户删除，以及在 Web 和其他跨平台上充分发挥 “通过 Apple 登录” 的优势。

### 🌟 [【WWDC22 10147】 创造优秀的视频播放体验](https://xiaozhuanlan.com/topic/8504173629)

这篇 session 围绕着 Apple 新升级的视频播放器，描述了新的播放器的新界面、新功能，以及 Apple 对提高视频播放体验的建议和思考。全文主要分成两部分：第一部分会介绍新版播放器的功能和播放器的设计建议；第二部分会对播放器新支持的 API 做出简单的阐述。文章的最后列举了国内外播放器的设计实现，希望对你有所启发。


## 新闻

### [HTTP3 RFC标准正式发布，QUIC 会成为传输技术的新一代颠覆者吗？](https://mp.weixin.qq.com/s?__biz=Mzg4MjE5OTI4Mw==&mid=2247494885&idx=1&sn=bb61db8b0f5f5cf3c540c6dad8070532&source=41#wechat_redirect)
[@莲叔](http://aaaron7.github.io/)：相信和网络经常打交道的同学对QUIC都不陌生，在很多数据密集传输的领域，如音视频，往往基于 UDP 协议能提供比 TCP 更鲁邦的传输性能和吞吐量。如果网速越来越快，以及 HTTP 协议的大规模使用，使得 QUIC 横空出世成为 HTTP 协议演进的主要方向。手淘已经很早就在实际的业务场景中使用 QUIC 来做网络传输优化并实现了自研的 XQUIC，适逢 HTTP3 标准发布，本篇文章就是由 XQUIC 组的同学分享了关于 QUIC 应用的经验，主要包括【适用的场景】，【业务应用 QUIC 路径】，【QUIC性能提升的选择】以及【服务端 UDP 瓶颈突破】几个方面，对网络优化有需求的同学可以了解看看。

## 文章

### 🐎 [Automatically update if let and guard let for Swift 5.7](https://digitalbunker.dev/updating-if-guard-let-for-swift-5-7/)

[@张嘉夫](https://github.com/josephchang10)：[What's new in Swift](https://developer.apple.com/videos/play/wwdc2022/110354/) 介绍了 Swift 5.7 对 `if let` 和 `guard let` 语法的更新。在 Swift 5.7 之前，当我们使用 `if let` 或者 `guard let` 来展开可选值时，我们通常会使用相同的命名。最新版本的 Swift 支持了简写，可以直接省略等号及右边部分。本文提供了两个正则表达式，以便把代码库整体更新为这个新的、更整洁的语法。此外，作者还提供了一个 pre-commit hook 脚本，以确保你已经进行了转换。

### 🌟 🐢 [8K HDR!｜为 Chromium 实现 HEVC 硬解 - 原理/实测指南](https://mp.weixin.qq.com/s/O6lU8qTKAKBMH3Oi5H4yxg)

[@JonyFang](https://github.com/JonyFang): 本文简述了 Web 解码方案现状，介绍了作者为 Chromium 浏览器实现、完善硬解码过程中遇到的问题及最终的实现原理。在文末，也附带了测试结果，预编译版本供参考，希望可以解决 FrontEnd 苦于 HEVC 已久的问题。

### 🐕 [Alibaba.com App瘦身实践——iOS包大小技术与ROI总结 - 掘金](https://juejin.cn/post/7117074938577551368)

[@Barney](https://github.com/BarneyZhaoooo)：本文介绍了阿里巴巴App瘦身的整体思路，包体优化的文章有很多，但本篇文章在技术大图上组织的比较清晰，尤其对复杂业务的梳理值得借鉴。

- 业务价值
- 分析技术
- 瘦身过程
	- 瘦身技术大图
	- 组件瘦身
	- 资源瘦身
	- 编译优化
	- 代码下线
	- Flutter专项
- 防劣化

### 🐕 [Flutter 小技巧之 Dart 里的 List 和 Iterable 你真的搞懂了吗？](https://mp.weixin.qq.com/s/GwAoMN77EVbZdo9Jya9hRA)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：本文内容如下：
- 介绍了 Dart 中的 Iterable 协议的 Lazy 属性，只有被操作时才会生成对应元素，且结果不会被缓存，多次访问会导致多次计算
  - 在 List 上调用 map/where 会返回 lazy 特性的 Iterable
  - 在 List 上调用 toList/toString 等则不会
- 介绍了 Iterable 懒加载特性的适用场景与注意事项
  - 不要在 Iterable 中使用副作用 
  - 分页加载数据、数据库查询 时可以使用 Iterable
- 对比了 List 与 一般的 Iterable 在内部实现中的不同
  - List 具有 length（长度），内部的 ListIterable 是通过 _iterable.length 与 _iterable.elementAt 实现
  - 一般的 Iterable 是顺序访问的集合，并不关心 length（长度）

笔者：如果做个类比，那在表现上可以理解为 Swift 的 lazy 。现在新的语言大多都有互相借鉴能力的倾向，关于 Swift 的 lazy 可以查看： [Lazy Sequences in Swift And How They Work](https://swiftrocks.com/lazy-sequences-in-swift-and-how-they-work)。

### 🌟 🐢 [干货 | 携程酒店 Flutter 性能优化实践](https://mp.weixin.qq.com/s/sFF0R_wVBO6e3OSo27V1kg)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 在业务不断迭代和代码持续更新的状态下，应用的性能始终是一个需要持续关注和优化的点，Flutter 应用亦如此。本文由携程前端团队产出，聚焦于 Flutter 体系下的各类优化及详细方法:

- FPS&TTI 提升优化
- UI GPU 问题定位与优化
- Flutter 服务通道优化
- 内存泄漏治理

笔者: 携程前端团队近大半年在 Flutter 相关的技术上产出颇丰，小编建议各位同学可以翻一下往期相关文章，一定收获满满

### 🐢 [通过汇编分析方法参数，其实很简单～](https://mp.weixin.qq.com/s/7w6h3GONKXl23D4eoIAd3w)

[@AidenRao](https://weibo.com/AidenRao)：我们经常会在开发过程中遇到崩溃，如果是崩溃到系统的方法里，我们想要知道方法的参数什么，在不知道参数的个数和参数类型的情况下是非常头痛的。作者通过几个例子，逐步讲解函数在汇编下的调用过程，及如何通过汇编推测函数的参数个数和类型。

### 🐕 [Flutter 小技巧之有趣的动画技巧](https://mp.weixin.qq.com/s/bIuTsqg7p8F979owSpEO2Q)

[@EyreFree](https://github.com/EyreFree)：Flutter 里实现常见的动画效果很简单，甚至不需要自定义布局，只需要通过官方的内置控件就可以轻松实现。本篇通过分享一个示例动画的实现，简单轻松地讲解了 AnimatedPositioned 和 AnimatedContainer 的使用，并且进一步引出它们是如何基于 ImplicitlyAnimatedWidget 实现所拥有的功能的，剖析了 Flutter 里的动画技巧。在学习和使用 Flutter 的朋友不要错过。

### 🐕 Hummer 引擎优化系列-[Sliver多节点和单节点分帧原理](https://mp.weixin.qq.com/s/otV8FOZyH6AbPeI1EtU5CA)[Dart Split AOT技术，以及定制化Deferred Components的实现](https://mp.weixin.qq.com/s/gzTRQCqRV1XUYwNuROFx_g)

[@极速男孩](https://github.com/ztlyyznf001)：Hummer 是阿里的 UC 团队深度定制优化的 Flutter 引擎，第一篇主要介绍了如何利用分帧原理 Flutter 中 Sliver 单节点和多节点滑动优化的。第二篇主要介绍了 Hummer 引擎如何利用 Dart Split AOT 技术和定制化 Deferred Components 来实现原来只能在 Play Store 才能实现的递增下发的功能。

### 🐕 [百度 APP 基于 Pipeline as Code 的持续集成实践](https://mp.weixin.qq.com/s/oVkFmwFN68b6W_SkcJHKRA)

[@红纸](https://github.com/nianran)：本文简述的是百度的持续集成实践（Pipeline as Code），让产品线用结构化的语言去描述他们研发流程需要的一组功能或特性，然后根据描述（DSL）自动化地生成对应的流水线，其 DSL 参考于 Github Actions。文中也提到了一些实现细节，包含 Action 的可复用机制、事件触发机制、基于百度云的虚拟机集群、Pause/Unpause 的恢复上下文技术、多种 Action 和 Runner 交互的方案。

### 🐕 [React Native 中实现动态导入](https://mp.weixin.qq.com/s/oKeY6DsBDarBxRzySDMzDQ)

[@xuyafei](https://github.com/xiaofei86)：随着业务的发展，每一个 React Native 应用的代码数量都在不断增加，bundle 体积不断膨胀，对应用性能的负面影响愈发明显。拆分多业务包虽然可以解决单个应用不断膨胀的问题，但仍存在不少局限性。本文，网易云音乐技术团队为大家带来对 Metro 进行深度定制实现的动态导入（Dynamic import）方案。其可以方便地实现页面按需加载，组件懒加载等能力，感兴趣可以阅读原文了解。

### 🐕 [Reduce in Swift](https://swdevnotes.com/swift/2022/reduce-in-swift/)
计算一个数组里面所有值的和，我们可能通常会想用 for 循环去做。但其实 Swift 很早就给我们提供了一个高阶函数去实现类似的功能，它就是 Reduce 函数。熟悉函数式语言的同学对 Reduce 应该并不陌生，Swift 里的 Reduce 也是用作数组元素的累加计算，掌握它可以让我们写出更优雅的实现！

## 工具
### [SwifRegex.com](https://swiftregex.com/)

[@kemchenj](https://kemchenj.github.io/)：正则表达式是一种简洁强大的工具，但伴随而来的是 Debug 难的问题。SwiftRegex.com 就是为解决这个问题而制作的一款工具，让我们可以快速调试检验自己的正则表达式，并且也提供了 Builder DSL 模式让我们可以使用 Regex Builder 的表达式来编写。

## WWDC22 内参更新

### 🌟 [【WWDC22 110355】了解 Swift 异步算法](https://xiaozhuanlan.com/topic/8217965043)

本文通过阅读源码的方式，来深入理解苹果官方 Async Algorithms 实现逻辑。全文可以分为四部分：
- 第一部分介绍对于多个输入情况下，处理输入/输出结果的逻辑
- 第二部分介绍 Clock 协议，以及相关的使用方式和效果
- 第三部分介绍在 Clock 协议上实现的两个算法
- 第四部分简单的比较苹果实现的 Async Algorithms 和常见的面向过程框架

### 🌟 [【WWDC22 10043/10044/110404】App Store Connect 中的新特性及最佳实践](https://xiaozhuanlan.com/topic/1502478369)

本文对本次 WWDC22 中更新的三个 session：10043、10044、110404 进行了归纳整理，梳理了本次更新中 App Store Connect 的新特性，并对其中的重要更新功能：增强的 App Store 提交体验、应用基准测试工具、用户订阅状态即时获取，展开了最佳实践讨论。

### 🌟 [【WWDC22 110380】 SharePlay 中显示广告和插播内容](https://xiaozhuanlan.com/topic/3149265870)

本文是基于大家对 SharePlay 技术有一定了解的情况下，介绍关于流媒体 App 使用 SharePlay 技术向不同用户展示不同广告/插播内容时产生不同步问题的解决方案。

### 🌟 [【WWDC22 110349/110348】Swift Playground 指北](https://xiaozhuanlan.com/topic/9107542836)

Apple 在今年 WWDC22 中没有重点展开 Swift Playgrounds 的内容，但 Swift Playgrounds 4.0 以上版本可以作为一个完整、运行在 iPad 中的 IDE，更强大用户权限管理、更细致 的 UI 表现以及更符合直觉的代码联想，我们终于可以在 iPad 上写真正的 App 了！

### 🌟 [【WWDC22 10166/10167】探索应用追踪透明化 App Tracking Transparency 与隐私标签](https://xiaozhuanlan.com/topic/0934681275)

现阶段，所有 App 想要追踪用户的数据，必须要通过 AppTrackingTransparency 框架来获得用户授权。因此，本文将聚焦于应用追踪透明化(App Tracking Transparency)，并解释了用户追踪是如何定义的以及在确实需要接入此框架时，具体应该如何接入。

### 🌟 [【WWDC22 10098】在 Safari 里使用 Web Push](https://xiaozhuanlan.com/topic/0819724365)

本文基于 WWDC22 Meet Web Push for Safari 的内容梳理，介绍 web push 的流程和在 macOS 平台的实现细节。

### 🌟 [【WWDC22 10133】实践项目：使用 SwiftUI 的新功能为 Apple Watch 构建出色的效率 App](https://xiaozhuanlan.com/topic/2487691035)

“你的手腕从未像现在这样如此高效。”我们将使用 SwiftUI 在 Apple Watch 上实现滑行键入、与朋友共享内容及显示基本图表，构建一个跟踪「项目完成」效率的、全新的、独立的 watchOS App。

### 🌟 [【WWDC22 10018】为 macOS 应用支持「连续互通相机」](https://xiaozhuanlan.com/topic/5641729830)

本文介绍了 macOS 13 和 iOS 16 的一个新的联动能力：Continuity Camera（连续互通相机）。这项能力将 iPhone 上优秀的摄像头模组和算力带到了 Mac 上面，并让大部分型号的 Mac 都能够受惠。Apple 不仅向我们展示了连续互通相机强大的功能/设计及其运用场景，同时演示了如何快速低侵入得集成连续互通相机的所有功能。

### 🌟 [【WWDC22 10048】Safari 和 WebKit 新特性介绍](https://xiaozhuanlan.com/topic/1560743928)

本文主要介绍过去一年，Safari 和 Webkit 有哪些新增功能和改进。全文着重介绍了两个方面的改进，一个是 CSS，耗费了大量的笔墨介绍了过去 CSS 上的新增功能。另外就是 Web API 上新增了Web Push、Web Manifest File、Broadcast channels 、文件系统访问 API 以及在 Canvas 上对 P3 色域的支持。

## 摸鱼周报

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

* 本期话题：CI/CD 和 DevOps 有什么区别？如果你不能准确回答的话，可以读一下这篇介绍，对 DevOps 再次加深理解。
* 本周学习：OC所使用的类信息存储在哪？ 如何从Macho中找到？
* 内容推荐： WWDC 2022 上推出的新技术（三番）
* 摸一下鱼：一款跨平台摸鱼神器 Thief，有趣的骚话生成器 sao-gen-gen

## 内推

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