pymobiledevice3 developer¶
Developer tooling for iOS devices (needs Developer Mode, and usually the DDI mounted).
Most of these commands need the Developer Disk Image (DDI) mounted on the device first (dvt needs it only on iOS < 17, core-device always does). Mount it with:
pymobiledevice3 mounter auto-mount
On iOS 17+ these services are reached through an RSD tunnel, which is set up automatically (no flag or root needed).
shell¶
Open an IPython shell connected to a developer service (for exploration/R&D).
Arguments:
| Argument | Description |
|---|---|
service |
DTX service name to open (e.g. com.apple.instruments.dtservicehub on iOS 17+). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-r, --remove-ssl-context / --keep-ssl-context |
Strip (or keep) TLS after the handshake. Default: decided automatically for the device. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
screenshot¶
Capture a PNG screenshot using the legacy screenshotr service (deprecated; prefer dvt screenshot).
Arguments:
| Argument | Description |
|---|---|
out |
Local file to write the PNG screenshot to. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt¶
Drive the Instruments (DVT) services: process control, metrics, traces and more.
On iOS < 17 these need the DeveloperDiskImage mounted (pymobiledevice3 mounter auto-mount); on iOS 17+ the required tunnel is set up automatically.
dvt proclist¶
List running processes (with PIDs, bundle ids and start times) as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt is-running-pid¶
Print whether a PID is currently running (true/false).
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID on the device (see developer dvt proclist). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt memlimitoff¶
Lift the memory (jetsam) limit of a running process; fails if the device declines.
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID on the device (see developer dvt proclist). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt applist¶
List installed applications as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt signal¶
Send a signal to a process (give either a numeric SIG or --signal-name).
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID on the device (see developer dvt proclist). [required] |
sig |
Signal number to send (e.g. 15 for SIGTERM). Mutually exclusive with --signal-name. |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-s, --signal-name <str> |
Signal name to send instead of SIG (e.g. TERM or SIGTERM). |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt kill¶
Kill a process by PID (sends SIGKILL).
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID on the device (see developer dvt proclist). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt process-id-for-bundle-id¶
Print the PID of a running app by bundle identifier (prints 0 if it is not running).
Arguments:
| Argument | Description |
|---|---|
app_bundle_identifier |
Bundle identifier of the app (e.g. com.apple.Preferences). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt pkill¶
Kill (SIGKILL) every process whose name (or bundle id, with --bundle) contains an expression.
Arguments:
| Argument | Description |
|---|---|
expressions... |
One or more process-name (or bundle id) expressions to match. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--bundle / --no-bundle |
Treat given expressions as bundle-identifiers instead of process names [default: no-bundle] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt launch¶
Launch an installed app by bundle identifier and print its PID.
Arguments:
| Argument | Description |
|---|---|
arguments |
Bundle identifier followed by optional launch arguments, as one quoted string (e.g. 'com.apple.mobilesafari -arg value'). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--kill-existing / --no-kill-existing |
Kill an already-running instance of the app before launching. [default: kill-existing] |
--suspended / --no-suspended |
Start the process suspended, waiting for a debugger to attach. [default: no-suspended] |
--env <str> |
Environment variable to pass to process given as key=value (can be specified multiple times) |
--stream / --no-stream |
Keep running and print the app's stdout/stderr until interrupted (Ctrl+C). [default: no-stream] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt shell¶
Open an IPython shell connected to the DVT service (for pymobiledevice3 R&D).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt ls¶
List a directory on the device's filesystem by absolute path.
Arguments:
| Argument | Description |
|---|---|
path |
Absolute path of the device directory to list. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-r, --recursive |
Also list every subdirectory. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt device-information¶
Print hardware, network, kernel and system information as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt netstat¶
Stream new network connections as they are detected, until interrupted (Ctrl+C).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--format <text\|json> |
Output format. 'json' emits one JSON object per line (NDJSON) on stdout. [default: text] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt screenshot¶
Take a screenshot of the device screen and save it as PNG.
Arguments:
| Argument | Description |
|---|---|
out |
Local file to write the PNG screenshot to. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt vm-regions¶
List the virtual memory regions of a debuggable (development-signed) app's process.
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID on the device (see developer dvt proclist). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt memgraph¶
Save the memory graph of a running debuggable (development-signed) app's process.
Prints the leak count and addresses as JSON. The .memgraph file can be inspected on macOS with leaks(1), heap(1) or vmmap(1). With --leaked-only, no file is written when nothing leaked.
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID on the device (see developer dvt proclist). [required] |
out |
Local .memgraph file to write. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--leaked-only |
Keep only the leaked allocations in the graph. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt dyld-metrics¶
Print the dynamic loader's launch metrics of a debuggable (development-signed) app's process.
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID on the device (see developer dvt proclist). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--at-main |
Wait for the process to reach main before capturing. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt allocations¶
Launch a debuggable (development-signed) app and record its memory allocations.
Kills an already-running instance of the app first. Records until --duration elapses or you press Ctrl+C, then prints a summary of the allocations by category.
Arguments:
| Argument | Description |
|---|---|
bundle_id |
Bundle identifier of the development-signed app to launch. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--duration <float> |
Seconds to record for. Records until interrupted by default. |
--kind <heap\|reference-counts\|vm\|zombies> |
Kind of events to record; can be repeated. Heap events by default. |
--events |
Print every event with its backtrace as a JSON line, instead of the summary. Frames are printed as image+offset. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt xcuitest¶
Launch an installed XCTest runner app and run its UI tests (e.g. WebDriverAgent).
Usage example: pymobiledevice3 developer dvt xcuitest com.facebook.WebDriverAgentRunner.xctrunner
Arguments:
| Argument | Description |
|---|---|
bundle_id |
Bundle identifier of the XCTest runner (e.g. com.apple.test.WebDriverAgentRunner.xctrunner) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--target-bundle-id <str> |
Bundle identifier of the target app (if different from runner, e.g. for testing app extensions) |
--output-log <path> |
File to write the test log to (default: the regular logger output). |
--timeout <float> |
Maximum execution time, in seconds (default: no limit). |
--env <str> |
Environment variable to pass to process given as key=value (can be specified multiple times) |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt trace-codes¶
Print the device's KDebug trace code to name table as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt name-for-uid¶
Print the user name of a numeric user ID on the device.
Arguments:
| Argument | Description |
|---|---|
uid |
Numeric user ID. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt name-for-gid¶
Print the group name of a numeric group ID on the device.
Arguments:
| Argument | Description |
|---|---|
gid |
Numeric group ID. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt oslog¶
Stream the device's unified log (os_log) until interrupted (Ctrl+C).
Includes more detail (subsystem, category, sender image) than syslog live, but is less stable.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--pid <int> |
Only show messages from this process ID. |
--format <text\|json> |
Output format. 'json' emits one JSON object per line (NDJSON) on stdout. [default: text] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt energy¶
Stream energy-usage telemetry for the given PIDs as JSON lines, until interrupted (Ctrl+C).
Arguments:
| Argument | Description |
|---|---|
pid_list... |
One or more process IDs to monitor. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt network-statistics¶
Stream network traffic for the given PIDs as JSON lines (one per PID per sample), until Ctrl+C.
Arguments:
| Argument | Description |
|---|---|
pid_list... |
One or more process IDs to monitor. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-i, --interval <int> |
Interval in milliseconds between samples [default: 1000] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt notifications¶
Stream memory and app-state notifications as JSON lines, until interrupted (Ctrl+C).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt graphics¶
Stream GPU graphics performance samples as JSON lines, until interrupted (Ctrl+C).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt fps¶
Stream the display frame rate (Core Animation FPS), one JSON line per second, until Ctrl+C.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt har¶
Enable HTTP archive (HAR) logging on the device until interrupted (Ctrl+C).
For more information, please read: https://github.com/doronz88/harlogger?tab=readme-ov-file#enable-http-instrumentation-method
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt sysmon¶
Monitor system-wide and per-process CPU, memory and other metrics (like Activity Monitor).
dvt sysmon system¶
Print a single snapshot of system-wide stats (CPU usage and other counters).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-f, --fields <str> |
Only print these system fields, separated by "," (default: all). |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt sysmon process¶
Show or monitor per-process metrics (CPU, memory, ...).
dvt sysmon process single¶
Print a single snapshot of the running processes and their metrics.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-f, --filter <str> |
Filter processes by key=value. Can be specified multiple times. |
-k, --key <str> |
Show only selected process keys for each emitted record. Can be specified multiple times. |
--human |
Format known byte-count fields such as physFootprint using human-readable units, and nanosecond fields such as cpuTotalUser as durations. |
-o, --output <path> |
Output file path for JSONL format (optional, defaults to stdout) |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt sysmon process monitor¶
Continuously stream process metrics, until interrupted (Ctrl+C) or --duration elapses.
dvt sysmon process monitor threshold¶
Continuously print processes above a cpuUsage threshold, one JSON object per line.
Arguments:
| Argument | Description |
|---|---|
threshold |
Minimum cpuUsage value to emit [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-k, --key <str> |
Show only selected process keys for each emitted record. Can be specified multiple times. |
-d, --duration <int> |
Maximum duration in milliseconds to run monitoring (optional) |
--human |
Format known byte-count fields such as physFootprint using human-readable units, and nanosecond fields such as cpuTotalUser as durations. |
-o, --output <path> |
Output file path for JSONL format (optional, defaults to stdout) |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt sysmon process monitor process¶
Continuously print one process selected by key=value filters, one JSON object per line.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-f, --filter <str> |
Filter processes by key=value. Can be specified multiple times. |
-k, --key <str> |
Show only selected process keys for each emitted record. Can be specified multiple times. |
--choose <prompt\|first\|last> |
How to resolve multiple matching processes: "prompt" asks interactively; "first" selects the oldest matching process; "last" selects the newest matching process. Automatic ordering is by startAbsTime, then pid, then name. [default: prompt] |
--keep-monitoring |
Re-apply the filters on every snapshot instead of locking onto the process selected from the first one. Snapshots where nothing matches are skipped instead of ending the command, and a relaunched process is picked up again automatically. Requires "--choose first" or "--choose last". |
-i, --interval <int> |
Minimum interval in milliseconds between outputs (optional) [default: 500] |
-d, --duration <int> |
Maximum duration in milliseconds to run monitoring (optional) |
--human |
Format known byte-count fields such as physFootprint using human-readable units, and nanosecond fields such as cpuTotalUser as durations. |
-o, --output <path> |
Output file path for JSONL format (optional, defaults to stdout) |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt core-profile-session¶
Trace kernel events (kdebug), call stacks and stackshots, like Instruments' System Trace.
dvt core-profile-session live¶
Print raw kernel trace events (kevents) in real time, until --count or Ctrl+C.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-c, --count <int> |
Number of events to print. Omit to run until interrupted (Ctrl+C). [default: -1] |
--bsc / --no-bsc |
Add the BSD system call (BSC) subclass to the subclass filter. [default: no-bsc] |
-cf, --class-filters <based_int> |
Events class filter. Omit for all. Can be specified multiple times. |
-sf, --subclass-filters <based_int> |
Events subclass filter. Omit for all. Can be specified multiple times. |
--tid <int> |
Thread ID to filter. Omit for all. |
--timestamp / --no-timestamp |
Whether to print timestamp or not. [default: timestamp] |
--event-name / --no-event-name |
Whether to print event name or not. [default: event-name] |
--func-qual / --no-func-qual |
Whether to print function qualifier or not. [default: func-qual] |
--show-tid / --no-show-tid |
Whether to print thread ID or not. [default: show-tid] |
--process-name / --no-process-name |
Whether to print process name or not. [default: process-name] |
--args / --no-args |
Whether to print event arguments or not. [default: args] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt core-profile-session save¶
Record raw kdebug trace data to a file, until interrupted (Ctrl+C).
Arguments:
| Argument | Description |
|---|---|
out |
Local file to write the raw kdebug trace to. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--bsc / --no-bsc |
Add the BSD system call (BSC) subclass to the subclass filter. [default: no-bsc] |
-cf, --class-filters <based_int> |
Events class filter. Omit for all. Can be specified multiple times. |
-sf, --subclass-filters <based_int> |
Events subclass filter. Omit for all. Can be specified multiple times. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt core-profile-session stackshot¶
Print the call stacks of all threads of all processes.
The call stacks are symbolicated using the Xcode device support of the device, which
developer fetch-symbols download creates. Kernel frames are symbolicated when given
--kernelcache and --kernel-signatures.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--out <path> |
Write the raw stackshot as JSON into this file instead of printing it. |
--json |
Print the raw stackshot as JSON instead of the call stacks. |
--process <str> |
Process ID / name to filter. Omit for all. |
--symbols <directory> |
Directory of symbols to use (as created by developer fetch-symbols download), instead of the Xcode device support of the device. |
--kernelcache <file> |
Kernelcache of the firmware the device runs (as found in its IPSW), to name the kernel images of kernel frames. Requires ipsw unless it is already decompressed. |
--kernel-signatures <directory> |
Directory of ipsw kernel symbolication signatures (the kernel directory of https://github.com/blacktop/symbolicator), to symbolicate kernel frames of --kernelcache. Requires ipsw. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt core-profile-session parse-live¶
Print traces (syscalls, thread events, etc.) received from the device in real time.
The selections add up. The device filters by subclass at best, so the events not selected are dropped right
after decoding, which keeps up with the device even over --userspace. events with the same options lists the
events that are printed.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-c, --count <int> |
Number of events to print. Omit to run until interrupted (Ctrl+C). |
--bsc / --no-bsc |
Add the BSD system call (BSC) subclass to the subclass filter. [default: no-bsc] |
-cf, --class-filters <based_int> |
Events class filter. Omit for all. Can be specified multiple times. |
-sf, --subclass-filters <based_int> |
Events subclass filter. Omit for all. Can be specified multiple times. |
--tid <int> |
Thread ID to filter. Omit for all. |
--show-tid / --no-show-tid |
Whether to print thread ID or not. [default: no-show-tid] |
--process <str> |
Process ID / name to filter. Omit for all. |
-s, --syscall <str> |
This syscall (e.g. open, openat; with its _nocancel and _dprotected_np variants), with its paths. Can be specified multiple times. |
-e, --event <str> |
This event, by its trace code name (e.g. DBG_DYLD_TIMING_DLSYM; events TEXT finds the name). Can be specified multiple times. |
--fs |
The syscalls that take a path. |
--net |
The socket syscalls. |
--proc |
The process lifecycle syscalls. |
--io |
The syscalls on file descriptors: read, write, ... |
--mem |
The memory mapping syscalls and Mach traps. |
--signal |
The signal syscalls. |
--cred |
Credential, code signing and policy checks, and access to other tasks. |
--sync |
Locks, condition variables, kqueues and workqueues. |
--mach |
The Mach traps. |
--dyld |
dyld events (image loads, dlopen, dlsym, ...), filtered on the device. |
--xpc |
libxpc events: messages sent and received, replies, transactions. |
--dispatch |
libdispatch events: Mach messages received through dispatch, queue misuse. |
--runloop |
CoreFoundation run loop events: iterations, waits, sources, timers, observers and blocks. |
-m, --match <str> |
Only print the traces containing this text, highlighted (repeatable; all must match). |
-v, --invert-match <str> |
Only print the traces not containing this text (repeatable; any match excludes). |
-mi, --match-insensitive <str> |
Like --match, ignoring case. |
-vi, --invert-match-insensitive <str> |
Like --invert-match, ignoring case. |
-r, --regex <str> |
Only print the traces matching this regex, highlighted (repeatable; any match includes). |
-ri, --insensitive-regex <str> |
Like --regex, ignoring case. |
--json |
Print each trace as a JSON object, one per line: its time, thread, process, event name, parsed fields and text. The filters match the line it would print. |
--color-mode <fast\|rich> |
Trace color style: 'rich' also colors the event by what it shows (call, strings, numbers, errors, ...), 'fast' colors only the columns. [default: rich] |
--skip-behind / --no-skip-behind |
Skip ahead to recent events whenever output falls more than --max-lag behind the device, instead of failing. Without class/subclass filters the device can emit events faster than they can be parsed. [default: no-skip-behind] |
--max-lag <float> |
How far (in seconds) output may fall behind the device before it skips ahead (--skip-behind) or fails (--no-skip-behind). [default: 2.0] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt core-profile-session events¶
List the events parse-live prints with the same options (e.g. events --fs, events -s open), or every event
name parse-live --event accepts.
Arguments:
| Argument | Description |
|---|---|
pattern |
Only list the names containing this text, ignoring case (e.g. dlsym). |
Options:
| Option | Description |
|---|---|
--bsc / --no-bsc |
Add the BSD system call (BSC) subclass to the subclass filter. [default: no-bsc] |
-cf, --class-filters <based_int> |
Events class filter. Omit for all. Can be specified multiple times. |
-sf, --subclass-filters <based_int> |
Events subclass filter. Omit for all. Can be specified multiple times. |
-s, --syscall <str> |
This syscall (e.g. open, openat; with its _nocancel and _dprotected_np variants), with its paths. Can be specified multiple times. |
-e, --event <str> |
This event, by its trace code name (e.g. DBG_DYLD_TIMING_DLSYM; events TEXT finds the name). Can be specified multiple times. |
--fs |
The syscalls that take a path. |
--net |
The socket syscalls. |
--proc |
The process lifecycle syscalls. |
--io |
The syscalls on file descriptors: read, write, ... |
--mem |
The memory mapping syscalls and Mach traps. |
--signal |
The signal syscalls. |
--cred |
Credential, code signing and policy checks, and access to other tasks. |
--sync |
Locks, condition variables, kqueues and workqueues. |
--mach |
The Mach traps. |
--dyld |
dyld events (image loads, dlopen, dlsym, ...), filtered on the device. |
--xpc |
libxpc events: messages sent and received, replies, transactions. |
--dispatch |
libdispatch events: Mach messages received through dispatch, queue misuse. |
--runloop |
CoreFoundation run loop events: iterations, waits, sources, timers, observers and blocks. |
dvt core-profile-session callstacks-live¶
Print sampled call stacks in real time, until --count or Ctrl+C.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-c, --count <int> |
Number of events to print. Omit to run until interrupted (Ctrl+C). |
--process <str> |
Process ID / name to filter. Omit for all. |
--tid <int> |
Thread ID to filter. Omit for all. |
--show-tid / --no-show-tid |
Whether to print thread ID or not. [default: no-show-tid] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt simulate-location¶
Simulate the device's GPS location through DVT (use this one on iOS 17 and newer).
dvt simulate-location clear¶
Clear the currently simulated location on iOS 17 and newer.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt simulate-location set¶
Simulate a fixed location, keeping the session open until interrupted (Ctrl+C).
For example: ... set -- 40.690008 -74.045843 for liberty island
Arguments:
| Argument | Description |
|---|---|
latitude |
Latitude in decimal degrees. [required] |
longitude |
Longitude in decimal degrees (put -- before negative values). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt simulate-location play¶
Replay a GPX route at its recorded pace, then wait until interrupted (Ctrl+C).
Arguments:
| Argument | Description |
|---|---|
filename |
GPX file with the route to replay. [required] |
timing_randomness_range |
Random jitter, in milliseconds (+/-), added to each wait between points. [default: 0] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--disable-sleep / --no-disable-sleep |
Jump through the points without waiting the time between their timestamps. [default: no-disable-sleep] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt condition¶
Simulate device conditions (e.g. slow network, thermal state) via DVT.
dvt condition list¶
List the available condition groups and their profile identifiers as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt condition clear¶
Disable the currently active induced condition, returning the device to normal.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
dvt condition set¶
Activate a condition profile, then wait until interrupted (Ctrl+C).
Replaces any previously active condition. Use developer dvt condition clear to disable it.
Arguments:
| Argument | Description |
|---|---|
profile_identifier |
Profile identifier to activate (see developer dvt condition list). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
fetch-symbols¶
Download the device's dyld shared cache (DSC) and dyld, for symbolicating crashes and traces.
fetch-symbols list¶
List the symbol files the device offers for download.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
fetch-symbols download¶
Download the device's symbols, by default into its Xcode DeviceSupport directory.
This command downloads symbol data. Optionally, the user can specify an output directory where the data will be stored. If no output directory is provided, the symbols will be downloaded into the Xcode directory directly (DeviceSupport).
Symbols which were already downloaded are kept, unless --force is given.
Arguments:
| Argument | Description |
|---|---|
out |
Directory to download into (default: this device's Xcode DeviceSupport directory). |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--force |
Download the symbols again even if they were already downloaded. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
simulate-location¶
Simulate GPS location on iOS versions below 17 (set, clear, or replay GPX routes).
simulate-location clear¶
Stop location simulation and resume real GPS on iOS versions below 17.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
simulate-location set¶
Set a fixed simulated location on iOS versions below 17 (stays until clear).
Example: set -- 40.690008 -74.045843 (Liberty Island).
Arguments:
| Argument | Description |
|---|---|
latitude |
Latitude in decimal degrees. [required] |
longitude |
Longitude in decimal degrees (put -- before negative values). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
simulate-location play¶
Replay a GPX route on iOS versions below 17; optionally disable sleeps and add timing jitter.
Arguments:
| Argument | Description |
|---|---|
filename |
GPX file with the route to replay. [required] |
timing_randomness_range |
Random jitter, in milliseconds (+/-), added to each wait between points (0 for none). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--disable-sleep / --no-disable-sleep |
Jump through the points without waiting the time between their timestamps. [default: no-disable-sleep] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility¶
Run accessibility audits, inspect on-screen elements and change accessibility settings.
accessibility run-audit¶
Run accessibility audits on the foreground app and print the issues found as JSON.
Arguments:
| Argument | Description |
|---|---|
test_types... |
One or more audit types to run (see supported-audit-types). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility supported-audit-types¶
List the accessibility audit types this device supports.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility capabilities¶
Print the device's accessibility inspector capabilities as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility shell¶
Open an IPython shell connected to the accessibility audit service (for R&D).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility notifications¶
Stream accessibility focus and app-state changes as they happen, until interrupted (Ctrl+C).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--format <text\|json> |
Output format. 'json' emits one JSON object per line (NDJSON) on stdout. [default: text] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility list-items¶
List the accessibility elements of the foreground app by moving the inspector focus through them.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility element-attributes¶
Move the accessibility inspector focus and read attributes (label, identifier, value, ...) of the focused element.
Arguments:
| Argument | Description |
|---|---|
attributes... |
Attribute names to read (default: Label, Identifier, Value). |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--direction <first\|next\|previous\|last> |
How to move the inspector focus before reading the newly focused element. [default: next] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility settings¶
Show, change or reset the device's accessibility settings.
accessibility settings show¶
Show the current accessibility settings and their values.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility settings set¶
Change an accessibility setting on the device, then wait until interrupted (Ctrl+C).
To list the available settings use the "show" command.
Arguments:
| Argument | Description |
|---|---|
setting |
Setting key to change (see the show command). [required] |
value |
New value as a Python literal (e.g. True, False, 0.5). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
accessibility settings reset¶
Reset all accessibility settings to their device defaults.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
debugserver¶
Debug apps with LLDB through the device's debugserver.
debugserver applist¶
Print the apps debugserver can launch or attach to, as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
debugserver start-server¶
Start debugserver and print the LLDB connect string.
- For iOS < 17, you must forward to a local port (--local-port). - For iOS >= 17 without --local-port, the device's tunnel address is printed; that needs a kernel-routable tunnel (e.g. --tunnel), so with the default userspace tunnel use --local-port. Connect quickly with your own LLDB client using the printed steps.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--local-port <int> |
Forward debugserver to this local port and keep running until interrupted (Ctrl+C). |
--host <str> |
Address to bind the local port to. [default: 127.0.0.1] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
debugserver lldb¶
Automate lldb launch for a given xcodeproj, IPA, or installed bundle identifier (iOS 17+).
This will: - Build the given xcodeproj (if provided) - Extract the given IPA (if provided) - Install it (for xcodeproj/IPA inputs) - Start a debugserver attached to it - Place breakpoints if given any - Launch the application if requested - Execute any additional commands if requested - Switch to lldb shell
Arguments:
| Argument | Description |
|---|---|
project_or_ipa_or_bundle_id |
Path to .xcodeproj/.ipa or an installed app bundle identifier [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--configuration <str> |
Build configuration to invoke (e.g., Debug or Release). [default: Debug] |
--lldb-command <str> |
Path to the lldb executable to run. [default: lldb] |
--launch / --no-launch |
Automatically launch the app after attaching. [default: no-launch] |
-b, --break <str> |
Add multiple startup breakpoints |
-c, --command <str> |
Additional commands to run at startup |
Accepts the connection options: --rsd, --tunnel, --userspace.
arbitration¶
Mark/unmark a device as "in-use" to avoid conflicts with other tools.
arbitration version¶
Show arbitration protocol version.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
arbitration check-in¶
Check in as the device's owner (marks it as in-use), then wait until interrupted (Ctrl+C).
Fails if another host has it checked in, unless --force is given. Use check-out to release it.
Arguments:
| Argument | Description |
|---|---|
hostname |
Name to claim the device under (shown to other tools). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
-f, --force |
Take the device even if another host has it checked in. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
arbitration check-out¶
Release ownership and allow other tools to use the device.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
core-device¶
Use the CoreDevice services Xcode uses (files, apps, processes, screen, input, diagnostics).
Needs iOS 17+ and the Developer Disk Image mounted (pymobiledevice3 mounter auto-mount). The required tunnel is set up automatically.
core-device list-directory¶
List the contents of a directory in a file domain, as JSON.
pymobiledevice3 developer core-device list-directory [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device read-file¶
Read a file from a file domain to stdout or --output.
pymobiledevice3 developer core-device read-file [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
-o, --output <path> |
Local file to write the contents to (default: print to stdout). |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device propose-empty-file¶
Create an empty file in a file domain with custom permissions, owner and timestamps.
pymobiledevice3 developer core-device propose-empty-file [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
--file-permissions <int> |
Permission bits of the new file, as a decimal number (default 420 = 0o644). [default: 420] |
--uid <int> |
Owner user ID (501 = mobile). [default: 501] |
--gid <int> |
Owner group ID (501 = mobile). [default: 501] |
--creation-time <int> |
Creation time, in seconds since the epoch (default: now). |
--last-modification-time <int> |
Last modification time, in seconds since the epoch (default: now). |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device create-directory¶
Create a directory at the given domain/path.
pymobiledevice3 developer core-device create-directory [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device remove-directory¶
Remove an empty directory at the given domain/path.
pymobiledevice3 developer core-device remove-directory [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device remove-file¶
Remove a file or symbolic link at the given domain/path.
pymobiledevice3 developer core-device remove-file [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device rename¶
Rename or move an item within a domain.
pymobiledevice3 developer core-device rename [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {old_path} {new_path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
old_path |
Current path, relative to the domain's root. [required] |
new_path |
New path, relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device create-symlink¶
Create a symbolic link at the given domain/path.
pymobiledevice3 developer core-device create-symlink [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path} {target}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
target |
What the link points to; stored as given [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device stat¶
Show the attributes of an item at the given domain/path.
pymobiledevice3 developer core-device stat [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
--follow-symlinks / --no-follow-symlinks |
Report on a link's target rather than the link [default: follow-symlinks] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device write-file¶
Create or replace a file at the given domain/path with a local file's contents.
pymobiledevice3 developer core-device write-file [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> {path} {local_file}
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
path |
Path relative to the domain's root. [required] |
local_file |
Local file to upload. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device watch¶
Print file changes under a domain as they happen, one JSON record per change, until Ctrl+C (iOS 27+).
pymobiledevice3 developer core-device watch [OPTIONS] {domain}:<appDataContainer|appGroupDataContainer|temporary|systemCrashLogs> [paths]...
Arguments:
| Argument | Description |
|---|---|
domain:<appDataContainer\|appGroupDataContainer\|temporary\|systemCrashLogs> |
File domain: an app's data container, an app group container (both need --identifier), the temporary directory or the system crash logs. [required] |
paths... |
Paths to watch, relative to the domain's root (default: all of it) |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--identifier <str> |
App or app group identifier, for the container domains |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device launch-application¶
Launch an installed app and print the launch result as JSON (or its console, with --console).
pymobiledevice3 developer core-device launch-application [OPTIONS] {bundle_identifier} [argument]...
Arguments:
| Argument | Description |
|---|---|
bundle_identifier |
Bundle identifier of the app to launch. [required] |
argument... |
Arguments to pass to the app |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--kill-existing / --no-kill-existing |
Kill an already-running instance of the app before launching. [default: kill-existing] |
--suspended / --no-suspended |
Start the process suspended, waiting for a debugger to attach. [default: no-suspended] |
--env <str> |
Environment variable to pass to process given as key=value (can be specified multiple times) |
--console / --no-console |
Attach to the app's stdout and stderr and print them until it exits [default: no-console] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device list-processes¶
List running processes as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device uninstall¶
Uninstall an app by bundle identifier.
Arguments:
| Argument | Description |
|---|---|
bundle_identifier |
Bundle identifier of the app to uninstall. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device send-signal-to-process¶
Send a signal (e.g. to terminate) to a process by PID and print the reply as JSON.
Arguments:
| Argument | Description |
|---|---|
pid |
Process ID (see list-processes). [required] |
signal |
Signal number to send (e.g. 9 for SIGKILL, 15 for SIGTERM). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device get-device-info¶
Print CoreDevice device information as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device get-display-info¶
Print the device's displays and their modes as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device query-mobilegestalt¶
Query MobileGestalt (the device's hardware/software property store) for the given keys.
Arguments:
| Argument | Description |
|---|---|
key... |
One or more MobileGestalt keys (e.g. ProductType). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device get-lockstate¶
Print the device's lock state as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device paste¶
Paste device pasteboard contents to stdout (text by default, --raw for the full snapshot).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--raw |
Print the full snapshot JSON instead of UTF-8 text. |
--pasteboard <str> |
Named pasteboard to read from. [default: general] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device copy¶
Copy text onto the device pasteboard (UTF-8). Reads from stdin if no argument is given.
Arguments:
| Argument | Description |
|---|---|
text |
Text to copy. If omitted, read UTF-8 from stdin. |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--pasteboard <str> |
Named pasteboard to write to. [default: general] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device rotate¶
Rotate the device 90 degrees. Four consecutive 'left' calls cycle a full turn.
Arguments:
| Argument | Description |
|---|---|
direction:<left\|right> |
Rotate 90 degrees: 'left' = CCW, 'right' = CW. [default: left] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device user-interface-style¶
Print the user-interface style (dark/light mode); pass dark/light to change it.
Arguments:
| Argument | Description |
|---|---|
style:<dark\|light> |
Style to switch to; omit to print the current one. |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device list-apps¶
List installed applications as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device fetch-app-icon¶
Save an application's icon as a PNG file (com.apple.coredevice.iconservice).
Arguments:
| Argument | Description |
|---|---|
bundle_identifier |
Bundle identifier of the app. [required] |
output |
Local PNG file to write. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--width <float> |
Requested width, in points. [default: 60.0] |
--height <float> |
Requested height, in points. [default: 60.0] |
--scale <float> |
Scale factor (pixels = points x scale). [default: 2.0] |
--no-placeholder |
Fail instead of returning a generic icon for apps without one. |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device stream-processes¶
Fetch the running process list through the streaming API and print it as JSON.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device sysdiagnose¶
Generate a sysdiagnose archive on the device and download it (can take several minutes).
The archive is downloaded over usbmux when usbmuxd lists the device (much faster), and through the RSD tunnel otherwise.
Arguments:
| Argument | Description |
|---|---|
output |
Existing directory to save the archive into, or a file path to write it to. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device screen-capture¶
Capture content from the device's screen (com.apple.coredevice.screencaptureservice).
core-device screen-capture screenshot¶
Capture a PNG screenshot of the device's screen.
Arguments:
| Argument | Description |
|---|---|
output |
Local PNG file to write. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--display-unique-id <str> |
Display to capture (default: the primary display). |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device hid¶
Send HID button events (com.apple.coredevice.hid.indigo).
core-device hid button¶
Press a named iOS hardware button (home / lock / volume-up / etc.).
pymobiledevice3 developer core-device hid button [OPTIONS] {name}:<home|lock|volume-up|volume-down|mute|siri> [state]:<press|down|up|canceled>
Arguments:
| Argument | Description |
|---|---|
name:<home\|lock\|volume-up\|volume-down\|mute\|siri> |
Named hardware button (home, lock, volume-up, ...) [required] |
state:<press\|down\|up\|canceled> |
press = send down+up; otherwise send a single state event [default: press] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device hid raw-button¶
Send a HID button event by raw usage page/code (for buttons not in the named list).
pymobiledevice3 developer core-device hid raw-button [OPTIONS] {usage_page} {usage_code} [state]:<press|down|up|canceled>
Arguments:
| Argument | Description |
|---|---|
usage_page |
HID usage page (decimal or 0xHEX), e.g. 0x0C for Consumer [required] |
usage_code |
HID usage code (decimal or 0xHEX) [required] |
state:<press\|down\|up\|canceled> |
press = send down+up; otherwise send a single state event [default: press] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service¶
Send touch, gesture and keyboard input to the device (com.apple.coredevice.hid.universalhidservice).
core-device universal-hid-service list-connected¶
List currently connected virtual HID services.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service send-report¶
Send a raw HID report to a connected HID surface.
Use list-connected to discover ServiceIDs. Touch goes via 257
(mainTouchscreen, true digitizer) or 1281 (touchscreenGesture, trackpad-like
pointer). Report bytes are surface-specific — capture devicectl traffic with
misc/remotexpc_sniffer.py to learn the layout.
pymobiledevice3 developer core-device universal-hid-service send-report [OPTIONS] {service_id} {report_hex}
Arguments:
| Argument | Description |
|---|---|
service_id |
Target _ServiceID (from list-connected; decimal or 0xHEX) [required] |
report_hex |
Raw HID report bytes as hex (first byte is the report ID) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service tap¶
Tap at (X, Y) — one mainTouchscreen CONTACT + RELEASE pair.
X/Y are 0..65535 normalised across the device's screen — see the
coordinate-system comment at the top of this section, or
developer core-device get-display-info for pixel dimensions.
Auto-opens a media stream so the touch reaches UIKit.
Arguments:
| Argument | Description |
|---|---|
x |
X (0..65535, 0=left, 65535=right) [required] |
y |
Y (0..65535, 0=top, 65535=bottom) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--touch-service-id <str> |
mainTouchscreen _ServiceID [default: 257] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service drag¶
Drag from (X1, Y1) to (X2, Y2) — streaming CONTACT reports, then RELEASE.
X/Y are 0..65535 normalised across the device's screen. Use
developer core-device get-display-info to look up the device's
pixel dimensions if you need to convert from pixel coordinates.
Arguments:
| Argument | Description |
|---|---|
x1 |
Start X (0..65535, screen-normalised) [required] |
y1 |
Start Y (0..65535, screen-normalised) [required] |
x2 |
End X (0..65535) [required] |
y2 |
End Y (0..65535) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--steps <int> |
Interpolated frames [default: 30] |
--duration <float> |
Drag time, seconds [default: 0.6] |
--touch-service-id <str> |
mainTouchscreen _ServiceID [default: 257] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service multi-tap¶
Tap with several fingers at once — e.g. multi-tap -- 25000 32768 40000 32768 is a two-finger tap.
Arguments:
| Argument | Description |
|---|---|
coordinates... |
X Y per finger (1..5 fingers, 0..65535 each) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--hold <float> |
Seconds the fingers stay down [default: 0.05] |
--touch-service-id <str> |
mainTouchscreen _ServiceID [default: 257] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service multi-drag¶
Drag several fingers together, each from its (X1, Y1) to its (X2, Y2).
Fingers moving apart zoom in, towards each other pinch, in parallel make a multi-finger swipe. E.g. zoom in around the center::
multi-drag -- 28000 32768 12000 32768 37536 32768 53536 32768
Arguments:
| Argument | Description |
|---|---|
coordinates... |
X1 Y1 X2 Y2 (start, end) per finger (1..5 fingers, 0..65535 each) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--steps <int> |
Interpolated frames [default: 30] |
--duration <float> |
Drag time, seconds [default: 0.6] |
--touch-service-id <str> |
mainTouchscreen _ServiceID [default: 257] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service swipe¶
Pure pointer-motion gesture — moves the cursor without a contact event.
Arguments:
| Argument | Description |
|---|---|
x1 |
Start X of the pointer path (gesture-surface units, Int32) [required] |
y1 |
Start Y of the pointer path (gesture-surface units, Int32) [required] |
x2 |
End X of the pointer path (gesture-surface units, Int32) [required] |
y2 |
End Y of the pointer path (gesture-surface units, Int32) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--steps <int> |
Interpolated frames [default: 30] |
--duration <float> |
Swipe time, seconds [default: 0.3] |
--service-id <str> |
Gesture surface _ServiceID; default 1281 = touchscreenGesture [default: 1281] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service session¶
Run a sequence of gestures inside ONE auth-gated media stream.
Avoids stream-churn timeouts when firing many tap/drag calls back-to-back — the stream is opened once for the whole batch.
Recognised commands (whitespace-separated; # and blank lines ignored)::
tap X Y # CONTACT + RELEASE
drag X1 Y1 X2 Y2 [STEPS [DURATION]] # continuous contact with motion
swipe X1 Y1 X2 Y2 [STEPS [DURATION]] # pure pointer motion (no contact)
move X Y # one gesture-surface sample
sleep SECONDS
Example::
printf 'tap 30000 40000\nsleep 0.3\ndrag 30000 8000 30000 60000\n' | \
pymobiledevice3 developer core-device universal-hid-service session
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--script <path> |
Read gesture lines from this file (default: stdin) |
--gesture-service-id <str> |
Gesture surface _ServiceID (for move/swipe) [default: 1281] |
--touch-service-id <str> |
mainTouchscreen _ServiceID (for tap/drag) [default: 257] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service type¶
Type TEXT on the device via a host-registered virtual keyboard.
Auto-opens a media stream (the dtuhidd auth gate) and registers a
virtual keyboard surface, then emits one down/up HID Keyboard
report pair per character. Capital letters and shifted symbols
synthesise the matching Left-Shift bit in the bitmap.
Arguments:
| Argument | Description |
|---|---|
text |
Text to type (printable ASCII; a newline presses Return and a tab presses Tab) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--char-delay <float> |
Seconds between key down and key up [default: 0.04] |
--inter-delay <float> |
Seconds between characters [default: 0.02] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device universal-hid-service key¶
Press a named key COUNT times on the device via the same virtual keyboard as type.
pymobiledevice3 developer core-device universal-hid-service key [OPTIONS] {name}:<backspace|enter|escape|tab|left|right|up|down>
Arguments:
| Argument | Description |
|---|---|
name:<backspace\|enter\|escape\|tab\|left\|right\|up\|down> |
Named key (backspace, enter, left, ...) [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--count <int range> |
How many times to press it [default: 1; x>=1] |
--char-delay <float> |
Seconds between key down and key up [default: 0.04] |
--inter-delay <float> |
Seconds between presses [default: 0.02] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device display¶
Stream and mirror the device's screen and audio (com.apple.coredevice.displayservice).
core-device display get-media-support-info¶
Return the device's supported media-stream features and AVC framework version.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device display get-media-stream-server-status¶
Return the media-stream server's running state and active sessions.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device display start-video-stream¶
Capture raw RTP/HEVC packets from a display into a file (iOS 27+).
Each packet is written as [4-byte BE length][packet bytes]. Use
misc/rtp_dump.py to depacketize into an Annex-B .h265 bitstream.
Arguments:
| Argument | Description |
|---|---|
output |
Write received RTP packet bytes to this file [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--display-id <int> |
Display to stream (1 = the main display). [default: 1] |
--duration <float> |
Seconds to capture [default: 5.0] |
--port <int> |
Local UDP port to receive the stream on (0 = any free port). [default: 0] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device display start-audio-stream¶
Capture raw RTP audio packets from the device's system-audio output.
Each packet is written as [4-byte BE length][packet bytes]. The
device advertises RxPayloadType=101 and AudioStreamMode=8 —
inspect the captured payloads to identify the codec before building
browser playback.
Arguments:
| Argument | Description |
|---|---|
output |
Write received RTP packet bytes to this file [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--duration <float> |
Seconds to capture [default: 10.0] |
--port <int> |
Local UDP port to receive the stream on (0 = any free port). [default: 0] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device display serve-web¶
Serve the device's screen via HTTP — view in any modern browser (iOS 27+), until Ctrl+C.
Pipeline (no external executables):
device → asyncio UDP receive → RFC 7798 RTP/HEVC depacketize
→ HTTP chunked stream → browser WebCodecs decoder → canvas
Open http://<bind>:<http_port>/ in Safari or Chrome (macOS Chrome needs
HEVC support — recent versions enable it by default if the OS supports it).
Pass --https when connecting from another LAN host (browsers gate
WebCodecs on a secure context; only loopback origins bypass that).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--display-id <int> |
Display to stream (1 = the main display). [default: 1] |
--bind <str> |
Host to bind the webserver on. Loopback by default; --bind 0.0.0.0 makes the viewer reachable from the LAN (set --password too). [default: 127.0.0.1] |
--http-port <int> |
Port for the webserver [default: 8080] |
--password <str> |
Require this password from every viewer. Without one, anyone who can reach the port can watch and control the device, so only bind beyond loopback with a password set. |
--no-audio |
Don't auto-enable sound in the viewer (user can still click Enable Sound). |
--ltrp |
Opt into LTRP (long-term reference pictures). LEAVE OFF for browser viewing. LTRP lowers the encoder's QP under motion (sharper bitstream — ffmpeg decodes it cleanly), BUT the browsers' real-time VideoToolbox/WebCodecs decoder mishandles the long-term references and renders a mosaic of displaced blocks during rapid motion. Verified on-device: identical hard swipes are clean with LTRP off and tear with it on, while the same captured bitstream is clean in ffmpeg either way — i.e. the tear is a live-decode artifact, not in the stream. The encoder QP win (≈19 vs ≈23-31) is not worth the mosaic. |
--rtcp-fb |
Negotiate allowRTCPFB=True in the mediaBlob. No observable effect in streamConfig but may influence internal encoder behaviour. |
--https |
Serve over HTTPS using an ephemeral self-signed certificate. Required for WebCodecs when accessing the viewer from a non-loopback origin: the browser's secure-context policy refuses WebCodecs over plain http:// from any LAN IP. The browser will warn on first visit -- accept the cert and the viewer works normally afterwards. |
--rctl / --no-rctl |
Run the AVConference RCTL receiver-feedback loop (RTCP APP + per-frame receipts), reversed byte-exact from Xcode's mirror -- the closed-loop rate control Xcode uses. OFF by default: it does NOT prevent the motion resolution-collapse (that's a device encoder decision at the ~6 Mbps cap), and a wrong OWRD or non-per-frame receipt makes the device throttle framerate. Kept as the correct closed-loop base for further research. [default: no-rctl] |
--motion-idr / --no-motion-idr |
Force a keyframe ~1x/second WHILE the screen is moving (ON by default). Under rapid motion the device drops capture resolution into a top-left corner of the frame ('screen shrinks while swiping'); these keyframes snap it back to full resolution fast, and the viewer stretches the shrunk region to fill the canvas so the brief window is hidden. Trade-off: the keyframe pressure can stall the ~6 Mbps-capped encoder under sustained motion. --no-motion-idr drops it for a stall-free but slower-recovering stream (relies on the viewer stretch + settle keyframe alone). NOTE: combining --motion-idr with --rctl throttles fps hard -- the default keeps RCTL off so the IDR stays fast. [default: motion-idr] |
--compensate / --no-compensate |
Viewer-side resolution-collapse compensation (ON by default). When the device shrinks the captured screen into the top-left corner + gray padding under motion, the browser detects that content rectangle per frame and stretches it back to fill the canvas, turning the hard corner-shrink into a softer momentary resolution dip. --no-compensate shows the raw device output (useful for seeing the collapse / research). [default: compensate] |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device display serve-vnc¶
Serve the device's screen as a VNC (RFB 3.8) server (iOS 27+), until Ctrl+C.
Connect from any VNC client. macOS Finder: Cmd+K -> enter
vnc://<bind>:<port> (default vnc://127.0.0.1:5901; port
5900 is owned by macOS's own Screen Sharing daemon). No browser
involved -- the OS's native screen-sharing renders the framebuffer
directly.
Pipeline: device HEVC -> VideoToolbox (macOS) or libav (cross-platform) decode (BGRA output) -> RFB Raw framebuffer updates. No JPEG round-trip; the bytes that came out of the decoder go straight onto the wire. Mouse clicks in the screen-sharing window translate to HID touch events on the device.
Audio: pass --audio to decode the device's AAC-ELD audio
stream and play it through the host Mac's speakers (RFB has no
audio of its own, so the playback is host-local).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--display-id <int> |
Display to stream (1 = the main display). [default: 1] |
--bind <str> |
Host to bind the VNC listener on. Loopback by default; --bind 0.0.0.0 lets the LAN connect (set --password too). [default: 127.0.0.1] |
--port <int> |
TCP port for the VNC listener [default: 5901] |
--password <str> |
Require this password from every viewer. Without one, anyone who can reach the port can watch and control the device, so only bind beyond loopback with a password set. |
--audio |
Play device audio out the host Mac's speakers (off by default). |
--decoder <str> |
HEVC decoder: 'auto' (VideoToolbox on macOS, libav elsewhere), 'vt' (force VideoToolbox -- macOS only), or 'av' (force libav / PyAV). Forcing 'av' on macOS comes with audio choppiness from GIL contention. [default: auto] |
--ltrp |
Opt back into LTRP (off by default; see serve-web for context). |
--share-clipboard |
Share the clipboard with VNC clients: text copied on the device reaches the client's clipboard and vice versa. UTF-8 with clients that support the Extended Clipboard pseudo-encoding (e.g. TigerVNC, noVNC), Latin-1 otherwise. |
--rtcp-fb |
Negotiate allowRTCPFB=True in the mediaBlob (experimental). |
Accepts the connection options: --rsd, --tunnel, --userspace.
core-device location¶
Simulate the device's location (com.apple.coredevice.locationservice).
core-device location available-scenarios¶
List the device's built-in simulation scenarios.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
Accepts the connection options: --rsd, --tunnel, --userspace.
wda¶
Drive the device UI through WebDriverAgent (launch apps, tap, type, swipe, screenshots).
WebDriverAgent must already be installed on the device. Start its runner with --xctrunner, or have it running already; with --xctrunner it is stopped when the command ends.
wda launch¶
Launch an app by starting a WDA session and print the session id.
Arguments:
| Argument | Description |
|---|---|
bundle_id |
Bundle identifier of the app to launch. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda tap¶
Tap an element (typically a button) using a WDA selector.
Arguments:
| Argument | Description |
|---|---|
selector |
Element to tap, matched using the --using strategy. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-u, --using <str> |
Element lookup strategy (e.g. 'accessibility id', 'name', 'label', 'xpath'). [default: accessibility id] |
-s, --session-id <str> |
Existing WDA session id (omit to create a new session). |
--bundle-id <str> |
Bundle id to launch if a new session is created. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda press¶
Press one or more device buttons (e.g. home, volumeup, volumedown, lock).
Arguments:
| Argument | Description |
|---|---|
names... |
One or more device buttons to press in order (e.g. home lock volumeup). [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-s, --session-id <str> |
Existing WDA session id (optional; some servers require it). |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda unlock¶
Unlock the device through WDA's unlock endpoint.
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-s, --session-id <str> |
Existing WDA session id (optional; used for session-scoped unlock endpoints). |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda list-items¶
Show tappable WDA elements (use with 'tap' selectors).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-s, --session-id <str> |
Existing WDA session id (optional). |
--hittable-only |
Show only elements marked hittable by WDA. |
--clickable |
Filter by a clickable type allowlist + visible/enabled. |
--types <str> |
Comma-separated element type allowlist (e.g. Icon,Button,Cell). |
--with-rect |
Include element bounds (x,y,width,height) if present. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda screenshot¶
Take a screenshot via WDA and save it as PNG.
Arguments:
| Argument | Description |
|---|---|
out |
Local file to write the PNG screenshot to. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-s, --session-id <str> |
Existing WDA session id (optional). |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda status¶
Show the WDA server status as JSON (useful to check that WDA is reachable).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda type¶
Type text into the focused element.
Arguments:
| Argument | Description |
|---|---|
text |
Text to type into the focused element. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-s, --session-id <str> |
Existing WDA session id (omit to create a new session). |
--bundle-id <str> |
Bundle id to launch if a new session is created. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda swipe¶
Swipe from one coordinate to another.
Arguments:
| Argument | Description |
|---|---|
start_x |
Start X coordinate, in screen points. [required] |
start_y |
Start Y coordinate, in screen points. [required] |
end_x |
End X coordinate, in screen points. [required] |
end_y |
End Y coordinate, in screen points. [required] |
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-d, --duration <float> |
Swipe duration in seconds. [default: 0.2] |
-s, --session-id <str> |
Existing WDA session id (omit to create a new session). |
--bundle-id <str> |
Bundle id to launch if a new session is created. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.
wda window-size¶
Show window size (screen dimensions).
Options:
| Option | Description |
|---|---|
--native |
macOS only: reach the iOS 17+ tunnel by piggybacking Apple's own remoted tunnel via the remotepairingd service. NO root, no entitlement, no Xcode. Rides Apple's kernel-routable tunnel, so throughput matches the kernel tunnel, but the device keeps a single RSD connection on it: remoted and this process evict each other's, which can reset connections and leave Xcode/devicectl without the device until remoted reconnects. Mutually exclusive with --rsd/--tunnel/--userspace. [env var: PYMOBILEDEVICE3_NATIVE] |
--port <int> |
WDA device port to connect to. [default: 8100] |
--timeout <float> |
HTTP timeout in seconds. [default: 10.0] |
-xc, --xctrunner <str> |
Bundle id of an XCUITest runner to start (e.g. com.facebook.WebDriverAgentRunner.xctrunner). |
-s, --session-id <str> |
Existing WDA session id (omit to create a new session). |
--bundle-id <str> |
Bundle id to launch if a new session is created. |
Accepts the connection options: --rsd, --tunnel, --userspace, --mobdev2, --usbmux, --udid.