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

  1. 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.)
  2. 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.
  3. 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.
  4. 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:

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:

  1. Select the project in the left sidebar โ†’ Signing & Capabilities
  2. Pick your Team from the dropdown
  3. Plug in iPhone (authorize computer on phone if prompted)
  4. Pick iPhone from the scheme dropdown at the top
  5. 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

TestFlight (paid tier)

TestFlight is Apple's beta distribution. Once you have the $99 membership:

  1. In Xcode โ†’ Product โ†’ Archive โ†’ Distribute App โ†’ App Store Connect โ†’ Upload
  2. Log into App Store Connect โ†’ Your App โ†’ TestFlight
  3. Add internal testers (up to 100, must have Apple IDs) โ€” they get the build in minutes
  4. 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:

Test both before publishing. Budget one full dedicated day per platform near launch for this pass.

Do this now (optional)

  1. 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).
  2. If you don't, skim this lesson and move on โ€” come back in Module 8 or after the Android launch.
  3. Write a line in progress/journal.md: "iOS blocker: waiting on [X]" so future-you remembers what's between you and an iOS build.