How to Take Clean Screenshots From the iOS Simulator and Android Emulator
Set the iOS Simulator status bar to 9:41 with one simctl command, switch Android to demo mode, and capture store-ready screens at the right size and format.
To take a clean iOS Simulator screenshot, override the status bar with xcrun simctl status_bar booted override --time 9:41 --batteryState charged --batteryLevel 100, then capture with xcrun simctl io booted screenshot. On Android, turn on System UI demo mode over adb, which fixes the clock, fills the battery and signal icons and hides notifications, then capture with adb exec-out screencap -p.
That covers the status bar. A store-ready capture also needs the right device size, a file format the store accepts, and a screen full of believable data. This guide walks through all of it, with commands you can paste.
- xcrun simctl status_bar booted override sets the iOS Simulator clock, battery, Wi-Fi and cellular indicators, and xcrun simctl status_bar booted clear removes the override.
- Android's System UI demo mode is enabled with adb shell settings put global sysui_demo_allowed 1 and driven with broadcasts to com.android.systemui.demo.
- An iPhone 17 Pro Max simulator captures at 1320 × 2868, one of the accepted sizes for App Store Connect's largest iPhone slot.
- simctl and adb both save PNGs with an alpha channel; App Store Connect refuses transparency and Google Play asks for JPEG or 24-bit PNG without alpha.
- Google Play rejects screenshots whose long side is more than twice the short side, which rules out raw captures from many tall modern phones.
Why the status bar matters in store screenshots
A screenshot taken during development carries whatever the simulator was doing at the time: 2:17 PM, 34% battery, a carrier name, a stray notification icon. None of it is wrong, but it reads as unfinished, and it pulls the eye away from the part of the screen you care about.
Google is explicit about it. Its preview asset guidelines ask you to clean up the notification bar so it shows full battery, Wi-Fi and cell icons with no notifications. Apple doesn't spell out a status-bar rule, but the 9:41 clock is the convention in its own marketing, and a consistent status bar across all your screenshots makes the set look like one piece of work.
How to set the iOS Simulator status bar to 9:41
The simctl status_bar command has been part of Xcode for several releases. We checked the flags below against xcrun simctl status_bar help in Xcode 27. Boot the simulator you want, then run:
xcrun simctl status_bar booted override \
--time 9:41 \
--dataNetwork wifi \
--wifiMode active --wifiBars 3 \
--cellularMode active --cellularBars 4 \
--operatorName '' \
--batteryState charged --batteryLevel 100booted targets the running simulator. If you have more than one booted, pass its UDID instead (from xcrun simctl list devices booted). Each flag is optional, but you need at least one.
| Flag | Accepted values | What we use |
|---|---|---|
--time | Any string; a valid ISO date also sets the date | 9:41 |
--dataNetwork | hide, wifi, 3g, 4g, lte, lte-a, lte+, 5g, 5g+, 5g-uwb, 5g-uc | wifi |
--wifiBars | 0–3 | 3 |
--cellularBars | 0–4 | 4 |
--operatorName | Any string; '' for empty | '' |
--batteryState | charging, charged, discharging | charged |
--batteryLevel | 0–100 | 100 |
Check what's applied with xcrun simctl status_bar booted list. When you're finished, put it back:
xcrun simctl status_bar booted clearThe override survives app relaunches, so you can set it once and capture a whole set. Erasing the simulator resets it.
Capturing the iOS screenshot at the right size
xcrun simctl io booted screenshot shot.png saves the simulator's screen at its native pixel size. The simulator chrome and bezel are not included; you get the display only. That makes the device you pick the thing that decides whether App Store Connect accepts the file.
Pick a simulator that matches an accepted size
Apple's screenshot specifications list the exact pixel sizes each slot takes. The slot most guides call 6.9-inch (App Store Connect now labels it "iPhone with Dynamic Island, large display") accepts 1260 × 2736, 1290 × 2796 and 1320 × 2868 in portrait. When we captured from an iPhone 17 Pro Max simulator, the file came out at 1320 × 2868, so it fits that slot with no resizing. For iPad, a 13-inch iPad Pro simulator matches the 13-inch slot, which accepts 2064 × 2752 and 2048 × 2732. Our screenshot size reference lists the rest.
If you'd rather create a dedicated device for screenshots, so your day-to-day simulator stays untouched:
xcrun simctl create store-shots "iPhone 17 Pro Max"
xcrun simctl boot store-shots
open -a SimulatorAvoid the transparency error
The PNG simctl writes has an alpha channel, even though every pixel is opaque. App Store Connect's specifications say images can't include alpha channels or transparency. If you're uploading the capture directly, save it as JPEG instead:
xcrun simctl io booted screenshot --type=jpeg 01-home.jpg
# or convert an existing PNG on macOS
sips -s format jpeg 01-home.png --out 01-home.jpgIf the screenshot is going into a design tool first, keep the PNG; the exported file is what needs to be alpha-free.
How to get a clean status bar on the Android emulator
Android has a built-in mechanism for this called System UI demo mode. It's documented in the Android Open Source Project, and it works on emulators and on real devices with USB debugging. First allow it, then send commands as broadcasts:
adb shell settings put global sysui_demo_allowed 1
demo() { adb shell am broadcast -a com.android.systemui.demo -e command "$@"; }
demo enter
demo clock -e hhmm 0941
demo battery -e level 100 -e plugged false
demo network -e wifi show -e level 4
demo network -e mobile show -e datatype none -e level 4
demo notifications -e visible falseWe ran these on an API 35 emulator and each broadcast completed with the status bar updating immediately. When you're done:
adb shell am broadcast -a com.android.systemui.demo -e command exitDemo mode accepts more than this. status hides individual icons such as alarm, Bluetooth and location; bars -e mode sets the bar to opaque, translucent or semi-transparent. The AOSP page lists every command.
Capture the emulator screen
adb exec-out screencap -p > 01-home.pngUse exec-out rather than shell: it streams the raw bytes, so the PNG isn't corrupted by line-ending conversion. Like simctl, screencap captures the display only. Emulator skins draw a bezel around the emulator window, but that bezel never makes it into the file, so device frames have to be added afterwards.
Watch the 2:1 limit on Google Play
This one catches a lot of people. Google Play's screenshot rules say each side must be between 320 and 3840 pixels and the long side can't be more than twice the short side. Many current phones are taller than that. Our capture from a Pixel 9 Pro emulator came out at 1280 × 2856, a ratio of about 2.23, which Play won't accept as-is.
You have two options:
- Capture on a 16:9 profile. Create an AVD with a 1080 × 1920 screen. The capture uploads directly and also meets the 1080px minimum Google lists for eligibility in screenshot-based recommendation formats.
- Design around it. Place the tall capture inside a 1080 × 1920 canvas with a headline and background. This is what most designed screenshot sets do anyway.
Google also asks for JPEG or 24-bit PNG without alpha. screencap's output is RGBA, so convert it before a direct upload, the same way as on iOS.
Seed realistic demo data before you capture
A perfect status bar above an empty list is still a weak screenshot. Apple's App Review Guideline 2.3.3 says screenshots should show the app in use, not merely the title art, login page or splash screen. In practice the screens that read well have content that looks like a real person's: a budget with a few dozen transactions, a habit tracker three weeks into a streak, a chat with a believable back-and-forth.
Approaches that tend to work, from least to most effort:
- A demo account. One account on staging, populated by hand once, kept tidy. Simple, but it drifts.
- A launch argument that loads fixtures. Check for something like
-demoDatain debug builds and load a JSON file of sample content. Pass it withxcrun simctl launch booted com.example.app -demoData, or as an intent extra on Android. - UI tests that set up state. If you go on to automate captures, the test can create exactly the data each screen needs.
The simulator can also be prepared from the command line so permission prompts never appear in a shot:
# Add sample photos to the library
xcrun simctl addmedia booted ~/demo/photos/*.jpg
# Pre-grant permissions so no system dialog appears
xcrun simctl privacy booted grant photos com.example.app
xcrun simctl privacy booted grant location com.example.appNames matter more than people expect. "Test User" and "asdf" are visible from across the room. Use plausible names, real-looking amounts and dates near the present. Our list of common screenshot mistakes has more on the details that give a screenshot away.
Switching light/dark mode and language
If you ship a dark mode or localized listings, capture each variant from the same setup rather than toggling Settings by hand.
| Task | iOS Simulator | Android emulator |
|---|---|---|
| Dark appearance | xcrun simctl ui booted appearance dark | adb shell cmd uimode night yes |
| Back to light | xcrun simctl ui booted appearance light | adb shell cmd uimode night no |
| App language | xcrun simctl launch booted com.example.app -AppleLanguages "(de)" -AppleLocale de_DE | adb shell cmd locale set-app-locales com.example.app --locales de-DE |
The iOS language arguments apply to that launch only, which is handy: the simulator stays in English while the app runs in German. The Android per-app locale command needs Android 13 (API 33) or later; we checked its syntax with adb shell cmd locale help on API 35.
Localized screenshots are worth the effort when the app itself is translated. Capturing the German UI is the first half; the headlines need the same treatment. Our guide on localizing App Store screenshots covers what to translate and in what order, and why translation alone isn't localization covers the rest.
Putting it together: a capture script
Here's a small shell script that prepares an iOS simulator, captures light and dark versions of a screen, and cleans up. Navigation between screens is left to you (or to deep links, which most apps already have):
#!/bin/sh
set -e
DEVICE=booted
APP=com.example.app
OUT=./screenshots/en-US
mkdir -p "$OUT"
xcrun simctl status_bar $DEVICE override --time 9:41 \
--dataNetwork wifi --wifiBars 3 --cellularBars 4 \
--batteryState charged --batteryLevel 100
for MODE in light dark; do
xcrun simctl ui $DEVICE appearance $MODE
xcrun simctl launch --terminate-running-process $DEVICE $APP -demoData
sleep 2
xcrun simctl openurl $DEVICE "example://home"
sleep 1
xcrun simctl io $DEVICE screenshot --type=jpeg "$OUT/01-home-$MODE.jpg"
done
xcrun simctl status_bar $DEVICE clearPast a handful of screens and languages, a script like this turns into a maintenance job, and that's where UI-test driven tools like fastlane's snapshot come in.
What to do with clean captures
A clean capture is raw material. Most listings put it inside a designed frame with a headline that says what the screen does for the user, because a bare screenshot doesn't explain itself in the second or two someone spends scrolling past. Our step-by-step guide to making App Store screenshots picks up from here, and the screenshot best practices cover what to put on each one.
You can do that design step in any tool. In Launch Shots you drop the captures in, and the App Store screenshot generator handles the device frame, the headline layout and the export sizes for each store.
Design store-ready screenshots in minutes — free, no export watermarks.
Launch Shots is free to start. Every template (110+), 220+ device frames plus 3D mockups, AI localization, and direct upload to App Store Connect and Google Play Console. No credit card needed.
Start creating free →The short version
- iOS:
xcrun simctl status_bar booted override --time 9:41 --batteryState charged --batteryLevel 100, thenxcrun simctl io booted screenshot --type=jpeg shot.jpg, thenstatus_bar booted clear. - Android:
settings put global sysui_demo_allowed 1, demo-mode broadcasts for clock, battery, network and notifications,adb exec-out screencap -p, then-e command exit. - Capture on a simulator or emulator whose screen size the store accepts as-is: iPhone 17 Pro Max for the largest iPhone slot, a 16:9 AVD for Play.
- Remove the alpha channel before uploading a capture directly to either store.
- Load realistic demo data and pre-grant permissions so no empty state or system dialog makes it into a shot.
- Script light/dark and language switches so every variant comes from the same setup.
Frequently asked questions
05- How do I change the time to 9:41 in the iOS Simulator?
- Run xcrun simctl status_bar booted override --time 9:41 in Terminal while the simulator is running. The override also accepts flags for battery state and level, Wi-Fi and cellular bars, data network type and carrier name. It lasts until you run xcrun simctl status_bar booted clear or erase the device, so you can capture a whole set without repeating it.
- How do I hide notifications in the Android emulator status bar?
- Turn on System UI demo mode with adb shell settings put global sysui_demo_allowed 1, then broadcast adb shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false. Demo mode also lets you fix the clock, show full battery and full signal. Send the exit command when you're done to give the status bar back to the system.
- Why does App Store Connect reject my simulator screenshot?
- The two usual causes are size and transparency. App Store Connect only accepts specific pixel dimensions per display slot, so the screenshot must come from a simulator whose screen matches an accepted size. It also refuses images with an alpha channel, and simctl saves PNGs with one. Capturing with --type=jpeg, or converting the PNG to JPEG, avoids the transparency error.
- Can I use raw simulator screenshots as my App Store screenshots?
- Yes. Apple accepts plain screenshots as long as they are an accepted size and show the app in use, as App Review Guideline 2.3.3 asks. Many apps still add a headline and background, because a bare screen doesn't say what the feature is for. Either way, start from a clean capture: fixed status bar, realistic data and no debug overlays.
- Which Android emulator should I use for Play Store screenshots?
- Pick a device profile whose screen is no longer than twice its width, because Google Play rejects screenshots where the long side is more than double the short side. Many current phones are taller than 2:1, so their raw captures fail. A 16:9 profile such as a 1080 × 1920 phone works as-is, or you can place taller captures inside a designed 9:16 frame.
