Skip to main content

iOS Simulators

Boot, stop, and reset iOS Simulators directly from the VSCode sidebar. SweetPad drives xcrun simctl โ€” the same tool Xcode's Devices and Simulators window uses behind the scenes.

What you can doโ€‹

  • ๐Ÿš€ Boot โ€” click โ–ถ๏ธ next to a simulator to boot it.
  • ๐Ÿ›‘ Stop โ€” click โน to shut it down.
  • ๐Ÿ“ฑ Open Simulator.app โ€” click ๐Ÿ“ฑ at the top of the Simulators panel to open the Simulator window.
  • ๐Ÿ”„ Refresh โ€” click โ†ป to re-read the installed simulators list.
  • ๐Ÿงน Remove simulator cache โ€” clears the simulator cache; useful when boot starts to misbehave (see Troubleshooting).

If something's missing, open a discussion or issue on the SweetPad GitHub repository.

Keep the Simulator app in the backgroundโ€‹

By default, launching the app brings the Simulator window to the foreground every time. If you'd rather stay in VSCode โ€” typical when iterating quickly, doing hot-reload work, or using keyboard automation to drive the Simulator โ€” turn that off:

.vscode/settings.json
{
"sweetpad.build.bringSimulatorToForeground": false
}

The Simulator still boots and runs the app; only the focus-stealing window activation is suppressed.

Logs from the simulatorโ€‹

os_log, Logger, print, and NSLog output from your simulator-running app is streamed into the build terminal alongside compiler output โ€” no separate Console.app required. For Simulator runs the stream is implemented as xcrun simctl spawn <udid> log stream --predicate <โ€ฆ> --level debug --style ndjson; for macOS runs SweetPad invokes the host log stream with the same flags. The filtering knobs Apple's log tool accepts work in both cases.

Turn the stream offโ€‹

.vscode/settings.json
{
"sweetpad.build.logStreamEnabled": false
}

Customize the predicateโ€‹

By default the predicate matches by process image (process + sender) rather than by subsystem, so apps that don't use Logger(subsystem:) still surface and Apple framework chatter stays out. Override the whole predicate with sweetpad.build.logStreamPredicate when you need finer control โ€” for example to keep only a specific subsystem, or to widen the filter to a framework you're debugging:

.vscode/settings.json
{
"sweetpad.build.logStreamPredicate": "processImagePath CONTAINS '${processName}'"
}

${bundleId} and ${processName} are substituted with the running app's bundle identifier and CFBundleExecutable before the predicate is passed to log stream.

note

logStreamPredicate and logStreamEnabled apply to simulators and macOS runs (anything launched via log stream). Physical iOS devices stream through pymobiledevice3 and use a different filtering model โ€” see Devices โ†’ Filter what reaches the terminal.

Troubleshootingโ€‹

tip

If booting fails with Failed to start launchd_sim: could not bind to session, launchd_sim may have crashed or stopped responding, click Remove simulator cache in the Simulators panel and try again.