# 老司机 iOS 周报 #322 | 2025-02-10

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/weekly-header/322.jpg?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

**周报编辑组又来新人啦~** 

欢迎 [zhangferry](https://zhangferry.com) 加入老司机技术！ferry 是我们的老朋友了，作为摸鱼周报的主编输出了大量优质内容，同时也深度参与了历年 WWDC 内参担任审核。目前 ferry 在抖音基础技术团队从事代码分析相关工作，对 LLM 与 Stable Diffusion 也有涉猎。

**希望 ferry 的加入也能为大家带来更多元化的内容输出！**

## 新闻

### [Apple 开源 Xcode 底层构建引擎](https://www.swift.org/blog/the-next-chapter-in-swift-build-technologies/)

[@kemchenj](https://kemchenj.github.io/)：Apple 近日开源了 swift-build，它是 Xcode、Swift Playground 底层使用的构建引擎（在 Xcode 里名为 XCBBuildService）。

目前 Swift Package Manager 使用的是另一套单独编写的构建引擎，同时维护两套除了行为不同会让用户困惑，并且维护成本也很高，所以后续 SPM 也会改为使用 swift-build，统一构建系统。

这样也给了我们机会一窥 Xcode 里的构建逻辑，以往很多问题都可以直接在这个库里找到答案，对于 Xcode 构建逻辑感兴趣的你千万别错过。


### [不再依赖 CallKit，iOS 微信使用新方案实现通话弹窗接听](https://mp.weixin.qq.com/s/6hw75UXjqGGBfNmuH3_cVQ)

苹果上线了新的 LiveCommunicationKit 作为在中国大陆替代 CallKit ，从用户视角分析，与 CallKit 最大的区别就是适配了灵动岛。目前[文档内容](https://mp.weixin.qq.com/s/6hw75UXjqGGBfNmuH3_cVQ)不多，期待 WWDC25 中能有更详细的内容。

## 文章

### 🌟 🐢 [Debugging An Undebuggable App](https://bryce.co/undebuggable/)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：作者记录了他尝试注入一个应用时遇到的全过程，其中使用的技巧与思路清晰明确，值得所有需要逆向相关工作的同学阅读。简单列举一些其中让我感到受益匪浅的知识（并非全部）：
1. 直接调用 ``ptrace(PT_DENY_ATTACH, 0, 0, 0);`` 可以阻止后续所有的 debugger(lldb) attch。需要注意 ptrace 在 iOS 上是私有函数，需要通过 dlsym 查找。如果应用使用这种方式加固，则可以通过符号断点并 ``thread return`` 跳过当前函数的剩余指令解决。
2. ptrace 本质是 ``svc    #0x80`` 等汇编指令的集合，因此可以直接通过汇编指令调用，就能避免应用程序绕过 dlsym 寻找 ptrace 来进行调用（这样也能避免一些审核时的私有 API 扫描）。
3. 在未知的二进制中搜索带有特殊含义的汇编，例如搜索 ``mov    x16, #0x1a`` 与 ``mov    w16, #0x1a`` 就比搜索 svc 效率更高。因为 x16/x17 是一般是跳转校验用的特殊寄存器，很少挪作他用。
4. ``br s -a 0x102A2BB14 -s XXXBinary`` 意思是设置断点，在相对 XXXBinary 的 loadAddress + 0x102A2BB14 的位置。这样可以避免每次启动 App 时 iOS 的 ASLR 机制会随机 loadAdfress 位置而需要重复计算实际的断点地址。同样我们日常调试时也可以相对我们自己的二进制或者系统库（UIKit / SwiftFoundation 等）设置断点。
5. 通过无限循环调用 [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:YES/NO] 可以制造出 OOM ，进而直接让 iOS 系统崩溃而重启(System OOM)。

### 🐎 [Advantages of Using withAnimation](https://www.magnuskahr.dk/posts/2025/01/advantage-of-withAnimation/)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：这篇文章比较了 SwiftUI 中在视图声明上使用 .animation(...) 和在操作中使用 withAnimation 的差异。前者仅动画视图自身，当需要让布局或其他视图也平滑过渡时就会出现视图跳动等问题。使用 withAnimation 则能让所有相关布局变化一并参与动画，尤其在 ScrollView 等场景下可确保整体体验平滑无跳跃。

### 🐢 [Hardcore Debugging](https://blog.jacobstechtavern.com/p/hardcore-debugging)

[@zhangferry](zhangferry.com)：当调试应用发生崩溃，崩溃信息只有系统堆栈没有源码时，会影响我们定位问题。针对这类场景，文中提供了两种解决方案：

1. 利用 `git bisect`，在正常 commit 和引入问题 commit 之间，通过二分法定位首次引入问题的 commit，来最大限度缩小排查范围。
2. 提取崩溃日志，利用 atos 进行符号化，可以更精准定位问题代码。其中还分享了一个 tips，当 atos 执行异常时，可以根据偏移地址在 dSYM 里的 `Relocations/aarch64/xx.yml` 文件中手动解析符号。

### 🐎 [Compose 多平台是真实存在的！](https://whackylabs.com/swift/kotlin/compose/2025/01/12/compose-multiplatform-is-real/)

[@极速男孩](https://github.com/ztlyyznf001)：该文章分享了作者使用 Kotlin Multiplatform 与 Compose Multiplatform 的体验。通过网页工具快速生成项目模板，并在 Android Studio 中打开，然后简单实现了一个 PhotoApp，实现多平台代码共享。虽然依赖配置略有挑战，但可直接在 Android Studio 中运行 iOS 应用。

### 🐢 [深入 Flutter 和 Compose 的 PlatformView 实现对比，它们是如何接入平台控件](https://mp.weixin.qq.com/s/FCu6OiZRh6EcmCWLB904jA)

[@david-clang](https://github.com/david-clang)：本文深入介绍 Android 侧 Flutter 和 Compose 在内嵌 Platform Views 的实现对比。虽然 Compose 和「传统 XML View」 在上层开发是两种写法，但因为底层渲染机制都是 Android Native View 的同一套渲染机制，所以无论内嵌 Platform Views 是否为 SurfaceView，都能正常渲染，甚至官方还推出了 SurfaceView 对应的 Compose 封装 [AndroidExternalSurfaceScope](https://developer.android.com/reference/kotlin/androidx/compose/foundation/AndroidExternalSurfaceScope)。而 Flutter 和内嵌的 Platform Views 是两套渲染流程，连渲染数据的生产线程都不同，而且在内嵌 SurfaceView 时的渲染模式会从 [TLHC](https://docs.flutter.dev/platform-integration/android/platform-views#texturelayerhybridcomposition) 降级为 VD（这会影响 SurfaceView 交互逻辑，如无障碍功能可能失效），对此官方还没很完美的兼容方案（截止 2 月 9 日，Android 侧 Platform Views 相关的 [issue](https://github.com/flutter/flutter/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22a%3A%20platform-views%22%20label%3Aplatform-android) 还有 100 个是 open 状态）。

### 🐕 [深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比](https://mp.weixin.qq.com/s/756kaH11g0rM7dlklLSiuA)

[@Crazy](https://github.com/jiyan135960)：这是一篇针对 Flutter 与 Compose 两个框架的 Diff 机制讲解的文章，本篇文章首先对 Flutter 的 Diff 机制进行分析，从 setState 方法开始逐步讲解 Flutter 框架的 Element 树是如何进行对比判断与循环更新的。很多 Flutter 开发者开发了两三年的 Flutter 也不知道 Widget 中的 Key 的作用，这篇文章很好的告诉了你 Key 与 runtimeType 的对比位置，也会让大家对 Key 的理解有更深的体会。文章对 Compose 的 Diff 算法进行了分析，Compose 与 Flutter 不同，Compose 是两个树来进行 UI 管理，同样在 Compose 的对比过程中，它的 Key 也启到了至关重要的作用，Compose 的 Diff 相较于 Flutter 更加的复杂，因为涉及到了多个模块的协作问题。本文读起来很快，但是需要大家反复阅读，如果有时间也可以根据文章所说的对源码进行自己的分析，会有不一样的效果。

## 工具

### 🐎 [Network Link Conditioner: Simulating Slow Networking](https://www.avanderlee.com/debugging/network-link-conditioner-utility/)

[@阿权](https://github.com/bqlin)：Network Link Conditioner 是苹果提供的慢网模拟工具，支持 macOS 和 iOS，其提供几套预设的网络环境供用户直接切换，常用于调试网络环境不佳下的网络请求或其他连接，优化用户体验，文章详细介绍了在该工具在各平台的使用方法。

比较有趣的是在模拟器上模拟慢网时还提到了另外一款工具 [RocketSim](https://www.rocketsim.app/?utm_source=swiftlee&utm_medium=article&utm_campaign=network_link_conditioner)，该工具可以独立控制模拟器的慢网模拟，不影响 macOS 其他进程，另外该工具还支持网络抓包、UI 稿对比、网格像素对齐、标尺、程序状态切换、Deeplink 测试、推送测试、权限控制、定位模拟等功能，功能丰富强大，可惜只能作用在模拟器。

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

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

**关注有礼，关注【老司机技术周报】，回复「2024」，领取 2024 及往年内参**

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