我的 AI Native iOS 开发验证工作流

我的 AI Native iOS 开发验证工作流

💡 原文中文,约6200字,阅读约需15分钟。
📝

内容提要

作者在两个 iOS 项目中探索让 AI agent 自主验证改动。首个项目 Lody-iOS 用 Python 脚本和 AXe 驱动模拟器,产出截图、AX 树和录屏供人复查,但 CI 慢、进入场景耗时、补丁堆积,人成为瓶颈。第二个记账 App Nyatabi 改用 XCUITest 真机端到端测试,以断言代替截图,由机器直接判定 PASS/FAIL;并先出 Artboard 确定设计再写代码,人只需处理动画等体感问题。

🔎

延伸解读

验证策略转变的关键:从人看证据到机器判定

Lody-iOS 依赖截图、AX 树和录屏,人必须复查,导致瓶颈。Nyatabi 改用 XCUITest 断言,机器直接输出 PASS/FAIL,人只需处理动画等体感问题。这一转变的核心是缩小人需要看的范围,把可自动判定的部分交给机器,而非追求完全无人化。

UI catalog 与 accessibilityIdentifier 的支撑

Nyatabi 的 Debug 页内置 UI catalog,用内存样例数据挂出界面,不碰用户数据库,新界面和回归场景先在此验证。配合 179 处 accessibilityIdentifier,XCUITest 能直接断言按钮、卡片、数据状态。这减少了接进业务后还需截图确认的环节,是断言能替代截图的基础。

先出 Artboard 再写代码:把 UI 判断前移

作者在 Nyatabi 中先让 Claude 生成完整 Artboard,确定设计、交互和 Motion 后再实现。画板被 spec 引用,动画曲线和时长通过 HTML artifact 调整。这样大部分 UI 判断发生在实现之前,实现阶段只需证明与画板一致且功能正确,减少了事后返工。

Lody 验证体系的三个瓶颈与教训

Lody 的 verify 体系卡在三点:CI 全量跑易超时,317 次运行仅成功 18 次;从 Debug 菜单沿 accessibility 树进场景需 130 秒,改 deep link 后降至 1~2 秒;AXe 从进程外驱动导致弹窗、键盘、cell 回收不稳定,补丁从 83 行涨到 928 行。这些教训推动 Nyatabi 转向真机 XCUITest。

❓

Q&A

在 Lody-iOS 项目中,作者最初是如何让 AI agent 验证 UI 改动的?

作者最初让 agent 直接使用 xcrun simctl 和 AXe 驱动模拟器,进行点击、截图等操作,并自行读取截图判断结果。后来将验证过程脚本化,每个功能对应一个 Python 脚本,手动传入模拟器 UDID,用 AXe 驱动 Debug 菜单中的预览场景,产出固定命名的截图和 AX 树供人复查。

为什么作者在 Lody-iOS 中要建立不依赖登录态的验证基线?

因为真实链路往往需要登录态,而伪造登录态容易与业务耦合;同时写 UI 时要尽量零业务侵入,不能为了验证往业务代码里塞分支。因此作者定下基线:所有验证都不依赖用户登录态,每个场景用离线 fixture 独立挂出来,不经过登录也不碰业务数据。

Lody-iOS 的验证工作流遇到了哪些主要效率问题?

主要问题有三个:CI 跑不动,托管 macOS 机器太慢,全量跑几乎撞上 1 小时超时,317 次运行只成功 18 次;进场景太慢,从 Debug 菜单沿 accessibility 树逐个找,一个 case 要 130 秒;补丁越堆越多,AXe 从进程外驱动 App,系统弹窗、键盘状态、cell 回收等不稳定只能靠重试和加超时,补丁写进 README 从 83 行涨到 928 行。

在 Nyatabi 项目中,作者为什么改用 XCUITest 进行真机端到端测试?

因为 AXe 和 sim-use 在真机上不适用,无法打字和可靠操作。作者在 iPhone 12 和 iPhone 17 上测试时,sim-use 不能打字,需要人工介入。改用 XCUITest 后,agent 可以自动断言界面状态,用 PASS/FAIL 代替截图,机器直接判定结果,人只需处理动画等体感问题。

Nyatabi 中如何用断言代替截图来验证 UI?

通过 179 处 accessibilityIdentifier,XCUITest 可以直接断言界面状态,例如按钮是否存在、卡片是否出现、数据是否正确。证据就是 PASS 或 FAIL,不需要人再看图判断。测试只断言结构,不比对 LLM 原文,避免因模型输出变化导致误判。

作者在 Nyatabi 中提出的“先出 Artboard,再写代码”工作流是怎样的?

在实现需求之前,作者先让 Claude 生成完整的 Artboard,把设计、UI、UX 细节和 Motion 都画出来,在画板上讨论修改到满意,再开始写代码。画板会被 spec 引用,例如新用户流程的每份子 spec 开头都标注视觉稿来源。动画曲线和时长则通过 HTML artifact 调整。这样大部分 UI 判断从实现后挪到了实现前。

对比 Lody-iOS 和 Nyatabi,作者认为最大的差别是什么?

最大的差别是证据的形式。Lody 的证据(截图、AX 树、录屏)需要人看,人成为瓶颈;Nyatabi 的证据机器就能判定,用断言代替截图,人很少再需要看截图和视频。原因包括 UI catalog 足够全、断言代替截图、体感问题由人录屏反馈。

🏷️

标签

➡️

继续阅读