Moving from local development to a live production environment is often the most stressful part of mobile development. If you’re wondering how to deploy expo app to app store, you’ve likely realized that while Expo makes development a breeze, the Apple ecosystem requires a very specific set of credentials and configurations.
In my experience, the transition from the Expo Go app to a standalone binary is where most developers hit a wall. Whether you are using the Expo Router tutorial for beginners to build your navigation or you’re coming from a more complex setup, the deployment pipeline remains the same. Today, we use EAS (Expo Application Services), which has fundamentally changed how we handle certificates and builds.
Prerequisites
Before we touch a single line of code, you need these three things in place. Without them, you cannot publish to the App Store:
- Apple Developer Program Account: You must be enrolled ($99/year). You cannot upload to the App Store without a paid membership.
- EAS CLI Installed: This is the tool we use to trigger cloud builds. Run
npm install -g eas-cli. - An Expo Account: Your project must be linked to an Expo account to use their build servers.
Step 1: Configure your app.json
Your app.json (or app.config.js) is the source of truth for your app. You need to provide a unique bundle identifier that Apple uses to identify your app globally.
{
"expo": {
"name": "My Awesome App",
"slug": "my-awesome-app",
"version": "1.0.0",
"ios": {
"bundleIdentifier": "com.yourname.myapp",
"buildNumber": "1.0.0",
"supportsTablet": true
},
"extra": {
"eas": {
"projectId": "your-project-id-from-expo"
}
}
} }
If you’re still debating why use Expo instead of React Native CLI, this is exactly why: EAS handles the complex Xcode project generation for you in the cloud.
Step 2: Initialize EAS Build
Run the following command in your project root to set up your build configuration:
eas build:configure
This creates an eas.json file. I recommend setting up a specific production profile to ensure your app is optimized for the store. Your eas.json should look something like this:
{
"build": {
"production": {
"distribution": "store",
"autoIncrement": true
}
}
}
Step 3: Running the Production Build
Now we trigger the build. This is where the magic happens. Instead of needing a Mac with Xcode installed locally, Expo’s servers will spin up a macOS VM, install your dependencies, and compile the binary.
eas build --platform ios --profile production
During this process, EAS will ask you to log into your Apple Developer account. Pro Tip: Let EAS handle the credentials. It will generate your Distribution Certificate and Provisioning Profile automatically. I’ve tried doing this manually in the past, and it’s a recipe for ‘Invalid Signature’ errors.
As shown in the image below, once the build starts, you can follow the progress in your terminal or via the Expo dashboard.
Step 4: Submitting to App Store Connect
Once your build is finished, you have a .ipa file sitting on Expo’s servers. You can manually download it and use Transporter, but the fastest way is using the EAS submit command:
eas submit -p ios
This pushes your binary directly to App Store Connect. From here, you just need to log into the web portal, fill out your app descriptions, upload screenshots, and submit for review.
Pro Tips for a Smooth Approval
- Check your Icons: Ensure you have a 1024×1024 px icon without transparency. Apple will reject your build if the icon has alpha channels.
- Privacy Manifests: With recent Apple updates, ensure you’ve declared why you are using certain APIs (like UserDefaults) in your
app.json. - Use TestFlight: Never submit directly to production. Use
eas build --platform ios --profile previewto send a build to TestFlight first.
Troubleshooting Common Errors
| Error | Cause | Solution |
|---|---|---|
| Bundle ID mismatch | The ID in app.json doesn’t match App Store Connect | Ensure bundleIdentifier is identical in both places. |
| Missing Icon | Icon file missing or wrong format | Check expo.icon path and ensure it’s a PNG. |
| Build Timeout | Too many heavy dependencies | Check for unused packages or upgrade your EAS plan. |
What’s Next?
Once your app is live, the work doesn’t stop. I highly recommend setting up OTA (Over-the-Air) Updates. With eas update, you can push bug fixes to your users instantly without waiting for Apple’s 24-48 hour review process. This is a game-changer for productivity.