Sep 28, 2026

用 ios-simulator-skill 让 Claude Code 构建、运行并探查 iOS 应用

29 个脚本封装 xcodebuild 与 iOS 模拟器,用渐进式披露和基于无障碍树的导航,让 agent 能构建、点击并验证你的 app,而不会被输出淹没。

#tutorial#testing#developer-tools

让 agent「构建 app 并点一遍登录页」会撞上两堵墙:xcodebuild 的输出会灌满上下文窗口,而模拟器里的 UI 它又看不见。ios-simulator-skill 是一个生产可用的 skill——29 个脚本,封装 xcodebuild、xcrun simctl 和 idb——两堵墙一起拆:构建结果以单行摘要返回,UI 导航按语义找按钮,而不是靠像素坐标。

为什么这个 Skill 重要

省 token 的账是核心。一张截图要 1,600–6,300 个 token,而这个 skill 依赖的无障碍树默认输出只要约 10 个 token。README 报告全部 29 个脚本的默认输出都是 3–5 行——相比原始工具输出减少 96%。构建结果同理:一行摘要加一个 xcresult ID,细节只有你追问时才展开。

导航走 iOS 无障碍 API:navigator.py --find-text "Login" --tap 按标签找按钮,布局变了也照常工作,而写死的 idb ui tap 320 400 一变就失效。脚本集覆盖完整闭环——构建与测试、设备状态(深色模式、地区、GPS 模拟)、手势与键盘、无障碍审计、视觉对比、推送通知模拟、权限管理,以及模拟器生命周期。

安装

在 Claude Code 中通过插件市场安装:

/plugin marketplace add conorluddy/ios-simulator-skill
/plugin install ios-simulator-skill@conorluddy

从 release 手动安装(最简单):

curl -L https://github.com/conorluddy/ios-simulator-skill/releases/latest/download/ios-simulator-skill.zip -o skill.zip
unzip skill.zip -d ~/.claude/skills/ios-simulator-skill

不要把整个仓库克隆进 skills 目录——这个仓库是一个 plugin,真正的 skill 位于 ios-simulator-skill/skills/ios-simulator-skill/,直接克隆会让 SKILL.md 深埋三层而无法加载。

前置条件:macOS 15+、Xcode 26+ 加 Command Line Tools、Python 3.12+,以及 idb 1.5.1+(每个交互脚本都需要;只有视觉对比要用 Pillow)。从 Meta 的 tap 安装 idb:

brew tap facebook/fb
brew install facebook/fb/idb-companion facebook/fb/idb-cli

然后一次性验证环境:

bash scripts/sim_health_check.sh

实战:修一个 agent 看得见的登录 bug

  1. 用渐进式披露构建并测试:
python scripts/build_and_test.py --project MyApp.xcodeproj --scheme MyApp
  1. 结果只有一行——Build: SUCCESS (0 errors, 3 warnings) [xcresult-...]。需要细节时,用 --get-errors、--get-warnings 或 --get-log 加上那个 xcresult ID 追问。
  2. 启动模拟器、拉起 app,按语义导航:
python scripts/navigator.py --find-text "Login" --tap
  1. 把 bug 交给 agent,让它自己驱动这个闭环:
登录按钮点击后没有跳转。用 ios-simulator-skill 启动 app,走到登录页复现这个问题,
把截图和控件层级一起带回来。
  1. 在 Xcode 27 上记住一件事:Simulator.app 已经没有了——它被 DeviceHub.app 取代;脚本通过 simctl 和 idb 无头驱动模拟器,所以多数时候无感,但 open -a Simulator 会失败。

技巧

  • 用 IOS_SIM_* 环境变量调节各项上限。比如给慢速的 GitHub Actions macOS runner:IOS_SIM_BOOT_TIMEOUT=600 python scripts/simctl_boot.py --wait-ready。
  • 这些旋钮有真实的取舍:上限调高,误报失败更少、诊断更完整,但 token 消耗更大;调低则反馈更快,但可能悄悄丢掉错误或在正常慢操作上提前超时。
  • 如果崩溃后 idb 调用开始报 Connection refused,说明有一个已死的 companion 还挂着——用 idb disconnect <udid> 清掉;健康检查脚本会发现这种情况。
  • brew install idb-companion 已经装不到了:包搬进了 Meta 自己的 facebook/fb tap。在 Xcode 27 上,旧版 companion 会静默丢弃每一次点击和按键——升级到 1.5.1+。
  • README 报告的 Claude Code evals 结果:带 skill 通过率 100%(3/3),不带为 46%——值得用 claude evals run evals/evals.json --skill ios-simulator-skill 在你自己的 app 上复测。

何时不用这个 Skill

它需要 Mac、Xcode 26+ 和 Python 3.12+ 工具链——只在 Linux CI 上构建的项目得不到任何东西。而如果你只想构建工具、不要模拟器交互,同一位作者另发了一个不带模拟器脚本的插件版 xclaude-plugin。


查看 排行榜 了解更多 skill。