한국어로 읽기 →

How to take iOS Simulator screenshots for the App Store

The iOS Simulator captures pixel-perfect, device-resolution PNGs — no physical device, no cable, scriptable from the shell. Here's the one-liner, the simulators whose output matches App Store Connect's required sizes, the classic 9:41 status bar override, and a loop that captures every locale your app supports. Last verified: June 2026.

The two ways to capture

In the Simulator app, ⌘S saves a screenshot of the frontmost simulator to the Desktop at full device resolution. That's fine for one or two shots. For anything repeatable, use simctl:

xcrun simctl io booted screenshot home.png

booted targets the running simulator; pass a device name or UDID instead when several are running. The output is a PNG at the exact pixel resolution of the simulated device — which is the whole trick.

Pick a simulator that matches an App Store slot

App Store Connect accepts screenshots only at exact resolutions. Capture from a simulator whose screen is natively one of them and your raw PNGs are upload-ready:

SimulatorCapture resolutionASC slot
iPhone 16 Pro Max1320 × 2868iPhone 6.9″ (required)
iPad Pro 13″ (M4)2064 × 2752iPad 13″ (required if on iPad)
iPhone 11 Pro Max1242 × 2688iPhone 6.5″ (optional)

If you frame your screenshots in an editor afterwards (device bezel + headline above), the capture size doesn't have to match a slot — the editor re-renders at the exact export resolution, and any current-generation simulator with the right aspect ratio works. Matching slots only matters when you upload raw captures.

Clean up the status bar first

Apple's own marketing shots always read 9:41, full battery, full signal. One command, sticks until the simulator reboots:

xcrun simctl status_bar booted override \
  --time "9:41" --batteryState charged --batteryLevel 100 \
  --cellularBars 4 --wifiBars 3

Undo with xcrun simctl status_bar booted clear.

Capture every language in one loop

You don't need to change the simulator's system language. Launching the app with -AppleLanguages overrides its locale for that run only:

BUNDLE_ID="com.yourcompany.app"

for LOC in en ko ja de; do
  xcrun simctl terminate booted "$BUNDLE_ID" 2>/dev/null
  xcrun simctl launch booted "$BUNDLE_ID" \
    -AppleLanguages "($LOC)" -AppleLocale "${LOC}_US"
  sleep 3   # let the first screen settle; navigate or deep-link here
  xcrun simctl io booted screenshot "01-home.$LOC.png"
done

Two practical notes: give the app a moment (or a launch argument / deep link) to land on the screen you want, and if your app caches its UI language internally, terminate it between runs as above so the override takes effect.

Name the files so tools can route them

The loop above already emits 01-home.en.png, 01-home.ko.png, … — leading digits = slide number, suffix before the extension = locale, the middle is a free description. That convention lets a screenshot editor bulk-import the whole folder and route every file to the right slide and language automatically — see the localization guide for the full workflow.

App Store Screenshot Studio — drop those captures into a free, open-source editor: device frames, headlines, per-language captions, and one-click export at exact App Store Connect sizes. Fully client-side — images never leave your machine. →

FAQ

Are simulator screenshots acceptable for the App Store?
Yes. ASC checks pixels and format, not provenance. The screenshot must honestly show your app's UI — where it was captured doesn't matter.

Why is my capture the wrong size for ASC?
You captured from a simulator whose screen isn't an accepted slot resolution (or a scaled window — window scale doesn't affect simctl output, which is always native). Either switch simulators per the table above, or frame the shots in an editor that exports exact sizes.

Can I script the in-app navigation too?
Yes — that's what fastlane snapshot does with XCUITest: it drives the app to each screen and captures per locale. It's the heavier, fully-automated cousin of the loop above.

Related guides