Skip to main content
Create a remote iOS simulator session, open the signed stream URL in a browser, install simulator-compatible app builds, and release the session when finished. For CLI setup, see CLI Quickstart. For reusable app artifacts, see Assets. To show the signed session inside a product, see Embed a Simulator. For taps, gestures, text, keys, buttons, and other device controls, see Control a Simulator.

Create a session

The response includes: For full runnable SDK source, see newly-app/run-cloud-examples/sdk-ios-android.

Capacity queue

If every compatible simulator is already in use, runcloud ios create waits for the next available session instead of failing immediately. If capacity opens within the wait window, the command returns a normal active session and includes queued: true, queueWaitMs, and queueAttempts in the JSON response. If capacity does not open in time, the command fails with no active session. Retrying is safe because a simulator lease is only created after capacity is assigned.

Configure the session

Supported flags: If --inactivity-timeout is omitted, run.cloud uses a 60-second inactivity timeout. Set it to none to disable inactivity auto-close. The signed simulator URL carries that policy to the iOS simulator; an embedded viewer shows the final 10-second countdown, ends the iOS simulator lease, and posts a session-ended message to its parent page. Billing is organization-level. Active sessions accrue metered usage against the selected organization. If the organization reaches its run.cloud credit ceiling, active simulator sessions are closed automatically.

Install an app

Try the onboarding app without building an iOS project:
The downloaded archive contains an Apple Silicon iOS Simulator .app; it is not an App Store or physical-device IPA. Install a local simulator build while creating the session:
Or upload once and reuse the artifact:
--install accepts .tar.gz, .zip, .app archives, and .ipa files. iOS Simulator reliability still depends on the app being built for the simulator runtime. Device-signed App Store IPAs are not a substitute for simulator builds.
An HTTPS target opens the system handler, normally Safari. A custom scheme opens its registered simulator app. The success result identifies the session, device, and lease and echoes the complete input URI without normalizing its encoding. The first custom-scheme handoff can still show an iOS Open in “App”? confirmation after that acknowledgement; confirm Open in the viewer before checking app state. For automated visual proof, allow about five seconds for the prompt before one confirmation tap and another five seconds for the app to render before capture. See Open URLs and Deep Links for authentication, the REST endpoint, a complete encoded example, automated confirmation guidance, and platform-specific errors.

Control the app

The CLI and SDK use normalized display coordinates from 0 to 1, with the origin at the top-left:
Each operation returns a correlated acknowledgement. Use Control a Simulator for gestures, semantic keys, hardware buttons, orientation, timeouts, cancellation, errors, and the full iOS capability list.

Inspect accessibility

Read the current nested hierarchy without exposing the signed viewer URL:
See Read the Accessibility Tree for the SDK, React embed, response schema, secure-value redaction, and test examples.

Capture a screenshot

Capture the current iOS simulator display as PNG bytes:
Screenshots require an active, user-owned iOS session. Responses are image/png and are never cached. The maintained iOS app screenshot example builds a native fixture, installs it, validates the PNG, and releases the session:
It writes screenshots/run-cloud-proof.png. Building from source requires macOS with Xcode; pass --app <path> to use a prebuilt simulator artifact.

Record screen video

Start an MP4 capture, stop it, and download it through the authenticated API:
The TypeScript equivalents are cloud.ios.startRecording, getRecording, listRecordings, stopRecording, and downloadRecording. See Record a Simulator for lifecycle, idempotency, retention, release, and failure behavior.

Read simulator logs

Read the most recent unified-log entries produced during the current lease, or follow new entries until you stop the command:
Snapshots are scoped to the active, user-owned lease, return 200 lines by default, and accept --tail values from 1 to 1,000. --follow streams only new entries as they arrive; use --json to emit one JSON object per entry. Snapshot JSON includes since, capturedAt, entries, and truncated. Snapshot and stream responses are never cached.

Upload a video

Import an MP4 or QuickTime video into Photos on an active simulator:
The SDK stores the uploaded video as a user-owned run.cloud asset before importing it. It remains available through cloud.assets until you delete it. Video imports accept video/mp4 and video/quicktime, with a 500 MB limit.

Inject camera video

Present a prerecorded MP4 or QuickTime file to an installed app as live camera frames:
The video loops until the camera source changes or the session ends. This is separate from uploadVideo, which imports a video into Photos. Camera input is limited to 500 MB, and the returned user-owned asset remains available until you delete it.

Inject microphone audio

Loop a prerecorded audio asset through the foreground app’s AVAudioEngine microphone input:
The operation grants microphone permission and relaunches the target app with the injector attached. AAC, M4A, MP3, MP4-audio, and WAV files are supported, up to 100 MB. The source is stored as a user-owned run.cloud asset.

Inspect sessions

list shows active sessions by default. Pass --all to include released sessions.

Release the session

Explicit release charges the final started minute and closes the iOS simulator session. If the organization reaches its run.cloud credit ceiling, active sessions are closed automatically.