名称: ios-simulator
描述: 自动化 iOS 模拟器工作流(simctl + idb):创建/启动/擦除设备,安装/启动应用,推送通知,授予隐私权限,截图,以及基于辅助功能的 UI 导航。适用于 iOS 应用、Xcode、模拟器、simctl、idb、UI 自动化或 iOS 测试场景。
元数据: {"clawdbot":{"emoji":"📱","os":["darwin"],"requires":{"bins":["xcrun"]},"install":[{"brew":{"formula":"idb-companion","bins":["idb_companion"],"tap":"facebook/fb"}}]}}
本技能提供了一个仅限 Node.js 的 CLI 封装,底层整合了:
- xcrun simctl:用于模拟器/设备/应用管理
- idb:用于辅助功能树检查与合成 UI 输入(点击/文本/按钮)
专为AI 代理设计:默认输出简洁、结构化,同时支持按需获取详细信息。
idb 是可选的,但进行 UI 树检查或语义化点击时需要安装(安装步骤见下文)。# 1) 环境检查
node {baseDir}/scripts/ios-sim.mjs health
# 2) 列出模拟器(简洁模式)
node {baseDir}/scripts/ios-sim.mjs list
# 3) 选择默认模拟器(将在当前目录生成 .ios-sim-state.json 状态文件)
node {baseDir}/scripts/ios-sim.mjs select --name "iPhone" --runtime "iOS" --boot
# 4) 安装并启动 .app 应用
node {baseDir}/scripts/ios-sim.mjs app install --app path/to/MyApp.app
node {baseDir}/scripts/ios-sim.mjs app launch --bundle-id com.example.MyApp
# 5) 检查当前 UI(需要 idb)
node {baseDir}/scripts/ios-sim.mjs ui summary
node {baseDir}/scripts/ios-sim.mjs ui tap --query "登录"
node {baseDir}/scripts/ios-sim.mjs ui type --text "hello world"
# 6) 截图
node {baseDir}/scripts/ios-sim.mjs screenshot --out artifacts/screen.png
若当前环境非 macOS,可通过 ClawdBot 的节点执行功能(例如使用 exec 并指定 host: node 或节点工具)在 macOS 节点上运行相同命令。请确保技能文件夹存在于该节点上,或将其复制过去。
--pretty 参数可美化打印 JSON。--text 参数可获取简短的人类可读摘要(如果命令支持)。ui tree、list --full)需显式请求。select 命令会写入一个状态文件(默认:./.ios-sim-state.json),用于存储选定的设备 UDID。
所有命令都接受 --udid <UUID> 参数,否则将回退到状态文件中读取的 UDID。
可通过以下环境变量覆盖状态文件位置:
- IOS_SIM_STATE_FILE=/path/to/state.json
如果 xcrun 找不到 simctl,请确保已选择 Xcode CLI 工具(通过 Xcode 设置或 xcode-select),并运行首次启动设置:
- xcodebuild -runFirstLaunch
安装 idb_companion 和 idb CLI:
brew tap facebook/fb
brew install idb-companion
python3 -m pip install --upgrade fb-idb
| 等级 | 命令 | 说明 |
|---|---|---|
| 安全 | list, health, boot, shutdown, screenshot, ui * |
无数据丢失风险 |
| 需谨慎 | privacy *, push, clipboard *, openurl |
会改变模拟器/应用状态 |
| 危险 | erase, delete |
需要 --yes 确认 |
所有命令均遵循以下结构:
node {baseDir}/scripts/ios-sim.mjs <命令> [子命令] [参数]
list [--full]select --name <子字符串> [--runtime <子字符串>] [--boot]boot [--udid <uuid>] [--wait]shutdown [--udid <uuid>|--all]erase --yes [--udid <uuid>|--all]delete --yes [--udid <uuid>]create --name <名称> --device-type <子字符串> --runtime <子字符串>app install --app <路径/到/App.app> [--udid ...]app uninstall --bundle-id <标识符> [--udid ...]app launch --bundle-id <标识符> [--udid ...] [-- <参数...>]app terminate --bundle-id <标识符> [--udid ...]app container --bundle-id <标识符> [--type data|app] [--udid ...]screenshot --out <文件.png> [--udid ...]record-video --out <文件.mp4> [--udid ...](运行至 Ctrl+C 停止)clipboard get [--udid ...]clipboard set --text <文本> [--udid ...]openurl --url <url> [--udid ...]privacy grant --bundle-id <标识符> --service <服务[,服务...]> [--udid ...]privacy revoke --bundle-id <标识符> --service <服务[,服务...]> [--udid ...]privacy reset --bundle-id <标识符> --service <服务[,服务...]> [--udid ...]push --bundle-id <标识符> --payload <json字符串> [--udid ...]logs show [--last 5m] [--predicate <表达式>] [--udid ...]ui summary [--limit 12]ui tree(完整的 UI JSON 数组)ui find --query <文本> [--limit 20]ui tap --query <文本>(查找并点击最佳匹配项)ui tap --x <数值> --y <数值>(原始坐标点击)ui type --text <文本>ui button --name HOME|LOCK|SIRI|SIDE_BUTTON|APPLE_PAY