Faking a clean status bar in the iOS Simulator
If you’ve ever taken a screenshot in the Simulator and noticed the ugly 10:47 and 43% battery in the corner, this is the fix:
xcrun simctl status_bar <udid> override --time 9:41 --batteryLevel 100 --cellularBars 4
That gives you the same status bar Apple uses in every piece of marketing they’ve ever shipped.
Getting the UDID
xcrun simctl list devices
Or skip it entirely and use the booted keyword, which targets whatever simulator is currently running:
xcrun simctl status_bar booted override --time 9:41 --batteryLevel 100
The device has to actually be booted for the override to apply.
All the flags
| Flag | Values |
|---|---|
--time |
Any string. A valid ISO date string will also set the date. |
--dataNetwork |
hide, wifi, 3g, 4g, lte, lte-a, lte+, 5g, 5g+, 5g-uwb, 5g-uc |
--wifiMode |
searching, failed, active |
--wifiBars |
0–3 |
--cellularMode |
notSupported, searching, failed, active |
--cellularBars |
0–4 |
--operatorName |
Any string — set your own fake carrier |
--batteryState |
charging, charged, discharging |
--batteryLevel |
0–100 |
Available options vary a little by Xcode version, so xcrun simctl status_bar --help is the source of truth on your machine.
Listing and clearing
xcrun simctl status_bar booted list
xcrun simctl status_bar booted clear
Why 9:41?
It’s Apple’s canonical demo time. Steve Jobs unveiled the original iPhone roughly 41 minutes into the January 2007 keynote, and the marketing screenshots were set to match so the on-screen device agreed with the one in his hand. It stuck, and every iOS device in Apple’s marketing has read 9:41 ever since. Macs use 9:41 too; the Apple Watch uses 10:09.
Gotchas
- Overrides are per-device. Set them on each simulator you’re capturing from.
- Erasing the device wipes them.
simctl eraseclears overrides along with everything else. --timeaccepts arbitrary strings. Handy for locale-specific screenshots —--time "09:41"vs--time "9:41 AM".- Battery sometimes needs both flags. If the level doesn’t visibly change, add
--batteryState dischargingalongside--batteryLevel. - The override wins over the real clock, so the status bar will sit frozen at whatever you set until you clear it.
Shell helper
Worth dropping in your .zshrc if you take screenshots regularly:
prettybar() {
xcrun simctl status_bar booted override \
--time "9:41" \
--dataNetwork wifi \
--wifiMode active \
--wifiBars 3 \
--cellularMode active \
--cellularBars 4 \
--operatorName "" \
--batteryState charged \
--batteryLevel 100
}
Then just run prettybar before you hit ⌘S. If you’re automating App Store screenshots with fastlane, run the same command in a before_all block so every capture comes out consistent.