阅读视图

发现新文章,点击刷新页面。

老司机 iOS 周报 #358 | 2025-11-17

ios-weekly
老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

新闻

objc4-950 源码更新

Runtime 的源码发布新版本,主要更新的是 Xcode26 的 objc_storeStrong 的逻辑,有兴趣可以自行查看。

App Store Mini App Partner Program 隆重推出

参与计划的开发者在销售符合条件的 App 内购买项目时,可享受 15% 的收益抽成减免。需要适配 Advanced Commerce API (ACA) 。微信已经发公告预计会进行接入,期待后续更多中国公司都能同样谈成优惠,让更多增值业务在 iOS 端上线。

文章

🌟 🐢 Optimize your app's speed and efficiency | Meet with Apple

@Smallfly:该视频围绕应用性能优化展开,结合苹果开发中心的实践场景,系统讲解了从 Swift UI 渲染到数据流管理的多维度优化策略。核心内容包括:

  • 工具与调试:通过 Xcode 实时观察界面渲染状态(黄色闪烁标记),使用功耗分析工具量化优化效果;推荐 Instruments 分析视图更新效率,明确性能瓶颈。
  • 技术实践:针对 Swift UI 提出减少视图更新的关键方法——避免存储闭包、初始化时预计算视图结果;利用 Observable 类优化数据流,降低卡片视图对状态变量的依赖。
  • 性能指标:强调监控启动时间、镜头应用延迟等关键指标,通过自动化测试发现问题;结合 Snap 的实践案例,说明团队协作与指标导向对维护应用健康的重要性。

视频通过代码演示与数据对比,为开发者提供了从工具使用到工程实践的全链路优化指南,特别提到 Liquid Glass 和 SwiftUI 的优化,推荐有兴趣的同学按需观看。

