Skip to main content
Ready to share your app with the world? This tutorial covers everything you need to build your Expo app for production and deploy it to the Apple App Store and Google Play Store.

Build Options

Expo provides two ways to build your app:

EAS Build

Cloud-based builds. No Xcode or Android Studio required. Recommended for most developers.

Local Builds

Build on your machine with Xcode and Android Studio. Full control, but more setup.

Prerequisites

Step 1: Install EAS CLI

Verify installation:

Step 2: Log In to Expo

Enter your Expo credentials. Don’t have an account? Create one at expo.dev/signup.

Step 3: Configure EAS Build

In your project directory:
This creates eas.json with build profiles:
eas.json
Build Profiles Explained:
  • development: For local testing with custom native code
  • preview: For internal testing (APK for Android, Ad Hoc for iOS)
  • production: For app store submission

Step 4: Build for Android

1

Start the build

2

Choose build type

Select APK for testing or AAB (Android App Bundle) for Play Store:
3

Generate keystore

EAS will generate a new keystore for signing:
EAS securely stores your keystore. You can download it later if needed.
4

Build starts

Your build is queued in the cloud:
5

Download APK/AAB

When complete (5-15 minutes), download your build:
Or visit the URL to download from the dashboard.
Install on your Android device:
  1. Download the APK to your phone
  2. Open it to install
  3. You may need to enable “Install from Unknown Sources”
  4. Test all features

Step 5: Build for iOS

1

Start the build

2

Configure bundle identifier

This must match your Apple Developer account configuration.
3

Set up Apple credentials

EAS needs access to your Apple Developer account:
You’ll receive a verification code via email/SMS.
4

Generate certificates

EAS generates distribution certificates and provisioning profiles:
5

Build starts

6

Download IPA

When complete, download the .ipa file from the dashboard.
Option 1: TestFlight (Recommended)
  1. Upload to App Store Connect
  2. Add internal testers
  3. They install via TestFlight app
Option 2: Ad Hoc BuildFor ad hoc distribution:
Install with Apple Configurator or Xcode.

Step 6: Submit to App Stores

EAS can submit builds automatically! Submit to Google Play:
You’ll need:
  • Google Play Console account
  • App created in Play Console
  • Service account key (EAS guides you through this)
Submit to App Store:
You’ll need:
  • Apple Developer account
  • App created in App Store Connect
  • App Store Connect API key (EAS guides you through this)
For detailed submission guides, see:

Building Locally

Generate Native Projects

First, generate the native ios/ and android/ folders:
This creates native projects configured for your app.
Run npx expo prebuild --clean to regenerate from scratch if you modify app.json.

Build iOS Locally

1

Open in Xcode

Open the .xcworkspace file, NOT .xcodeproj!
2

Select scheme

In Xcode, select your app scheme and “Any iOS Device” as the destination.
3

Configure signing

  1. Select your project in the navigator
  2. Go to “Signing & Capabilities”
  3. Select your team
  4. Xcode will handle provisioning
4

Archive

Product → ArchiveWait for the build to complete.
5

Distribute

  1. Window → Organizer
  2. Select your archive
  3. Click “Distribute App”
  4. Choose distribution method:
    • App Store Connect (for submission)
    • Ad Hoc (for testing)
    • Development (for your devices)

Build Android Locally

1

Generate signing key

Remember the passwords you set!
2

Configure Gradle

Create android/gradle.properties:
Update android/app/build.gradle:
3

Build APK

Output: android/app/build/outputs/apk/release/app-release.apk
4

Or build AAB (for Play Store)

Output: android/app/build/outputs/bundle/release/app-release.aab

Running on Physical Devices

Development Builds

Create a development build to test on device:
Development builds:
  • Include dev menu
  • Connect to Metro bundler
  • Support Fast Refresh
  • Include all your native dependencies

Install on Device

iOS:
  1. Download IPA from EAS dashboard
  2. Install via Xcode: Window → Devices and Simulators
  3. Drag IPA onto device
Android:
  1. Download APK from EAS dashboard
  2. Transfer to device
  3. Open APK to install
  4. Or use adb install app.apk

App Store Guidelines

iOS App Store

Key requirements:
  • App must be fully functional
  • No placeholder content
  • Privacy policy required
  • App description accurate
  • Screenshots required (multiple sizes)
  • Test account if login required
Full guidelines: developer.apple.com/app-store/review/guidelines/
  1. Create app in App Store Connect
  2. Fill in metadata:
    • Name, subtitle, description
    • Keywords
    • Category
    • Content rating
  3. Upload screenshots (required sizes)
  4. Set pricing
  5. Submit for review
Review typically takes 1-3 days.
  • Crashes or bugs
  • Missing functionality
  • Poor user experience
  • Privacy policy issues
  • Misleading description
  • Placeholder content
Always test thoroughly before submission!

Google Play Store

  1. Create app in Play Console
  2. Complete store listing:
    • Title, description
    • Screenshots (phone, tablet, TV)
    • Feature graphic
    • App icon
  3. Set content rating (questionnaire)
  4. Add privacy policy
  5. Choose countries
  6. Set pricing
  7. Upload AAB
  • Internal Testing: Up to 100 testers, instant access
  • Closed Testing: Limited testers, opt-in
  • Open Testing: Public beta, anyone can join
  • Production: Live on Play Store
Start with internal testing, then progress through tracks.
Google Play reviews are typically faster than iOS:
  • Initial review: Few hours to 2 days
  • Updates: Usually faster
  • Automated checks run immediately
Common issues:
  • Permissions not justified
  • Privacy policy missing
  • Content rating incorrect
  • Crashes on specific devices

Over-the-Air Updates

Update your app instantly without going through app stores:
OTA updates work for JavaScript code only. Native code changes require a new build.
Configure in app.json:
app.json
Users get updates automatically when they open the app!

Production Checklist

  • Test on multiple devices/simulators
  • Test in production mode: expo start --no-dev
  • Remove console.logs and debug code
  • Update version in app.json
  • Verify app icon and splash screen
  • Test deep links
  • Check permissions work correctly
  • Verify API endpoints (not localhost!)
  • Test offline functionality
  • Review privacy policy
  • App created in App Store Connect
  • Metadata completed
  • Screenshots uploaded (all required sizes)
  • Privacy policy URL added
  • Test account provided (if needed)
  • Export compliance information
  • Age rating set
  • Pricing configured
  • App created in Play Console
  • Store listing completed
  • Screenshots uploaded
  • Feature graphic added
  • Content rating obtained
  • Privacy policy URL added
  • Countries selected
  • Pricing configured
  • AAB uploaded

Troubleshooting

Reset credentials:
Select platform and “Remove all credentials” then rebuild.
Check:
  1. Running in production mode locally:
  2. All environment variables set
  3. API URLs correct (not localhost)
  4. All assets included
  5. No development-only code
Common fixes:
  1. Add NSPhotoLibraryUsageDescription in app.json
  2. Ensure privacy policy is accessible
  3. Test on actual device
  4. Provide test account
  5. Remove references to other platforms
For EAS builds:
For local builds, verify:
  • Keystore path correct
  • Passwords correct in gradle.properties
  • Keystore not corrupted

Next Steps

Congratulations on building your first Expo app!

Monitor with Sentry

Track errors in production

Analytics

Understand user behavior

Push Notifications

Engage users with notifications

EAS Documentation

Learn advanced EAS features