使用 XcodeBuildMCP 在模拟器上构建并测试 iOS 应用。
Xcode 测试 Skill
使用 XcodeBuildMCP 在模拟器上构建、安装并测试 iOS 应用,截取屏幕截图、抓取日志并验证应用行为。
Prerequisites
- 已安装 Xcode 及命令行工具 (command-line tools)
- 已连接 XcodeBuildMCP MCP 服务
- 有效的 Xcode 项目或工作区 (workspace)
- 至少有一个可用 iOS 模拟器
Workflow
0. Verify XcodeBuildMCP is Available
调用 XcodeBuildMCP 的 list_simulators 工具,确认 XcodeBuildMCP MCP 服务已正常连接。
不同平台的 MCP 工具名称会有所不同:
- Claude Code:
mcp__xcodebuildmcp__list_simulators - 其他平台:使用
XcodeBuildMCP服务的list_simulators方法对应的 MCP 工具调用
如果未找到该工具或报错,提示用户添加 XcodeBuildMCP MCP 服务:
XcodeBuildMCP 未安装
通过 Homebrew 安装:
brew tap getsentry/xcodebuildmcp && brew install xcodebuildmcp
或通过 npx(无需全局安装):
npx -y xcodebuildmcp@latest mcp
然后将 "XcodeBuildMCP" 添加为 Agent 配置中的 MCP 服务,并重启 Agent。
在确认 XcodeBuildMCP 正常工作之前,切勿继续后续步骤。
1. Discover Project and Scheme
调用 XcodeBuildMCP 的 discover_projs 工具查找可用项目,再传入项目路径调用 list_schemes 获取可用 Scheme。
如果传入了参数,则使用该 Scheme 名称;如果参数为 "current",则使用默认/上次使用的 Scheme。
2. Boot Simulator
调用 list_simulators 查找可用模拟器。传入模拟器的 UUID 调用 boot_simulator 启动首选模拟器(推荐 iPhone 15 Pro)。
等待模拟器就绪后再继续后续操作。
3. Build the App
传入项目路径和 Scheme 名称调用 build_ios_sim_app。
构建失败时:
- 捕获构建错误
- 向用户汇报具体的错误详情
构建成功时:
- 记录构建好的 App 路径以供后续安装
- 进入第 4 步
4. Install and Launch
- 传入构建好的 App 路径和模拟器 UUID 调用
install_app_on_simulator - 传入 Bundle ID 和模拟器 UUID 调用
launch_app_on_simulator - 传入模拟器 UUID 和 Bundle ID 调用
capture_sim_logs开始抓取日志
5. Test Key Screens
针对应用中的每个核心界面:
截取屏幕截图:
传入模拟器 UUID 和具名文件名(如 screen-home.png)调用 take_screenshot。
审查截图内容:
- UI 元素渲染正常
- 无可见的错误信息
- 预期内容展示完整
- 布局结构正确
检查日志寻找异常:
传入模拟器 UUID 调用 get_sim_logs。重点排查:
- 崩溃 (Crash)
- 异常 (Exception)
- Error 级别的日志信息
- 失败的网络请求
已知自动化限制 —— SwiftUI Text 链接:
通过 XcodeBuildMCP 或任何模拟器自动化工具模拟点击时,无法触发带有内联 AttributedString 链接的 SwiftUI Text 视图的手势识别器。点击操作虽提示成功,但实际上没有任何效果。这是系统平台的底层限制 —— 内联链接不会作为独立元素暴露在无障碍树 (Accessibility Tree) 中。当点击 Text 链接无可见响应时,提示用户在模拟器中手动点击。如果已知目标 URL,也可以使用 xcrun simctl openurl <device> <URL> 直接打开该链接作为兜底方案。
6. Human Verification (When Required)
当测试涉及需要设备交互的流程时,暂停并等待人工介入。
| 流程类型 | 询问内容 |
|---|---|
| Sign in with Apple | "请在模拟器上完成 Sign in with Apple" |
| 推送通知 | "请发送测试推送并确认是否展示" |
| 应用内购买 (IAP) | "请完成 Sandbox 内购" |
| 相机/相册 | "请授予权限并确认相机功能正常" |
| 定位 | "请允许定位权限并确认地图信息更新" |
| SwiftUI Text 链接 | "请手动点击 [元素描述] —— 自动化点击无法触发内联文本链接" |
使用当前平台的中断式提问工具向用户询问:Claude Code 中使用 AskUserQuestion(若 schema 未加载,先调用 ToolSearch 配合 select:AskUserQuestion);Codex 中使用 request_user_input;Antigravity CLI (agy) 中使用 ask_question;Pi 中使用 ask_user(需安装 pi-ask-user 扩展)。只有当 Harness 环境中不存在中断式工具或调用报错(例如 Codex 编辑模式)时,才回退到在聊天中输出数字选项 —— 绝不能仅仅因为需要加载 schema 就回退到聊天文本。切勿静默跳过提问:
需要人工验证
当前测试需要 [流程类型]。请完成以下操作:
1. [在模拟器上的操作]
2. [需要验证的内容]
功能是否正常?
1. 是 - 继续测试
2. 否 - 描述问题所在
7. Handle Failures
当测试失败时:
-
记录失败信息:
- 截取错误状态的截图
- 抓取控制台日志
- 记录复现步骤
-
询问用户如何继续:
测试失败:[界面/功能] 问题:[描述] 日志:[相关错误信息] 下一步怎么做? 1. 立即修复 - 排查问题、提出修复方案、重新构建并测试 2. 跳过 - 继续测试其他界面 -
若选择“立即修复”: 排查问题、提出修复方案、重新构建并测试
-
若选择“跳过”: 标记为已跳过,继续后续测试
8. Test Summary
所有测试完成后,展示汇总信息:
## Xcode 测试结果
**项目:** [项目名称]
**Scheme:** [Scheme 名称]
**模拟器:** [模拟器名称]
### 构建结果:成功 / 失败
### 已测试界面:[数量]
| 界面 | 状态 | 备注 |
|--------|--------|-------|
| 启动页 | 通过 | |
| 首页 | 通过 | |
| 设置 | 失败 | 点击时崩溃 |
| 个人页 | 跳过 | 需要登录 |
### 控制台错误:[数量]
- [列出所有发现的错误]
### 人工验证项:[数量]
- Sign in with Apple:已确认
- 推送通知:已确认
### 失败项:[数量]
- 设置界面 - 页面跳转时崩溃
### 测试结论:[通过 / 失败 / 部分通过]
9. Cleanup
测试结束后:
- 传入模拟器 UUID 调用
stop_log_capture - 可选:传入模拟器 UUID 调用
shutdown_simulator
Quick Usage Examples
# 使用默认 Scheme 测试
/ce-test-xcode
# 指定 Scheme 测试
/ce-test-xcode MyApp-Debug
# 修改代码后测试
/ce-test-xcode current
Integration with ce-code-review
当审查涉及 iOS 代码的 PR 时,ce-code-review 工作流可启动一个 Agent 来运行本 Skill,在模拟器上构建应用、测试关键界面并检查是否存在崩溃。






