iOS Export (When You're Ready)
Module 7 ยท Lesson 2 ยท ~30 min ยท optional second platform
iOS is harder than Android โ not because the Godot tooling is worse (it's similar) but because Apple gates everything behind a paid developer account and Xcode. If you're still in the "does anyone want this?" phase, don't bother with iOS yet. Ship Android to the Play Store, get real user data, then pay Apple the $99.
What iOS actually requires
- A Mac. No way around it. You can't make an iOS build without a macOS machine running Xcode. (You have one โ but noting it because the Godot tooling story for Windows/Linux devs is grim.)
- Xcode 15+. Free on the Mac App Store, ~10GB download. Godot exports an Xcode project, not an IPA โ you open it in Xcode and Xcode does the final build.
- An Apple ID. The free tier lets you install on your own devices for 7 days at a time. Enough to validate the game runs on an iPhone.
- An Apple Developer Program membership โ $99/year. Required for TestFlight (beta distribution) and App Store submission. Not required for the initial "does it work on my phone" test.
When to pay the $99
Pay when you have something worth shipping to 20 beta testers โ not before. The free developer tier is enough to prove the game runs on iPhone hardware. TestFlight is what you're paying for.
Installing iOS export templates
Same download as Android โ Editor โ Manage Export Templates โ Download and Install bundles all platforms. You don't need a separate step.
The iOS export preset
Project โ Export โ Add โ iOS. Key fields:
- App Store Team ID: find in developer.apple.com/account โ Membership. Starts with 10 characters. Required even for free-tier builds.
- Bundle Identifier:
com.yourname.lexiconduel โ should match your Android package name for consistency.
- Bundle Short Version: "1.0.0" โ shown in the App Store.
- Bundle Version: "1" โ the integer build number, must increment every TestFlight upload.
- Signing โ Identity Type: "Automatic" for development, "Manual" once you're uploading to App Store Connect.
- Icons: Godot generates the iOS icon set from a single 1024ร1024 PNG you provide. Don't skip this โ Apple rejects builds with placeholder icons.
The export โ Xcode dance
# Export from Godot (CLI)
godot --headless --export-debug "iOS" build/ios/
# Open the generated Xcode project
open build/ios/lexicon-duel.xcodeproj
In Xcode:
- Select the project in the left sidebar โ Signing & Capabilities
- Pick your Team from the dropdown
- Plug in iPhone (authorize computer on phone if prompted)
- Pick iPhone from the scheme dropdown at the top
- Cmd+R to build and run
First run, the phone will say "Untrusted Developer" โ go to Settings โ General โ VPN & Device Management and trust your developer identity. After that, Cmd+R works immediately.
The iteration loop
This is slower than Android, honestly:
1. Make change in Godot
2. godot --headless --export-debug "iOS" build/ios/
3. Xcode may prompt to reload project โ say yes
4. Cmd+R
5. Wait ~60s for Xcode to sign, install, launch
On Android, the equivalent is ~15 seconds. This is why you prototype on Android and only cut iOS builds when you're doing a real round of iOS-specific testing.
iOS-specific gotchas
- Safe area insets. The notch on iPhones means you need to respect
DisplayServer.screen_get_usable_rect() when placing UI. Test on a notched phone early or your HUD will be under the camera cutout.
- Haptics API differs slightly.
Input.vibrate_handheld() works on both platforms but the feel is different. Apple's haptic engine is nicer โ slightly stronger default patterns feel fine on iOS but overpower on Android.
- 60fps target. Newer iPhones can do 120Hz ProMotion. Godot 4 doesn't use it by default; add
OS.low_processor_usage_mode = false and set display refresh rate in Project Settings. Or just target 60 and skip this until v2.
- No "install via browser." There's no sideloading on iOS. The only ways to get your game onto a friend's phone are TestFlight (paid) or running it straight from Xcode with their phone plugged into your Mac.
TestFlight (paid tier)
TestFlight is Apple's beta distribution. Once you have the $99 membership:
- In Xcode โ Product โ Archive โ Distribute App โ App Store Connect โ Upload
- Log into App Store Connect โ Your App โ TestFlight
- Add internal testers (up to 100, must have Apple IDs) โ they get the build in minutes
- Or add external testers (up to 10,000) โ requires a short Apple review, ~24 hours the first time
TestFlight builds expire after 90 days. Plan your beta cycles accordingly โ a stale TestFlight is a dead TestFlight.
The cross-platform discipline
Godot is genuinely cross-platform, but "runs on both" is not the same as "feels good on both." Things that commonly diverge:
- Touch target sizes (Android users tolerate smaller than iOS users in my experience)
- Back button behavior โ Android has a hardware back, iOS doesn't. Don't rely on the back button for critical navigation
- Font rendering โ iOS favors SF Pro, Android favors Roboto. Bundle your own font to avoid platform-dependent weirdness
- Audio latency โ iOS is consistently lower latency. SFX timing that feels tight on Android can feel sloppy on iOS
Test both before publishing. Budget one full dedicated day per platform near launch for this pass.
Do this now (optional)
- If you have the free Apple ID tier set up, make the iOS preset and get one build running on an iPhone (yours or a friend's).
- If you don't, skim this lesson and move on โ come back in Module 8 or after the Android launch.
- Write a line in
progress/journal.md: "iOS blocker: waiting on [X]" so future-you remembers what's between you and an iOS build.