用途
sim-use 是面向 AI 智能体的移动端自动化技能,让你用命令行驱动 iOS Simulator、Android 模拟器/设备,以及实体 iPhone/iPad 的屏幕。适用于需要自动化操作模拟器或真机界面的任务。
主要能力
- 界面读取:
sim-use ui --device <UDID>读取界面轮廓,每个元素带@N别名,可选带#<id>标识符;列表单元带#N(dominant list)或#N@M(scoped)。 - 选择器操作:支持
tap @N(缓存最快)、tap #<id>(跨小布局变化稳定)、tap --label 'X'、tap --label-regex '...'、tap --label-contains 'X',以及最后的tap -x N -y N/tap --point x,y。可用--element-type或--frame minY=0.7r消歧。 - 常见动作:滚动(
gesture scroll-up)、输入(type)、粘贴 Unicode(paste)、硬件按键(button home/button back)、滑动(swipe)、捏合(gesture pinch-out)、旋转(gesture rotate-cw)。 - 证据录制:
record-video --output demo.gif,用 SIGINT/SIGTERM 停止,停止后转码,可在 PR 中内联播放,支持--gif-markers。 - 批量执行:iOS 上可用
sim-use ios batch一次调用完成已知多步序列。 - 崩溃检测:命令之间检测目标进程消失并给出
PROCESS DISAPPEARED提示;Android 上 ui 还能从无障碍树直接检测 AOSP 系统崩溃对话框。
使用方式
- 预检:首次与设备交互前运行
python3 scripts/preflight.py --device <UDID>,验证 sim-use 已安装且兼容、设备可达、守护进程健康。没有脚本时手动检查:sim-use --version、sim-use devices、sim-use ui --device <UDID>。 - 观察—操作—验证循环:每步都遵循 observe → act → verify。命令是「发出后不等待反馈」,操作后必须重新读取界面或截图确认。
- 保持输出精简:优先使用默认文本轮廓而非
--json;使用--json时加--no-raw;每步操作只跑一次 ui(第 N 步的 Verify 读取即第 N+1 步的 Observe 读取);用文本轮廓验证而非截图。
只有一台模拟器启动或一个守护进程运行时,--device 可选。Android 需先执行一次 sim-use android init --device <serial> 安装桥接 APK。
实体 iOS 设备(实验性)
只有三个动词会自动路由到实体 UDID:ui、tap(#<id> / --id / --label / --label-contains / --element-type 形式)和 screenshot。其他动词或形式会以原因和最近替代方案拒绝,应读取提示而不是重试。
硬性要求(ui / tap):设备必须已配对、受信任、已解锁并处于 Developer Mode,且前台目标应用必须以 get-task-allow=true 开发签名。使用 Development 配置文件安装的 Release 配置二进制受支持;Distribution/Ad Hoc、TestFlight、App Store 和系统应用不受支持。screenshot 不受签名规则限制,可捕获任何屏幕。
实体设备上应按 #id 或 label 点击,不能用 @N(元素句柄随 DTX 连接失效)。--json 在所有动词上可用,实体结果带 "kind":"physical" 并省略几何字段。完整树需几秒,不要用紧凑循环轮询。
适用场景
- 自动化模拟器/模拟器或真机屏幕以完成 GUI 任务。
- 在 iOS/Android 界面间执行点击、输入、滑动等交互序列。
- 录制演示 GIF 作为证据或用于 PR。
限制与注意事项
- 输出成本:每个字节的命令输出都消耗上下文,需按上述规则精简。
- 坐标空间:
--json中的 frame 使用平台原生单位(iOS points、Android pixels),跨平台计算坐标前先看 envelope 的 platform 字段。显式-x/-y/--point默认是设备原生竖屏空间,设备可能旋转时加--coordinate-space ui。 - 常见陷阱:label 冲突需加
--frame或--element-type;导航后@N缓存失效需重新 ui;系统层(弹窗、分享面板)遮挡需先关闭;多匹配报错需更具体的选择器;点击无反应可加--pre-delay或--wait-timeout;iOS 软键盘下粘贴可能丢失,用paste --via-menu --target-id <id>;Android 后台剪贴板访问被拒时改用 type。 - Resize Mode:iOS 模拟器处于 Xcode 27 Resize Mode 时,触摸输入无法到达应用,sim-use 拒绝触摸而非报告已送达的点击;此时可自由读取 ui 和截图,仅可用 type、Cmd+V 粘贴和按键动词驱动。
- 崩溃处理:检测到进程消失必须停止、报告崩溃横幅文本并等待指示,不能静默重启或继续。
- Linux 构建:仅支持 Android,缺少 ios、record-video / stream-video、viewer 和 init,每个动词都需要
--device <serial>。 - 升级询问:选择器冲突无法消歧、预检失败且无法自动修复、需要破坏性操作(删数据、卸载应用)、同一动作重试 3 次无进展时,应停止并询问用户。
退出检查清单
报告任务完成前:运行 sim-use ui(或截图)捕获最终状态;确认屏幕符合预期结果;若结果不明确,将最终 ui 输出或截图展示给用户。