argent-device-interact
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseUnified tool surface
统一工具界面
All interaction tools below accept a parameter and auto-dispatch iOS vs Android based on its shape (UUID → iOS simulator, anything else → Android adb serial). You use the same tool names on both platforms.
udidFor platform-specific caveats (Metro , locked-screen describe errors, etc.), see § 9 Platform-specific notes at the bottom.
adb reverse以下所有交互工具都接受参数,并根据其格式自动区分iOS和Android(UUID → iOS模拟器,其他格式 → Android adb序列号)。你可以在两个平台上使用相同的工具名称。
udid有关平台特定的注意事项(如Metro 、锁屏时的describe错误等),请查看底部的§9 平台特定说明。
adb reverse1. Before You Start
1. 开始之前
If you delegate simulator tasks to sub-agents, make sure they have MCP permissions.
Use to get a target id. Results are tagged with ( or ); booted/ready devices come first. Pick the first entry that matches the platform you need — if none are ready, call with (iOS) or (Android). See / for full setup flow.
list-devicesplatformiosandroidboot-deviceudidavdNameargent-ios-simulator-setupargent-android-emulator-setupLoad tool schemas before first use. Gesture tools (, , , , ) may be deferred — their parameter schemas are not loaded until fetched. Always use ToolSearch to load the schemas of all gesture tools you plan to use before calling any of them. If you skip this step, parameters may be coerced to strings instead of numbers, causing validation errors.
gesture-tapgesture-swipegesture-pinchgesture-rotategesture-custom如果你将模拟器任务委托给子Agent,请确保它们拥有MCP权限。
使用获取目标设备ID。结果会标记(或);已启动/就绪的设备排在前面。选择第一个符合你所需平台的条目——如果没有就绪的设备,请使用(iOS)或(Android)调用。完整设置流程请查看 / 。
list-devicesplatformiosandroidudidavdNameboot-deviceargent-ios-simulator-setupargent-android-emulator-setup首次使用前加载工具 schema。手势工具(、、、、)可能会延迟加载——它们的参数schema在获取前不会加载。在调用任何手势工具之前,务必使用ToolSearch加载你计划使用的所有手势工具的schema。如果跳过此步骤,参数可能会被强制转换为字符串,导致验证错误。
gesture-tapgesture-swipegesture-pinchgesture-rotategesture-custom2. Best Practices
2. 最佳实践
- Always refer to tapping_rule from your argent.md rule before tapping.
- Before performing interactions, consider whether they can be dispatched sequentially - more on that in .
run-sequence - Use for lists/scrolling, not
gesture-swipe, unless you need non-linear movement. Consider whether you need multiple swipes, if yes - usegesture-custom.run-sequence - Tap a text field before typing — on iOS try first then fall back to
paste; on Android usekeyboarddirectly (keyboardis iOS-only).paste - Coordinates are normalized — always 0.0–1.0, not pixels.
- For app navigation, prefer first. It works on any screen without app restart. Do not navigate from screenshots on regular in-app screens unless
describefailed to expose a reliable target. Usedescribeonly when you need app-scoped UIKit properties.native-describe-screen
- 点击前务必参考argent.md规则中的tapping_rule。
- 在执行交互操作前,考虑是否可以按顺序调度这些操作——更多信息请查看。
run-sequence - 使用处理列表/滚动,而非
gesture-swipe,除非你需要非线性移动。考虑是否需要多次滑动,如果需要,请使用gesture-custom。run-sequence - 输入文本前先点击文本框——在iOS上优先尝试,失败后再使用
paste;在Android上直接使用keyboard(keyboard仅支持iOS)。paste - 坐标已归一化——始终为0.0–1.0,而非像素值。
- 应用导航优先使用。它可以在任何屏幕上工作,无需重启应用。除非
describe无法提供可靠的目标,否则不要通过截图进行常规应用内屏幕导航。仅当你需要应用范围的UIKit属性时,才使用describe。native-describe-screen
3. Opening Apps
3. 打开应用
Never navigate to an app by tapping home-screen icons. Use or — they are instant and reliable.
launch-appopen-url绝对不要通过点击主屏幕图标导航到应用。使用或——它们即时且可靠。
launch-appopen-urllaunch-app — by bundle ID
launch-app — 通过Bundle ID启动
json
{ "udid": "<UDID>", "bundleId": "com.apple.MobileSMS" }Common IDs: (Messages), (Safari), (Settings), , , , , (Contacts)
com.apple.MobileSMScom.apple.mobilesafaricom.apple.Preferencescom.apple.Mapscom.apple.Photoscom.apple.mobilemailcom.apple.mobilenotescom.apple.MobileAddressBookjson
{ "udid": "<UDID>", "bundleId": "com.apple.MobileSMS" }常见ID:(信息)、(Safari)、(设置)、、、、、(通讯录)
com.apple.MobileSMScom.apple.mobilesafaricom.apple.Preferencescom.apple.Mapscom.apple.Photoscom.apple.mobilemailcom.apple.mobilenotescom.apple.MobileAddressBookopen-url — by URL scheme
open-url — 通过URL Scheme打开
json
{ "udid": "<UDID>", "url": "messages://" }Common schemes: , , , , , (Safari)
messages://settings://maps://?q=<query>tel://<number>mailto:<address>https://...json
{ "udid": "<UDID>", "url": "messages://" }常见Scheme:、、、、、(Safari)
messages://settings://maps://?q=<query>tel://<number>mailto:<address>https://...4. Choosing the Right Tool
4. 选择合适的工具
| Action | Tool | Notes |
|---|---|---|
| Multiple actions | | Batch steps in one call (no intermediate screenshots) |
| Open an app | | Always — never tap home-screen icons |
| Restart an app | | Terminate and relaunch by bundle ID |
| Open URL/scheme | | Web pages, deep links, URL schemes |
| Single tap | | Buttons, links, checkboxes |
| Scroll/swipe | | Straight-line scroll or swipe |
| Long press | | Context menus, drag start |
| Drag & drop | | Complex drag interactions |
| Pinch/zoom | | Two-finger pinch with auto-interpolation |
| Rotation | | Two-finger rotation with auto-interpolation |
| Custom gesture | | Arbitrary touch sequences, optional interpolation |
| Hardware key | | Home, back, power, volume, appSwitch, actionButton |
| Type text (fast) | | iOS only. Form fields — uses clipboard |
| Type text | | iOS+Android. Fallback when paste fails; supports Enter, Escape, arrows |
| Rotate device | | Orientation changes |
| 操作 | 工具 | 说明 |
|---|---|---|
| 多步操作 | | 批量执行多步操作(无需中间截图) |
| 打开应用 | | 务必使用此工具——绝对不要点击主屏幕图标 |
| 重启应用 | | 通过Bundle ID终止并重新启动应用 |
| 打开URL/Scheme | | 网页、深度链接、URL Scheme |
| 单点点击 | | 按钮、链接、复选框 |
| 滚动/滑动 | | 直线滚动或滑动 |
| 长按 | | 上下文菜单、拖拽开始 |
| 拖拽与放置 | | 复杂拖拽交互 |
| 捏合/缩放 | | 双指捏合,自动插值计算 |
| 旋转 | | 双指旋转,自动插值计算 |
| 自定义手势 | | 任意触摸序列,可选插值计算 |
| 硬件按键 | | Home、返回、电源、音量、应用切换、动作按钮 |
| 快速输入文本 | | 仅支持iOS。表单字段——使用剪贴板 |
| 输入文本 | | 支持iOS+Android。 |
| 旋转设备 | | 改变屏幕方向 |
5. Finding Tap Targets
5. 查找点击目标
IMPORTANT. When moved to a different screen after an action or do not know the coordinates of component, always perform proper discovery first.
| App type | Discovery tool | What it returns |
|---|---|---|
| Target app discovery | | Accessibility element tree for the current device screen (iOS AX-service or Android uiautomator) with normalized frame coordinates. Works on any app, system dialogs, and Home screen — no app restart or |
| React Native | | React component tree with names, text, testID, and (tap: x,y) |
| App-scoped native | | Low-level app-scoped accessibility elements with normalized and raw coordinates; requires |
| Permission / system modal overlay | | |
| Final visual fallback | | Use only when discovery tools cannot inspect the current UI reliably. Do not derive routine in-app navigation targets from screenshots |
Point follow-up native diagnostics after you already have a candidate point:
- : deepest native view that would receive touch at a known raw iOS point; requires
native-user-interactable-view-at-pointbundleId - : deepest visible native view at a known raw iOS point; requires
native-view-at-pointbundleId
重要提示。执行操作后切换到其他屏幕,或不知道组件坐标时,务必先执行正确的发现操作。
| 应用类型 | 发现工具 | 返回内容 |
|---|---|---|
| 目标应用发现 | | 当前设备屏幕的无障碍元素树(iOS AX-service或Android uiautomator),包含归一化的框架坐标。适用于任何应用、系统对话框和主屏幕——无需重启应用或提供 |
| React Native应用 | | React组件树,包含名称、文本、testID和(点击坐标:x,y) |
| 应用范围的原生界面 | | 低层级的应用范围无障碍元素,包含归一化和原始坐标;需要 |
| 权限/系统模态弹窗 | | |
| 最终视觉备选方案 | | 仅当发现工具无法可靠检查当前UI时使用。不要从截图中获取常规应用内导航目标 |
找到候选点后,可进行后续原生诊断:
- :已知原始iOS坐标处,能接收触摸事件的最深层原生视图;需要
native-user-interactable-view-at-pointbundleId - :已知原始iOS坐标处,可见的最深层原生视图;需要
native-view-at-pointbundleId
If describe
Fails
describe如果describe
失败
describeRead the exact error and choose the action that matches it:
- Error mentions not available or daemon startup failure: the ax-service daemon could not start. Check that the simulator is booted. Use
ax-serviceas a temporary fallback, or usescreenshotwith an explicitnative-describe-screenif the app has native devtools injected.bundleId - returns an empty element list: the screen may be blank, loading, or showing content without accessibility labels. Use
describeto see what is visible, then retry after the content has loaded.screenshot - succeeds but is not detailed enough for a React Native app: use
describenext.debugger-component-tree - You need app-scoped inspection with full UIKit properties (,
accessibilityIdentifier): useviewClassNamewith an explicitnative-describe-screen. This requires native devtools (dylib) injection — callbundleIdfirst if needed.restart-app - You already have a candidate point and want to confirm what would actually receive touch:
use . Use
native-user-interactable-view-at-pointwhen you want the visually deepest view instead of the hit-test target.native-view-at-point
阅读具体错误信息,选择对应的操作:
- 错误提到不可用或守护进程启动失败: ax-service守护进程无法启动。检查模拟器是否已启动。临时回退使用
ax-service,或如果应用已注入原生开发工具,使用带明确screenshot的bundleId。native-describe-screen - 返回空元素列表: 屏幕可能为空、加载中,或显示的内容无无障碍标签。使用
describe查看可见内容,待内容加载完成后重试。screenshot - 执行成功,但对React Native应用来说不够详细: 接下来使用
describe。debugger-component-tree - 你需要带有完整UIKit属性(、
accessibilityIdentifier)的应用范围检查: 使用带明确viewClassName的bundleId。这需要注入原生开发工具(dylib)——必要时先调用native-describe-screen。restart-app - 你已有候选点,想要确认哪个视图会实际接收触摸事件:
使用。如果想要视觉上最深层的视图而非点击测试目标,使用
native-user-interactable-view-at-point。native-view-at-point
6. Tool Usage
6. 工具使用方法
gesture-tap — Single tap at a point
gesture-tap — 在指定坐标单点点击
json
{ "udid": "<UDID>", "x": 0.5, "y": 0.5 }Coordinates: = left/top, = right/bottom.
0.01.0Before tapping near the bottom of the screen in React Native apps, check that "Open Debugger to View Warnings" banners are not visible — tapping them breaks the debugger connection. Close them with the X icon if present.
json
{ "udid": "<UDID>", "x": 0.5, "y": 0.5 }坐标说明: = 左/上, = 右/下。
0.01.0在React Native应用中点击屏幕底部附近前,检查是否显示“Open Debugger to View Warnings”横幅——点击它们会中断调试器连接。如果存在,请点击X图标关闭。
gesture-swipe — Straight-line gesture
gesture-swipe — 直线手势
json
{ "udid": "<UDID>", "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 }Swipe up () = scroll content down. Default duration: 300ms. Optional: for slower swipe.
fromY > toY"durationMs": 500json
{ "udid": "<UDID>", "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 }向上滑动()= 向下滚动内容。默认时长:300ms。可选参数:实现慢速滑动。
fromY > toY"durationMs": 500gesture-pinch — Two-finger pinch
gesture-pinch — 双指捏合
json
{ "udid": "<UDID>", "centerX": 0.5, "centerY": 0.5, "startDistance": 0.2, "endDistance": 0.6 }All values are normalized 0.0–1.0 (fractions of screen, not pixels) — same as all other gesture tools. means fingers start 20% of the screen apart; means they end 60% apart. = pinch out (zoom in). = pinch in (zoom out). Defaults: (horizontal), . Optional: for vertical axis, for slower pinch.
startDistance: 0.2endDistance: 0.6startDistance < endDistancestartDistance > endDistanceangle: 0durationMs: 300"angle": 90"durationMs": 500json
{ "udid": "<UDID>", "centerX": 0.5, "centerY": 0.5, "startDistance": 0.2, "endDistance": 0.6 }所有值均为归一化的0.0–1.0(屏幕比例,而非像素)——与其他所有手势工具一致。表示手指初始距离为屏幕的20%;表示最终距离为屏幕的60%。 = 向外捏合(放大)。 = 向内捏合(缩小)。默认值:(水平方向),。可选参数:设置垂直轴,实现慢速捏合。
startDistance: 0.2endDistance: 0.6startDistance < endDistancestartDistance > endDistanceangle: 0durationMs: 300"angle": 90"durationMs": 500gesture-rotate — Two-finger rotation
gesture-rotate — 双指旋转
json
{
"udid": "<UDID>",
"centerX": 0.5,
"centerY": 0.5,
"radius": 0.15,
"startAngle": 0,
"endAngle": 90
}All positions and radius are normalized 0.0–1.0 (fractions of screen, not pixels). means each finger is 15% of the screen away from center. = clockwise. Default duration: 300ms. Optional: for slower rotation.
radius: 0.15endAngle > startAngle"durationMs": 500json
{
"udid": "<UDID>",
"centerX": 0.5,
"centerY": 0.5,
"radius": 0.15,
"startAngle": 0,
"endAngle": 90
}所有位置和半径均为归一化的0.0–1.0(屏幕比例,而非像素)。表示每个手指距离中心点为屏幕的15%。 = 顺时针旋转。默认时长:300ms。可选参数:实现慢速旋转。
radius: 0.15endAngle > startAngle"durationMs": 500gesture-custom — Custom touch sequence
gesture-custom — 自定义触摸序列
For long-press, drag-and-drop, and other complex sequences, see . Set to auto-generate smooth intermediate Move events between keyframes.
references/gesture-examples.md"interpolate": 10长按、拖拽与放置及其他复杂序列的示例,请查看。设置可在关键帧之间自动生成平滑的移动事件。
references/gesture-examples.md"interpolate": 10button — Hardware button press
button — 按下硬件按键
json
{ "udid": "<UDID>", "button": "home" }Values: , , , , , ,
homebackpowervolumeUpvolumeDownappSwitchactionButtonjson
{ "udid": "<UDID>", "button": "home" }可选值:、、、、、、
homebackpowervolumeUpvolumeDownappSwitchactionButtonpaste — Type text into focused field (iOS only)
paste — 向已聚焦的字段输入文本(仅iOS)
json
{ "udid": "<UDID>", "text": "Hello, world!" }Tap the field first, then paste. Fall back to if it doesn't work. On Android the call is rejected by the capability gate ("Tool 'paste' is not supported on android") — use directly.
keyboardkeyboardjson
{ "udid": "<UDID>", "text": "Hello, world!" }先点击字段,再执行paste操作。如果失败,回退使用。在Android上,该调用会被能力网关拒绝("Tool 'paste' is not supported on android")——直接使用。
keyboardkeyboardkeyboard — Type text or press special keys
keyboard — 输入文本或按下特殊按键
json
{ "udid": "<UDID>", "text": "search query", "key": "enter" }Special keys: , , , , , , , , , –. Optional: between keystrokes (default 50ms).
enterescapebackspacetabspacearrow-uparrow-downarrow-leftarrow-rightf1f12"delayMs": 100json
{ "udid": "<UDID>", "text": "search query", "key": "enter" }特殊按键:、、、、、、、、、–。可选参数:设置按键间隔(默认50ms)。
enterescapebackspacetabspacearrow-uparrow-downarrow-leftarrow-rightf1f12"delayMs": 100rotate — Change orientation
rotate — 改变设备方向
json
{ "udid": "<UDID>", "orientation": "LandscapeLeft" }Values: , , ,
PortraitLandscapeLeftLandscapeRightPortraitUpsideDownjson
{ "udid": "<UDID>", "orientation": "LandscapeLeft" }可选值:、、、
PortraitLandscapeLeftLandscapeRightPortraitUpsideDown7. Screenshots
7. 截图
Use the explicit tool only when:
screenshot- You need the initial screen state before any action.
- The auto-attached screenshot shows a transitional or loading frame.
- You require extra context.
- You want to check state after a delay (e.g. waiting for a network response).
- A permission dialog, system alert, or native modal overlay is visible and did not expose reliable targets.
describe
When using for permission or native modal navigation:
screenshot- Do not switch to screenshot-driven navigation just because a modal is visible. On regular app screens and in-app modals, keep using .
describe - Prefer obvious, centered alert buttons such as ,
Allow,OK,Don't Allow, orNot Now.Continue - Tap one control at a time and inspect the returned auto-screenshot before doing anything else.
- After the modal is dismissed, return to normal discovery with ,
describe, ornative-describe-screen.debugger-component-tree
Optional rotation parameter: — rotates the capture without changing simulator orientation.
{ "udid": "<UDID>", "rotation": "LandscapeLeft" }Screenshots are downscaled by default (30% of original resolution) to reduce context size. accepts values from 0.01 to 1.0. If UI elements are hard to read or you need to inspect fine detail, pass to get full resolution: .
scalescale: 1.0{ "udid": "<UDID>", "scale": 1.0 }仅在以下场景使用明确的工具:
screenshot- 需要获取执行任何操作前的初始屏幕状态。
- 自动附加的截图显示过渡或加载帧。
- 需要额外上下文信息。
- 想要在延迟后检查状态(例如等待网络响应)。
- 显示权限对话框、系统警报或原生模态弹窗,且未提供可靠目标。
describe
使用处理权限或原生模态导航时:
screenshot- 不要因为模态弹窗可见就切换到基于截图的导航。在常规应用屏幕和应用内弹窗中,继续使用。
describe - 优先选择明显的居中警报按钮,如、
Allow、OK、Don't Allow或Not Now。Continue - 一次点击一个控件,在执行其他操作前检查返回的自动截图。
- 弹窗关闭后,恢复使用、
describe或native-describe-screen进行常规发现操作。debugger-component-tree
可选旋转参数:——在不改变模拟器方向的情况下旋转截图。
{ "udid": "<UDID>", "rotation": "LandscapeLeft" }截图默认会缩小(原始分辨率的30%)以减少内容大小。接受0.01到1.0之间的值。如果UI元素难以辨认或需要检查细节,传递获取全分辨率截图:。
scalescale: 1.0{ "udid": "<UDID>", "scale": 1.0 }Troubleshooting
故障排除
| Problem | Solution |
|---|---|
| Screenshot times out | Restart the simulator-server via |
| No booted iOS simulator | Call |
| No ready Android device | Call |
| 问题 | 解决方案 |
|---|---|
| 截图超时 | 通过 |
| 无已启动的iOS模拟器 | 使用iOS的 |
| 无就绪的Android设备 | 使用 |
8. Action Sequencing with run-sequence
run-sequence8. 使用run-sequence
进行操作序列调度
run-sequenceUse to batch multiple interaction steps into a single tool call. Only one screenshot is returned — after all steps complete. Use cases:
scrolling multiple times, typing and submitting automatically, known sequence of multiple taps, rotating device back and forth.
run-sequenceDo not use when any step depends on observing the result of a previous step
run-sequence使用将多个交互步骤批量处理为单个工具调用。仅在所有步骤完成后返回一张截图。适用场景:多次滚动、自动输入并提交、已知的多步点击序列、来回旋转设备。
run-sequence当任何步骤依赖于前一步的结果时,不要使用
run-sequenceUse cases
适用场景
Use the sequencing when:
- Knowing that some action needs multiple steps without necessarily immediate insight of screenshot
- "scroll to bottom", "scroll to top", "scroll to do X" -> sequence scroll 3-5 times
- form interactions, "clear and retype field" -> you may use triple-tap to select all, type new value
- "submit form" → fill all fields in sequence, tap submit
- "go back to X" → defined tap sequence for the navigation
在以下情况使用序列调度:
- 已知某个操作需要多步执行,且无需立即查看截图
- “滚动到底部”、“滚动到顶部”、“滚动到目标X” → 序列执行3-5次滚动
- 表单交互,“清除并重新输入字段” → 可使用三击选中全部内容,输入新值
- “提交表单” → 按顺序填写所有字段,点击提交
- “返回至X页面” → 定义好的导航点击序列
Allowed tools inside run-sequence
run-sequencerun-sequence
中允许使用的工具
run-sequencegesture-tapgesture-swipegesture-customgesture-pinchgesture-rotatebuttonkeyboardrotateThe is shared — do not include it in each step's . Optional per step (default 100ms).
udidargsdelayMsgesture-tapgesture-swipegesture-customgesture-pinchgesture-rotatebuttonkeyboardrotateudidargsdelayMsExamples
示例
Scroll down three times:
json
{
"udid": "<UDID>",
"steps": [
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } },
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } },
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } }
]
}Type into a focused field and submit:
json
{
"udid": "<UDID>",
"steps": [
{ "tool": "keyboard", "args": { "text": "hello world" } },
{ "tool": "keyboard", "args": { "key": "enter" } }
]
}Tap a known button, then scroll down:
json
{
"udid": "<UDID>",
"steps": [
{ "tool": "gesture-tap", "args": { "x": 0.5, "y": 0.15 } },
{
"tool": "gesture-swipe",
"args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 },
"delayMs": 300
}
]
}Stops on the first error and returns partial results.
向下滚动三次:
json
{
"udid": "<UDID>",
"steps": [
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } },
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } },
{ "tool": "gesture-swipe", "args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 } }
]
}向已聚焦的字段输入文本并提交:
json
{
"udid": "<UDID>",
"steps": [
{ "tool": "keyboard", "args": { "text": "hello world" } },
{ "tool": "keyboard", "args": { "key": "enter" } }
]
}点击已知按钮,然后向下滚动:
json
{
"udid": "<UDID>",
"steps": [
{ "tool": "gesture-tap", "args": { "x": 0.5, "y": 0.15 } },
{
"tool": "gesture-swipe",
"args": { "fromX": 0.5, "fromY": 0.7, "toX": 0.5, "toY": 0.3 },
"delayMs": 300
}
]
}遇到第一个错误时停止,并返回部分结果。
9. Platform-specific notes
9. 平台特定说明
Android
Android
- Metro reachability: run on the device before the RN app starts, or Metro won't be reachable from the device. See
adb reverse tcp:8081 tcp:8081for the full workflow. Re-run if the device restarts.argent-metro-debugger - First-launch permission prompts: on Android always installs with
reinstall-appso runtime permissions are pre-granted on first launch — no flag to pass.-g - Locked screen / secure surfaces: throws a clear error if it can't capture (keyguard, DRM, Play Integrity). Unlock the device or fall back to
describe.screenshot - APK vs .app in : pass
reinstall-appabsolute path on Android;.apkdirectory on iOS..app
- Metro可达性:在RN应用启动前,在设备上运行,否则设备无法连接到Metro。完整流程请查看
adb reverse tcp:8081 tcp:8081。设备重启后需重新运行。argent-metro-debugger - 首次启动权限提示:在Android上使用时,始终会带上
reinstall-app参数,因此首次启动时会预先授予运行时权限——无需额外传递标志。-g - 锁屏/安全界面:如果无法捕获(锁屏、DRM、Play完整性),会抛出明确错误。解锁设备或回退使用
describe。screenshot - 中的APK与.app:在Android上传递.apk的绝对路径;在iOS上传递.app目录。
reinstall-app
iOS
iOS
(no iOS-only gotchas collected here yet — add them as they come up)
(目前暂无iOS专属注意事项——如有发现请补充)