πŸš€ ShipToStore

iOS publishing guide Β· 5 steps Β· ~1h 55m

πŸš€ Build, upload & processing

Turn your code into a signed .ipa, get it onto Apple servers, and survive the silent post-upload validation.

Flutter: build the .ipa

20 min

Build the App Store package from the CLI:

  1. Run the build (below). Output lands in build/ios/ipa/.
  2. flutter build ipa archives and exports for App Store distribution in one shot. If you prefer the Xcode UI, flutter build ipa still leaves an .xcarchive in build/ios/archive/ you can open in Organizer.
  3. Upload the .ipa with the Transporter app (Mac App Store) or xcrun altool β€” or open the archive in Xcode Organizer and use Distribute App (next step).
flutter build ipa --release
xcrun altool --upload-app -f build/ios/ipa/*.ipa -t ios -u you@example.com -p "abcd-efgh-ijkl-mnop"

Archive in Xcode and upload to App Store Connect

30 min
  1. In Xcode, set the run destination to Any iOS Device (arm64) β€” Product β†’ Archive is greyed out while a simulator is selected.
  2. Product β†’ Archive. The build compiles in Release and the Organizer window opens with your archive.
  3. Select the archive β†’ Distribute App β†’ App Store Connect β†’ Upload (newer Xcode condenses this into a single 'App Store Connect' distribute option).
  4. Keep the defaults: include symbols, let Xcode manage signing for distribution.
  5. Xcode validates and uploads. 'Upload Successful' means it reached Apple β€” processing happens next and can still fail silently (see the processing step).

Keep the archive: Organizer retains your dSYMs, which you'll need to symbolicate crash logs from review.

⚠️ Pitfall

Signing errors at this stage ('No signing certificate…', profile mismatches) are Phase 4 problems resurfacing β€” fix them in Signing & Capabilities, don't fight the distribution dialog.

Expo: submit with eas submit

15 min
  1. Submit your latest EAS build straight from the cloud:
  2. First run, EAS asks for an App Store Connect API key (recommended β€” create at Users and Access β†’ Integrations) or an app-specific password, and can create the App Store Connect app record for you if it doesn't exist.
  3. eas submit picks your most recent finished build by default; pass --id <build-id> for a specific one.
  4. Alternative: download the .ipa from the EAS build page and upload manually with Apple's Transporter app.

One-liner for the impatient: eas build --platform ios --auto-submit builds and submits in one go.

eas submit --platform ios
eas build --platform ios --profile production --auto-submit

Answer export compliance (encryption)

5 min

Every build must answer the US export-compliance question about encryption.

  • Apps using only standard HTTPS/TLS (i.e. Apple's built-in encryption, no custom crypto): you qualify for the exemption β€” answer that you use standard/exempt encryption. This is the answer for the vast majority of apps.
  • Apps with proprietary encryption may need to file annual self-classification reports with the US government β€” talk to a professional.

Skip the question forever by pre-answering in Info.plist with ITSAppUsesNonExemptEncryption = false β€” then App Store Connect won't ask on every single build:

<key>ITSAppUsesNonExemptEncryption</key>
<false/>
{
  "expo": {
    "ios": {
      "infoPlist": { "ITSAppUsesNonExemptEncryption": false }
    }
  }
}

Wait for processing and confirm the build appears

45 min

After upload, Apple runs post-processing validation (malware scan, API/entitlement checks, asset validation).

  • Normal duration: 15–60 minutes. Release-season peaks can stretch to a few hours.
  • The build appears in App Store Connect β†’ your app β†’ TestFlight tab when done; you'll also get a 'completed processing' email.
  • Only processed builds can be selected for TestFlight or review submission.

While waiting, this is a great time to finish metadata or screenshots β€” don't sit refreshing.

⚠️ Pitfall

The classic trap: upload 'succeeds' but the build never appears. That means processing rejected it silently β€” the only notification is an email to the account holder (check spam) citing an ITMS- error: missing purpose strings, icon alpha channel, or unsupported architectures. Fix, bump the build number, re-upload.

← In-App Purchases & SubscriptionsTestFlight β†’

Track this interactively

Check off steps, skip what doesn't apply, and pick up where you left off.

Open the checklist β€” free