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:
| Simulator | Capture resolution | ASC slot |
|---|---|---|
| iPhone 16 Pro Max | 1320 × 2868 | iPhone 6.9″ (required) |
| iPad Pro 13″ (M4) | 2064 × 2752 | iPad 13″ (required if on iPad) |
| iPhone 11 Pro Max | 1242 × 2688 | iPhone 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.
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.