Article

Deploying an Expo App to the App Store

A practical guide to publishing an Expo app, from Apple Developer enrollment through App Store review.

Deploying an Expo App to the App Store

I had already gone through the process of publishing my Expo app on Google Play. If you read that article, you know Google Play and the App Store are very different beasts. Apple has its own ecosystem, tools, review process, and particular ways of making things challenging.

This is my step-by-step guide to publishing an Expo app on the iOS App Store, from creating an Apple Developer account to clicking “Submit for Review.” It covers everything I wish I had known before I started.

Prerequisites

Before we begin, make sure you have:

  • A working Expo project (managed or bare workflow)
  • A Mac, or access to one. Apple requires macOS to build iOS apps natively, although EAS Build can work around this.
  • Xcode installed (the latest stable version)
  • An Apple ID

❇️ Step 1: Enroll in the Apple Developer Program

This is the first hurdle. Unlike Android’s one-time $25 fee, Apple charges $99 per year.

  1. Go to developer.apple.com
  2. Click “Account” and sign in with your Apple ID
  3. Enroll in the Apple Developer Program
  4. Enter your personal or organization details
  5. Pay the $99 fee

Once approved, you’ll have access to App Store Connect and the Apple Developer Portal, your two main dashboards for everything that follows.

❇️ Step 2: Set Up Your App in App Store Connect

App Store Connect is where you manage your app listing, builds, pricing, and submissions.

  1. Go to appstoreconnect.apple.com
  2. Click the “+” button, then choose “New App.”
  3. Enter the app details:
    • Platform: iOS
    • Name: your app’s display name (choose carefully; it is difficult to change)
    • Bundle ID: must exactly match the value in your Expo configuration
    • SKU: a unique internal identifier
  4. Click “Create.”

Your app record is now live in App Store Connect. There is no build yet—just the app container.

❇️ Step 3: Configure Your Expo Project for iOS

Open app.json (or app.config.js) and make sure the iOS section is complete:

{
  "expo": {
    "name": "Your App Name",
    "slug": "your-app-slug",
    "version": "1.0.0",
    "ios": {
      "bundleIdentifier": "com.yourname.yourapp",
      "buildNumber": "1",
      "supportsTablet": true,
      "infoPlist": {
        "NSCameraUsageDescription": "We need camera access to...",
        "NSPhotoLibraryUsageDescription": "We need photo access to..."
      }
    }
  }
}

Key things to double-check:

  • bundleIdentifier must exactly match the value registered in App Store Connect.
  • Increment buildNumber with every upload, even if the version stays the same.
  • Add every permission your app uses to infoPlist with a clear description. Apple may reject your app if these are missing or vague.

❇️ Step 4: Handle Certificates and Provisioning Profiles

This is where Apple differs most from Android, and where many developers lose hours. You need two things:

  • A Distribution Certificate, which proves the build came from you
  • A Provisioning Profile, which links your app’s Bundle ID to your certificate and authorizes distribution

Option A: Let EAS handle it (recommended)

If you use EAS Build, it can manage all of this automatically:

npx eas-cli credentials

EAS will prompt you to sign in to your Apple account, then generate and store everything for you.

Option B: Do it manually with Xcode or the Apple Developer Portal

  1. In the Apple Developer Portal, open Certificates, IDs & Profiles.
  2. Create a new iOS Distribution Certificate.
  3. Create an App ID that matches your Bundle Identifier.
  4. Create a Distribution Provisioning Profile that links the two.

💡 Lesson learned: Avoid maintaining multiple developer certificates when possible. Apple limits how many you can have per account, and revoking a certificate invalidates any provisioning profiles that use it.

❇️ Step 5: Build Your App

Using EAS Build (recommended)

npm install -g eas-cli
eas login
eas build:configure

Configure eas.json for production:

{
  "build": {
    "production": {
      "ios": {
        "distribution": "store"
      }
    }
  }
}

Then start the build:

eas build --platform ios --profile production

EAS builds your app in the cloud, handles code signing, and provides an .ipa file ready to upload. You do not need a Mac for this step.

Using Xcode (local build)

npx expo run:ios --configuration Release

Or open the ios/ folder in Xcode, select “Any iOS Device” as the target, and choose Product → Archive.

❇️ Step 6: Upload Your Build to App Store Connect

Option A: EAS Submit (easiest)

eas submit --platform ios --latest

Option B: Transporter — download it from the Mac App Store, sign in, add your .ipa file, and click “Deliver.”

Option C: Xcode Organizer — after archiving, open Window → Organizer, find your archive, and choose Distribute App → App Store Connect → Upload.

❇️ Step 7: Test with TestFlight

Before submitting to the App Store, always test with TestFlight.

  1. In App Store Connect, open TestFlight.
  2. After your build is processed, add Internal Testers (up to 100 people on your team).
  3. For External Testers, submit for Beta App Review first (usually 1–2 days).

❇️ Step 8: Prepare Your App Store Listing

Apple requires all of the following before you can submit:

  • Name (up to 30 characters) and Subtitle (up to 30 characters)
  • Category (primary and optional secondary)
  • Privacy Policy URL (required)
  • Description (up to 4,000 characters; make the first few lines count)
  • Keywords (up to 100 characters total, separated by commas)

Screenshots — Apple requires specific sizes:

  • iPhone 6.9-inch (iPhone 16 Pro Max) — required
  • iPhone 6.7-inch (iPhone 14 Plus / 15 Plus) — optional, but recommended
  • iPad Pro 13-inch (M4) — required if your app supports iPad

❇️ Step 9: Set Pricing and Availability

  1. Open Pricing and Availability.
  2. Choose Free or set a price tier.
  3. Select the territories where you want to distribute the app (the default is all territories).
  4. Set an availability date (optional).

❇️ Step 10: Fill Out the App Privacy Questionnaire

Apple requires you to declare your data practices. This information becomes the Privacy Nutrition Label on your App Store page. In App Store Connect, open App Privacy and answer honestly: what data you collect, whether it is linked to a user’s identity, and whether it is used for tracking.

❇️ Step 11: Submit for Review

Under Review Information, leave a note for the Apple reviewer. If your app requires a login, provide test credentials here. Then choose Add for Review → Submit to App Review.

❇️ Step 12: Release!

Once approved, your app status becomes “Ready for Sale.” You choose one of these options during submission:

  • Release manually: you control when the app goes live.
  • Release automatically: the app goes live as soon as it is approved.

🎉 Congratulations—your app is on the App Store.

❇️ Wrapping Up

The App Store process is more opaque than Google Play, but subsequent releases get much smoother after your first. The biggest time sinks are:

  1. Certificates and provisioning — let EAS handle them.
  2. Screenshots — set aside real design time for these.
  3. The first review — allow 1–3 days and make sure nothing crashes.

Apple’s ecosystem has a steeper learning curve, but the App Store audience is valuable, and its quality standards work in your favor once you are in. Good luck shipping! 🚀

If you found this useful, I also wrote about Deploying My Expo App to Google Play — the same step-by-step treatment for Android. You can also find my apps on vladsiu.com.