🐕 何时组建计算机性能工程团队(2025 年)第 1 部分(共 2 部分

@含笑饮砒霜:作者在文章中分享了非厂商性质技术密集型企业组建性能工程团队的核心建议,指出该团队能通过基础设施成本节约、延迟降低、可扩展性与可靠性提升、工程速度加快实现显著投资回报(如初期可减半基础设施成本,长期每年目标 5%-10% 成本节约),详细说明了性能工程师在新产品测试调优、内部工具开发、瓶颈分析、参数优化等十大核心职责,并给出组建时机与团队规模的参考规则(基础设施年支出超 100 万美元配 1 名工程师,后续每 1000-2000 万美元增 1 名;团队支出应不低于可观测性监测支出;延迟或可靠性阻碍增长时需组建),同时提及部分企业已有相关专职人员可纳入考量,后续第二部分将补充职位描述、潜在陷阱等内容。

🐕 TN3193: Managing the on-device foundation model’s context window

@JonyFang: Apple 在这篇技术说明中系统讲解了设备端基础模型的上下文窗口限制以及开发者应如何应对。文章强调:本地模型不会自动截断超长输入,超过窗口会直接报错,因此必须在应用设计中主动“预算”与管理上下文。Apple 建议使用三类策略来保持对话连续性同时不溢出窗口:

  • 滑动窗口:只保留最新内容,旧内容逐步丢弃;
  • 机会型摘要:上下文接近上限时触发自动总结,把详细内容压缩成短摘要继续对话;
  • 选择性保留 / 层级压缩:按重要性保留关键信息,把次要内容丢弃或按主题分层压缩,需要时再检索。

整体来看,TN3193 的核心信息是:Apple 设备端模型的上下文有限,开发者必须自行设计“记忆管理策略”,否则会遇到输入过长错误。通过“滑动 + 摘要 + 保留”组合策略,可在有限窗口内维持长对话与复杂任务的质量。

🐕 Demystifying AI Coding Agents in Swift

@Cooper Chen:这篇文章不仅手把手带你构建了一个可工作的 Swift AI Coding Agent,更重要的是,它用非常清晰、务实的方式揭开了 "AI 编码助理" 背后的底层原理。作者强调:这些看似强大的智能行为,其实都是从「语言模型 + 工具 + 循环」这三件极其简单的事组合而成,让人一下子从使用者变成真正理解者。

文章最大的价值在于 去魅 + 实操。它不讲虚的,不堆概念,而是用不到 300 行的 Swift 代码,就实现了一个能读文件、写代码、重构逻辑、与用户来回对话的 Coding Agent,让读者第一次意识到 Cursor、Claude Code 这类产品背后并没有不可思议的魔法。
与此同时,作者也展示了真实工程中会遇到的问题:上下文膨胀、循环保护、安全、错误处理、工具设计等,让内容不仅能“跑起来”,还具备工程实用性。

如果你想理解 Coding Agent 的本质,或者想自己打造一个轻量但功能完整的 Swift Agent,这篇文章绝对值得一读。它让复杂的概念变得透明,让看似神秘的 AI 能力真正变成可掌握、可自行构建的技术。

🐢 Roadmap for Improving the Type Checker

@AidenRao:你是否也曾被 the compiler is unable to type-check this expression in reasonable time 的错误困扰?Swift 编译器团队最近发布了一份详细的路线图,旨在系统性地解决这一由来已久的问题。文章深入浅出地解释了类型检查慢的根源——由类型推导和重载解析带来的指数级复杂度。
路线图不仅展示了近期 Swift 6.2 和 6.3 在编译速度上取得的显著成果(真实项目检查时间从 42 秒降至 10 秒),还规划了未来的改进方向:包括加速大型集合字面量检查、移除历史性能 Hack,乃至引入更先进的 SAT 求解技术。如果你对 Swift 编译性能的未来走向感兴趣,这篇文章值得一读。

🐎 来了解一下,为什么你的 Flutter WebView 在 iOS 26 上有点击问题?

@david-clang:iOS 26 上 WebView 点击失效,核心仍是 iOS 18.2 起 WKWebView 的手势状态缓存问题。

当 WebView 被 Flutter overlay 遮挡时,Flutter 通过 delayingGestureRecognizer 延迟 overlay 下方的 UIKit recognizer,使其暂时不触发,从而让 overlay 接管触摸。但 iOS 18.2 起 WKWebView 的手势状态缓存问题导致 overlay 消失后,WKWebView 内部的点击 recognizer 状态仍停留在延迟状态,未能恢复到 recognized,tap 或 JS click 无法派发,元素只能高亮却无法响应点击。

解决方案:

  • 短期规避:使用 pointer_interceptor 在 WebView 上方覆盖一个透明层,阻止 overlay 引发的手势中断,从而避免点击失效。
  • 长期方案:Flutter 官方正在弃用 delayingRecognizer,改为基于 hitTest + FFI 同步判断 的手势体系,在触点处直接判断是否应拦截手势,从根本解决 WebView、AdMob 等 PlatformView 的手势冲突问题。

代码

🐢 Swift Binary Parsing

@阿权:Apple 官方开源的二进制解析库,使用纯 Swift 编写,旨在构建安全、高效的二进制解析。该库提供了一系列用于安全解析二进制数据的工具,同时管理类型和内存安全,以消除常见的基于值的未定义行为,例如类型溢出。

Swift 一直致力于将不安全的内存操作尽可能安全地让用户访问、修改,此库跟 Swift 的思想如出一辙,本来之前 Apple 强推用 Swift 替代 C/C++ 直接操作内存,包括嵌入式也是这个切入点,此库一出如同如虎添翼了,也算是给内存操作提供一套完整的最佳实践了。

内推

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

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

关注我们

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

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

同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom

说明

🚧 表示需某工具,🌟 表示编辑推荐

预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)

iOS 社招 - Runtime 相关知识点

核心概念 本质:runtime是 oc 的一个运行时库(libobjc.A,dylib),它为 oc 添加了 面向对象的能力 以及 运行时的动态特性。 面向对象的能力:rutime用 C 语言实现了类

Grow on iOS 26:UIKit + SwiftUI 混合架构下的 Liquid Glass 适配实战

Grow 是一款在 173 个国家和地区获得 App Store 编辑推荐、拥有超过 18 万五星评价的健康管理应用。在适配 iOS 26 的 Liquid Glass 设计语言时,团队遇到了不少挑战:如何在 UIKit + SwiftUI 混合架构下实现原生的 morph 效果?如何精确控制 Scroll Edge Effect?如何处理自定义导航栏元素的动态尺寸?我邀请了 Grow 的开发者之一 Shuhari,分享团队在这次适配过程中的实战经验。文章涵盖 Sheet、Navigation、Popover 等场景的改造方案,深入探讨 UIBarButtonItem 尺寸计算、CABackdropLayer 副作用处理等底层细节,还展示了如何利用 Core Text 创造“玻璃文字”效果。

