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.
- Go to developer.apple.com
- Click "Account" and sign in with your Apple ID
- Enroll in the Apple Developer Program
- Fill in your personal or organization details
- 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.
- Go to appstoreconnect.apple.com
- Click the "+" button → New App
- 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)
- 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:
bundleIdentifiermust match exactly what you registered in App Store ConnectbuildNumbermust be incremented with every upload (even if the version stays the same)- Add every permission your app uses to
infoPlistwith 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 credentialsEAS 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)
- In Apple Developer Portal → Certificates, IDs & Profiles
- Create a new iOS Distribution Certificate
- Create an App ID matching your Bundle Identifier
- 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:configureSet up eas.json for production:
{
"build": {
"production": {
"ios": {
"distribution": "store"
}
}
}
}Then trigger the build:
eas build --platform ios --profile productionEAS 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 ReleaseOr 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 --latestOption 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.
- In App Store Connect, go to TestFlight
- Once your build is processed, add Internal Testers (up to 100 people on your team)
- 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
- Go to Pricing and Availability
- Choose Free or set a price tier
- Select which territories to distribute in (default: all)
- 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:
- Certificates and provisioning - let EAS handle this
- Screenshots - budget real design time for these
- 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.
