我如何让 Claude Code 在模拟器里测试我的 iPhone 应用

只要给 Claude Code 两样东西,它就能自己测试 iPhone 应用:在 iOS 模拟器里构建、安装、启动和截图的命令行命令,以及从 Xcode 26.3 开始提供的、Xcode 自带的 MCP 服务器。两样都有之后,它可以改一个界面、运行、看结果,把看到的问题修好,再向你汇报。

我做 iPhone 应用基本是一个人,Swift 代码有很大一部分是 Claude Code 写的。对我工作方式改变最大的,是把这个循环闭合起来,让代理能看到它刚改过的应用。在那之前,每一句“完成了”都是猜测,我得自己动手检查。

为什么循环比模型更重要

不能运行应用的代理,只能靠读代码来检查自己的工作。这样能发现拼写错误,但会漏掉被键盘挡住的按钮、折成三行的日文标签、没人设计过的空状态。而 App Review 和一星评价里出现的,恰恰就是这些问题。

模拟器随每一份 Xcode 一起安装,它能做的几乎所有事情都可以通过 xcrun simctl 在命令行完成。需要的东西基本就这些。一个人在模拟器里点来点去能做到的事,通常都有对应的命令;有命令的事,就能交给代理去做。

闭合循环的命令

先找一个模拟器并启动它。simctl 允许用 booted 代替设备 ID,后面的命令就能写得很短。

xcrun simctl list devices available
xcrun simctl boot "iPhone 17"

把模拟器版本构建到项目里的一个文件夹,这样代理始终知道应用最后在哪里:

xcodebuild -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 17' \
  -derivedDataPath build build

然后安装、启动、截图:

xcrun simctl install booted build/Build/Products/Debug-iphonesimulator/MyApp.app
xcrun simctl launch booted com.example.myapp
xcrun simctl io booted screenshot shot.png

Claude Code 可以打开 PNG 并描述上面的内容,所以最后这一行把一次构建变成了反馈。让它把截图和界面原本应有的样子对比,你就多了一轮真正看像素的检查。

测试你自己从不打开的状态

真正的价值在于那些开发者懒得去点开的状态。simctl 大多一行就能到达。

xcrun simctl ui booted appearance dark
xcrun simctl ui booted content_size accessibility-extra-extra-extra-large
xcrun simctl launch booted com.example.myapp -AppleLanguages "(ja)" -AppleLocale ja_JP
xcrun simctl privacy booted revoke photos com.example.myapp
xcrun simctl openurl booted "myapp://settings"

深色模式、最大的动态字体、日文界面、用户拒绝过的权限、直接打开某个界面的深层链接。每一个都只差一张截图。我住在日本,如果只能留一个,我会留语言参数,因为在英文里完美的布局,换成日文常常就乱了。

simctl 还能用 xcrun simctl push 加一小段 JSON 模拟推送通知,用 xcrun simctl status_bar booted override --time 9:41 固定状态栏,让 App Store 截图更干净。

接上 Xcode 的 MCP 服务器

Apple 在 2026 年 2 月 3 日发布了 Xcode 26.3,内置支持编程代理,包括 Anthropic 的 Claude Agent 和 OpenAI 的 Codex。对在终端里用 Claude Code 的人来说,关键在于 Xcode 现在通过 Model Context Protocol 开放了自己的能力,外部代理也能使用。

Apple 关于让外部代理访问 Xcode 的指南分三步。在 Xcode 里打开 Settings,选 Intelligence,在 Model Context Protocol 下打开“Allow external agents to use Xcode tools”。然后在 Claude Code 里注册这个桥接:

claude mcp add --transport stdio xcode -- xcrun mcpbridge
claude mcp list

最后,在开始下指令之前先用 Xcode 打开项目。外部代理连接时以及运行期间,Xcode 都会提示,这是个好习惯:你始终知道什么时候有别的东西在操作。

两种方式我都保留。MCP 工具像 Xcode 一样理解项目;命令行命令简单、可写成脚本、在日志里也好读。一边出问题时,另一边通常还能用。

把步骤写下来一次

根据关于记忆的文档,Claude Code 每次会话开始时都会加载项目里的 CLAUDE.md。步骤就写在那里:scheme 名称、用哪个模拟器、bundle ID、构建文件夹,再加一句简短的要求:每次改界面,都要在浅色模式、深色模式和最大字号下各截一张图。

写下来之后,这个循环就不再取决于你有没有记得提。如果你想让它成为强制规则而不只是建议,可以用 hook 在每次编辑后自动构建,我在自我纠正 hook 的指南里写过这种做法。

模拟器告诉不了你的事

模拟器是一台假装成手机的 Mac。摄像头输入、经过 Apple 服务器的真实推送、旧机型上的性能、触感反馈、在拥挤的电车上单手使用的感觉,这些都不会出现在截图里。内购也要先配好 StoreKit 配置或沙盒账号,测试才有意义。

所以我把模拟器循环当作底线。它能尽早抓到布局错乱、缺失的文案和没处理的状态,我在真机上的时间就可以留给只有真机才能看出来的问题。这种分工是一个人借助 AI 发布 iOS 应用的重要部分,也是避免成为 Apple 在 2025 年拒绝的两百万次提交之一的便宜办法。

← 全部文章