SwiftUI-WebView 全面指南

SwiftUI 7.0 通过 WebKit 模块,可以轻松实现网页加载、导航控制以及 JavaScript 交互功能。本文将循序渐进,全面介绍 SwiftUI 中的 WebView 用法。

SwiftUI 导航

SwiftUI 提供了多种导航方式,让我为你详细介绍主要的导航模式和相关组件。 1. NavigationStack (iOS 16+) 基本用法 多类型导航 2. NavigationView (i

Skip Fuse现在对独立开发者免费! -- 肘子的 Swift 周报 #0110

issue110.webp

📮 想持续关注 Swift 技术前沿?

每周一期《肘子的 Swift 周报》,为你精选本周最值得关注的 Swift、SwiftUI 技术文章、开源项目和社区动态。

一起构建更好的 Swift 应用!🚀

Skip Fuse现在对独立开发者免费!

在 Swift 社区发布官方 Android 版 SDK 不久之后,Skip 宣布其 Skip Fuse 版本将对符合条件的独立开发者免费开放,用于构建 Android 应用。

与过去一年多独立开发者可免费使用的 Skip Lite 相比,Skip Fuse 带来了实质性的技术变革。Skip Lite 的原理是将 Swift 代码转译为 Kotlin,而 Skip Fuse 则直接利用 Swift 官方 Android SDK 进行交叉编译,将 Swift 源码编译为可在 Android 平台上原生运行的 ARM 二进制文件。这意味着开发者不再局限于“具有 Skip 感知”的依赖包,而可以使用任何能在 Android 上编译的 Swift 包。

根据 Swift Everywhere 的统计,目前已有超过 2000 个 Swift Package 支持 Android 平台,其中包括 Alamofire、SwiftSoup、swift-sqlcipher 等常用库。换句话说,Fuse 模式让开发者能够充分利用标准 SwiftPM 生态。这不仅显著拓宽了可用依赖的范围,也降低了项目迁移与维护的复杂度。

在架构层面上,Skip Fuse 采用了混合实现方案:业务逻辑部分由原生 Swift 直接编译执行,而 UI 层的 SwiftUI DSL 则在构建过程中由 Skip Fuse UI 模块映射为 Jetpack Compose 代码,从而在 Android 上呈现出完全原生的用户体验。这种做法既保留了 SwiftUI 的声明式语法,又遵循了 Android 平台的设计规范。

此次政策调整,或许会让许多独立开发者和中小团队在技术选型上更倾向于具备跨平台潜力的方案。即便继续主要面向 Apple 生态进行开发(使用苹果私有框架),也可能开始在架构中加入抽象层,为未来的多平台拓展预留空间。

当然,Skip 对“独立开发者”的定义也有明确限制:仅适用于个人或不超过两人的团队,年收入需低于 30,000 美元,并且免费许可仅允许发布一个闭源商业应用(开源项目数量不限)。即便如此,这一政策仍为 Swift 开发者以近乎零成本的方式进入 Android 市场打开了大门,为他们在这一庞大平台上探索新的可能与收入来源提供了契机。

尽管未来还会出现更多面向 Swift 的跨平台开发方案,但 Skip 已经为 Swift 在 Android 生态中的落地提供了一条清晰、可行的路径。社区也正期待着类似 Skip 这样成熟的跨平台方案能够扩展至 Linux、Windows 乃至嵌入式平台,为 Swift 的多平台发展奠定更坚实的基础。

本期内容 | 前一期内容 | 全部周报列表

近期推荐

SwiftData 的优雅取消编辑方案:从混乱到艺术 (The Art of SwiftData in 2025: From Scattered Pieces to a Masterpiece)

由于取消了父子上下文的概念,SwiftData 在实现“可撤销修改”方面变得更加棘手。Mathis Gaignet 在这篇长文中,通过构建一个专用于编辑状态的独立 ModelContext,阐述了在 SwiftData 中实现“可撤销、可复用、低样板”增改(Upsert)架构的思路,用以取代散乱的表单状态与脆弱的回滚方案。

作者并未直接给出“标准答案”,而是完整展示了从问题发现到方案演进的思考路径。文章深入解析了 @Model@Query 宏的底层机制,揭示了 PersistentIdentifier 的临时与永久状态陷阱,以及上下文同步延迟导致的隐蔽 Bug。这种探索式的写作方式,使读者不仅明白“怎么做”,更理解“为什么这样做”。


从 SPM 项目管理迁移到 Tuist 项目管理 (Back Market x Tuist - Part I: Why We Moved Our iOS Project To Tuist)

在 Swift 项目中,SPM 除了负责代码模块化,也承担了项目结构管理的职责。然而,随着项目规模的扩大,这种方式的局限逐渐显现:依赖解析频繁、缺乏构建设置和自定义阶段、无法运行脚本、xcodeproj 文件易冲突、模块间规则难以统一,且 SPM 插件能力有限。Alberto Salas 在本文中介绍了其团队如何将项目结构管理从 SPM Packages 迁移至 Tuist Targets,并系统梳理了问题成因、探索路径与决策过程。在 Part II 中,他进一步分享了如何在不阻塞日常开发的前提下完成迁移,并量化了构建性能的提升。

本文并非要抛弃 SPM,而是将项目结构与生成工作交由 Tuist 接管,依赖管理依然由 SPM 负责。文章还比较了 SPM、Bazel 与 Tuist 的不同取舍。作者指出,Bazel 功能更强大,但最终选择 Tuist,是因为它更符合团队能力与项目特性。这也提醒我们,工具选型的关键不在“最强”,而在“最合适”——尤其对于中小型团队,可自主掌控、易于维护的方案往往更具长期价值。


让应用更懂用户语言:Language Discovery 的个性化新机制 (Making Apps More Personal with Language Discovery)

传统的“选择主要语言”(Locale.preferredLanguages) 模式假设每位用户都有单一语言偏好,但现实中人们往往在不同情境下使用多种语言——例如在工作中使用英语、在社交中使用法语、在媒体消费中使用西班牙语。苹果在 iOS 26 中添加了 Language Discovery 功能,通过设备端的机器学习,在确保隐私的前提下,基于用户的输入模式、内容消费、沟通语言以及应用偏好等行为数据,自动推断用户的语言使用习惯。Letizia Granata 在文中介绍了这一智能识别用户语言偏好的系统机制。

通过 Language Discovery,应用可以更准确地响应用户的语言与文化背景,从而在本地化层面实现个性化。这项功能标志着苹果在多语言支持上的一次重要转变:从被动配置走向主动理解,从单一语言到多语共存,为开发者提供了打造更包容、更真实应用体验的新基础。


关于 Xcode 26.1 CPU 异常占用的提醒和临时解决方案

iOS 开发者 Artem Mirzabekian 指出,Xcode 26.1 在运行 iOS 26.1 模拟器时会出现异常的 CPU 占用问题。原因是 iOS 26.1 模拟器中与壁纸渲染相关的 MercuryPosterExtension 进程持续崩溃并重启,导致 CPU 异常占用。Xcode 26.2(beta 版)目前也受影响。

临时解决方案:使用 iOS 26.0 模拟器,或在 iOS 26.1 模拟器中更换壁纸并删除默认的纯黑壁纸。


Swift 6 并发模型:技术挑战与社区争议

Michael Tsai 汇总了两组关于 Swift 6 并发的重要讨论。第一篇 关注 Swift 6.2 推出的 “Approachable Concurrency” 改进;第二篇 则聚焦具体技术议题,如 MainActor.assumeIsolated@preconcurrency 的实际使用与限制;

社区观点呈现明显分化。支持者认为,默认主线程隔离有效防止了“意外跑到后台线程”的常见问题,降低了初学者与 UI 密集型项目的上手难度,一些团队已经成功完成大型应用的迁移。质疑者则指出,完整的 UIKit 应用仍难以全面采用 Swift 6 模式,与 Core Data 和第三方框架的集成问题频出,错误信息晦涩难懂,而语言的持续演进也让代码不断老化。更激进的声音甚至认为当前并发模型已成为“无法协同运作的拼凑体系”,需要一次“彻底重置”。

整体共识是:Swift 6 并发机制的收益高度依赖项目的并发复杂度——对单线程或 UI 驱动型应用帮助显著,但对于并发密集或系统耦合度高的项目,迁移仍充满挑战。


深入解析 visionOS 上的动画机制 (Deep Dive into Animation on visionOS)

空间计算不仅改变了用户体验,也对开发者提出了更高的要求——许多在平面界面中行之有效的技巧,在三维空间中已不再适用。Cristian Díaz 从“空间交互的可感知性与舒适性”出发,提出了一个动画决策框架:谁创作动画(设计师预制 vs. 运行时生成)、什么需要动画(SwiftUI 窗口 vs. RealityKit 实体)、复杂度如何(微交互 vs. 编排表演)。在此基础上,他系统梳理了 visionOS 的五条渲染路径与十种动画机制,为每种方案明确列出适用场景、避免情形与实现要点。

即便你并非 visionOS 开发者,也能从这篇文章中受益。Cristian 以“从感知需求推导技术选择”的方式诠释了动画设计思维,这种方法同样适用于其他平台和界面的动态设计。


使用 Instruments 找出 SwiftUI 中更新最频繁的视图 (Find the SwiftUI Views that Update the Most Using Instruments)

Xcode 26 为 Instruments 新增了 SwiftUI 专用的分析工具,可统计视图的更新次数与耗时,并通过 All Updates Summary 与 Cause & Effect Graph 定位哪些视图“更新过于频繁”以及具体触发链路。Mark Szymczyk 以实操示例展示了如何创建 SwiftUI Profiling 会话、按更新次数/耗时排序视图,并用因果图追踪更新来源。

排查症状之外,更应理解 SwiftUI 的刷新原理,才能从源头减少无效重绘。在我的文章理解 SwiftUI 的视图刷新机制:从 TimelineView 刷新问题谈起中,借由 TimelineView 个案系统阐述了视图声明、响应机制与递归更新的判定逻辑。只有搞清“为什么视图会更新”、“系统如何决定是否重算视图声明值”,优化才不会沦为补丁式修修补补。

工具

imessage-kit:在 AI Agent 中提供消息集成能力

imessage-kit 是一个由 Photon 开发的功能强大的 iMessage 开源 SDK,非常适合将 iMessage 集成到 AI 智能体或自动化工作流中。其主要功能有:

  • 现代化的 API:提供优雅的链式调用(Fluent API),可以轻松实现“收到消息 A,则回复 B”的逻辑。
  • 功能全面:不仅支持收发文本,还能处理图片、各类文件,并能实时监控新消息。
  • 类型安全与跨运行时:完全使用 TypeScript 编写,类型支持良好,并同时兼容 Node.js 和 Bun。
  • AI 集成友好:官方定位就是为 AI Agent 提供消息集成能力,是连接物理世界和 AI 的一个有趣尝试。

它通过直接读取 iMessage 数据库(chat.db)并结合 AppleScript 实现自动化,因此仅限 macOS 使用,且需要授予应用"完全磁盘访问权限"。

该库采用 SSPL-1.0 许可证,禁止用于创建竞争产品(如其他消息 SDK/API),但允许用于内部业务、个人项目和教育用途。值得注意的是,Photon 还提供高级版本,支持线程回复、消息撤回/编辑、实时输入指示器等功能,以及企业级托管服务。更多内容可以在其官网获取。


SwiftUI-DetectGestureUtil:为单个 SwiftUI 视图绑定多个自定义手势

在 SwiftUI 中,让同一个视图同时识别多个手势一直是个棘手的问题。由 Saw-000 开发的 SwiftUI-DetectGestureUtil 通过引入独立的“检测阶段”,让开发者能在多个自定义手势中只确认其中一个,从而绕开系统默认组合方式(simultaneous、sequenced、exclusive)带来的约束,实现更自然的多手势交互。

它将手势识别流程清晰地拆分为两个阶段:

  • 检测阶段(detectGesture):在手势发生的整个周期内持续更新状态,直到某一自定义规则匹配并返回手势类型
  • 处理阶段(handleGesture):在识别完成后持续追踪手势进展,通过 .yet.finished 明确控制生命周期

这一模型为构建复杂交互(如“双击 + 拖动”、“圆形绘制”、“自定义笔迹检测”)提供了新的思路。借助 DetectGestureState,开发者可在一次手势周期内获得所有触点、时间与几何信息,实现远超 SwiftUI 原生 Gesture API 的表达力与精度。

往期内容

THANK YOU

如果你觉得这份周报或者我的文章对你有所帮助,欢迎 点赞 并将其 转发 给更多的朋友。

📮 想持续关注 Swift 技术前沿?

每周一期《肘子的 Swift 周报》,为你精选本周最值得关注的 Swift、SwiftUI 技术文章、开源项目和社区动态。

一起构建更好的 Swift 应用!🚀

❌