← Back to Blog

Article

Deploying My Expo Apps to the App Store - Lessons Learned

A step-by-step guide to getting an Expo app onto the iOS App Store, from Apple Developer enrollment to hitting Submit for Review.

Deploying Expo apps to the App Store

So I already went through the journey of shipping my Expo app to Google Play, and if you read that article. But Google Play and the App Store are two very different beasts. Apple has its own ecosystem, its own tools, its own review process, and its own very particular way of making your life difficult.

This article is my step-by-step guide for getting an Expo app onto the iOS App Store, from creating your Apple Developer account all the way to hitting "Submit for Review." 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 for building iOS apps natively, though EAS Build can work around this)
  • Xcode installed (latest stable version)
  • An Apple ID

❇️ Step 1: Enroll in the Apple Developer Program

This is the first gate. Unlike Android's one-time $25 fee, Apple charges $99/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. Fill in your personal or organization details
  5. Pay the $99 fee

Once approved, you'll have access to App Store Connect and 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's listing, builds, pricing, and submissions.

  1. Go to appstoreconnect.apple.com
  2. Click the "+" button → New App
  3. Fill in the details:
    • Platform: iOS
    • Name: Your app's display name (choose carefully - it's hard to change)
    • Bundle ID: Must match exactly what you'll set in your Expo config (e.g., com.yourname.yourapp)
    • SKU: A unique internal identifier (e.g., yourapp-ios-2024)
  4. Click Create

Your app shell is now live in App Store Connect. No build yet - just the container.

❇️ Step 3: Configure Your Expo Project for iOS

Open your 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 match exactly what you registered in App Store Connect
  • buildNumber must be incremented with every upload (even if the version stays the same)
  • Add every permission your app uses to infoPlist with a clear description - Apple will reject you if these are missing or vague

❇️ Step 4: Handle Certificates and Provisioning Profiles

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

  • A Distribution Certificate - proves the build came from you
  • A Provisioning Profile - links your app's Bundle ID to your certificate and authorizes it for distribution

Option A: Let EAS handle it (recommended)

If you're using EAS Build, it can manage all of this automatically:

npx eas-cli credentials

EAS will prompt you to log into your Apple account and will generate and store everything for you.

Option B: Manual (via Xcode or Apple Developer Portal)

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

💡 Lesson learned: Don't maintain multiple developer certificates if you can avoid it. Apple limits you to a small number per account, and revoked certificates invalidate any provisioning profiles that used them.

❇️ Step 5: Build Your App

Using EAS Build (recommended)

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

Set up eas.json for production:

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

Then trigger the build:

eas build --platform ios --profile production

EAS will build your app in the cloud, handle code signing, and give you a .ipa file ready for upload. No Mac required 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 use 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 from the Mac App Store, sign in, drag in your .ipa, click Deliver.

Option C: Xcode Organizer - After archiving, go to Window → Organizer, find your archive, and click Distribute App → App Store Connect → Upload.

❇️ Step 7: Test with TestFlight

Before you submit to the App Store, test with TestFlight. Always.

  1. In App Store Connect, go to TestFlight
  2. Once your build is processed, add Internal Testers (up to 100 people on your team)
  3. For External Testers, you'll need to submit to Beta App Review first (usually 1–2 days)

❇️ Step 8: Prepare Your App Store Listing

Apple requires all of this before you can submit:

  • Name (max 30 characters) and Subtitle (max 30 characters)
  • Category (primary and optional secondary)
  • Privacy Policy URL - required, no exceptions
  • Description (max 4,000 characters) - make the first few lines count
  • Keywords (max 100 characters total, comma-separated)

Screenshots - Apple requires specific sizes:

  • iPhone 6.9" (iPhone 16 Pro Max) - ✅ Required
  • iPhone 6.7" (iPhone 14 Plus / 15 Plus) - Optional but recommended
  • iPad Pro 13" (M4) - Required if you support iPad

❇️ Step 9: Set Pricing and Availability

  1. Go to Pricing and Availability
  2. Choose Free or set a price tier
  3. Select which territories to distribute in (default: all)
  4. Set an availability date (optional)

❇️ Step 10: Fill Out the App Privacy Questionnaire

Apple requires you to declare your data practices - this becomes the Privacy Nutrition Label on your App Store page. Go to App Privacy in App Store Connect and answer honestly: what data do you collect, is it linked to the user's identity, is it used for tracking.

❇️ Step 11: Submit for Review

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

❇️ Step 12: Release!

Once approved, your app status becomes "Ready for Sale." You have two options set during submission:

  • Manually release: You control when it goes live
  • Automatically release: Goes live immediately after approval

🎉 Congratulations. Your app is on the App Store.

❇️ Wrapping Up

The App Store process is more opaque than Google Play, but once you've done it once, subsequent releases are much smoother. The biggest time sinks are:

  1. Certificates and provisioning - let EAS handle this
  2. Screenshots - budget real design time for these
  3. The first review - expect 1–3 days and make sure nothing crashes

The Apple ecosystem has a steeper on-ramp, but the App Store audience is valuable and the quality bar it enforces actually works in your favor once you're 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.