移动/游戏
需要在 iOS 真机/模拟器上验证 UI 与触摸交互时…
当需要验证/测试/检查 iOS 应用在真机或模拟器上是否工作、实现影响 UI 的功能后需设备验证、用户说 does it work/test this/check on device、用户反馈 UI 未按预期工作或需要调试触摸/交互问题时适用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要在 iOS 真机/模拟器上验证 UI特定
解决思路
- 通过 Agent tool 调用本子代理技能:subagent_type 设为 general-purpose,description 描述要验证的功能,prompt 要求使用 device-interaction 技能在 session <device-interaction-session> 上验证功能;例如要求启动应用、捕获截图和 UI 层级、检查登录按钮可见且可点击,并报告实现是否正确。
- 在实现影响 UI 的功能后,调用此技能验证实现能在设备上正常工作。
- 按会话生命周期操作:尽早调用 DeviceInteractionStartSession(后台运行)→ 每次代码变更后调用 DeviceInteractionInstallAndRun(包含构建)→ 用 DeviceEventSynthesize 反复交互和观察 → 完成时调用 DeviceInteractionEndSession;保持会话打开会占用大量资源。
- DeviceInteractionStartSession 设备发现:打开新设备交互会话时传入设备标识选择设备;省略则使用当前 destination;传入任意不匹配的值可获取可用目标列表。
- DeviceInteractionInstallAndRun 的 commandLineArguments 参数:用于启动时传给应用的参数,使用 $(inherited) 作为 token 保留 scheme 已有参数,例如 ["$(inherited)", "--reset-state"] 在末尾追加参数。
- DeviceInteractionInstallAndRun 的 environmentVariables 参数:用于启动时设置环境变量,使用 "$(inherited)" 作为 key 保留 scheme 已有环境变量,例如 {"$(inherited)": "", "DEBUG_MODE": "1"}。
- 省略 commandLineArguments 和 environmentVariables 则不改动 scheme 的参数和环境。
- 优先使用 commandLineArguments 和 environmentVariables,而不是直接编辑 scheme;它们仅对该次运行生效,对用户配置无持久影响。
- 作为子代理,始终报告可能由代码引起的 UI 问题,包括重叠或不可读文本、意外裁剪图像/文本、错误颜色等。
- 使用 DeviceEventSynthesize 执行交互并观察设备状态。
- 读取 hierarchy 文件时,利用每个元素的计算中心位置:{x, y} 为 origin,{width, height} 为宽高,center: {cx, cy} 是计算出的中心点,最适合点击;始终优先使用中心坐标进行触摸事件。
- 交互命令 t <x> <y> [duration]:在坐标处点击,可选按住时长。
- 交互命令 d <x> <y>:在坐标处双击。
- 交互命令 t <x1> <y1> f <x2> <y2> [duration]:从 (x1,y1) 滑动到 (x2,y2)。
- 交互命令 b h/p/u/d [duration]:硬件按钮,h=Home、p=Power、u=VolUp、d=VolDown。
- 交互命令 sender keyboard kbd <text>:输入文本;必须是命令链最后一个命令,所有内容在 kbd 后按原样处理(保留多个空格);特殊字符用 \u{XXXX} Unicode 转义,例如 \u{000A} 表示 Return/换行,\u{0009} 表示 Tab。
- 交互命令 w duration:等待指定时长而不做任何工作。
- 交互命令 orientation faceDown/faceUp/landscapeLeft/landscapeRight/portrait/portraitUpsideDown:设置设备方向。
- 交互示例:t 100 200 在 (100,200) 点击。
- 交互示例:d 200 300 在 (200,300) 双击。
- 交互示例:t 200 600 f 200 200 0.3 上滑(滚动到下方内容)。
- 交互示例:t 200 200 f 200 600 0.3 下滑(滚动到上方内容)。
- 交互示例:b h 按 Home 键。
- 交互示例:b h b h 连按两次 Home 进入 App Switcher。
- 交互示例:b h w 0 b h 唤醒并解锁设备(仅无密码设备)。
- 交互示例:sender keyboard kbd hello world 输入带空格文本。
- 交互示例:sender keyboard kbd hello world 保留多个空格。
- 交互示例:sender keyboard kbd submit\u{000A} 输入文本后按 Return/提交。
- 交互示例:w 0.3 等待 0.3s。
- 交互示例:orientation landscapeLeft 旋转到横屏。
- 标准子代理工作流:任何交互前,始终捕获并读取 hierarchy(和 screenshot)。
- 标准子代理工作流:任何交互后,再次捕获并验证结果。
- 标准子代理工作流:对复杂组件(如 toggle 或 switch),查看嵌套元素(如 Switch 或 Slider),附近元素可能对应实际控件。
- 标准子代理工作流:完成后向主 agent 报告发现。
- 不交互只捕获时,使用 DeviceEventSynthesize 并将 interactionCommand 设为空。
- 绝不要仅从截图猜测位置,始终使用 hierarchy 中心坐标。
- 如果不够自信或缩略图分辨率不足,分析全尺寸截图。
- App 启动时机:启动会话后应用可能需几秒加载;交互前捕获 hierarchy 并检查有有意义的 UI 元素;如果 hierarchy 大多为空或显示启动屏,再次捕获后再继续。
- 交互后重试:如果点击或滑动没有产生预期变化,重新捕获 hierarchy 并重试该交互一次(元素可能在动画中移动);如果一次重试后仍失败,报告失败,不要无限重试。
- 加载状态:如果 hierarchy 显示 spinner 或 loading indicator,短暂暂停后再次捕获;不要与仍在加载的元素交互。
- 功能 bug(始终报告):元素不响应点击、导航到错误屏幕、崩溃、数据未显示、缺失预期 UI 元素。
- 视觉/布局 bug(始终报告):重叠文本、截断标签、元素渲染到屏幕外、错误颜色、对齐损坏。
- Transient state(不要报告为 bug):加载 spinner、短暂动画、键盘出现/消失;过渡完成后再次捕获。
- 意外退出(始终报告):崩溃、应用退出;通过跟踪 process id 并捕获进程标准输出来识别。
- 预期行为(不要报告为 bug):带占位文本的空状态、表单未完成时禁用按钮、权限对话框。
- 错误处理:如果应用不可见,重试一次,可能是设备慢。
- 错误处理:如果点击目标不明确,重新读取 hierarchy 数据获取正确中心坐标。
- 错误处理:可检查运行时日志排查;如果怀疑计时 bug,建议主 agent 临时在相关代码中添加 print 语句帮助诊断。
- 错误处理:向主 agent 报告问题并附上细节和建议。
适用边界 · 注意事项
- 用户只问单元测试、只要求构建而不做设备测试、只做代码审查而不做设备测试时,不适用。
- 用户问模拟器配置问题,或改动不影响 UI(如注释、重构、非 UI 逻辑)时,不适用。