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

npm install -g eas-cli
Verify installation:
eas --version

Step 2: Log In to Expo

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

Step 3: Configure EAS Build

In your project directory:
eas build:configure
This creates eas.json with build profiles:
eas.json
{
  "cli": {
    "version": ">= 5.0.0"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "ios": {
        "simulator": true
      }
    },
    "preview": {
      "distribution": "internal",
      "android": {
        "buildType": "apk"
      }
    },
    "production": {
      "autoIncrement": true
    }
  },
  "submit": {
    "production": {}
  }
}
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

eas build --platform android --profile production
2

Choose build type

Select APK for testing or AAB (Android App Bundle) for Play Store:
? What would you like your Android application id to be?
 com.yourcompany.yourapp
3

Generate keystore

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

Build starts

Your build is queued in the cloud:
 Build started
 Build ID: abc123-def456-ghi789
 View build details: https://expo.dev/accounts/yourname/projects/yourapp/builds/abc123
5

Download APK/AAB

When complete (5-15 minutes), download your build:
eas build:list
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

eas build --platform ios --profile production
2

Configure bundle identifier

? What would you like your iOS bundle identifier to be?
 com.yourcompany.yourapp
This must match your Apple Developer account configuration.
3

Set up Apple credentials

EAS needs access to your Apple Developer account:
? Do you have access to the Apple account that will be used for this app?
 Yes

? Provide your Apple ID:
 your-email@example.com
You’ll receive a verification code via email/SMS.
4

Generate certificates

EAS generates distribution certificates and provisioning profiles:
 Generated Distribution Certificate
 Generated Provisioning Profile
 Uploaded credentials
5

Build starts

 Build started
 Build ID: xyz789-abc123-def456
 View: https://expo.dev/accounts/yourname/projects/yourapp/builds/xyz789
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:
eas build --platform ios --profile preview
Install with Apple Configurator or Xcode.

Step 6: Submit to App Stores

EAS can submit builds automatically! Submit to Google Play:
eas submit --platform android
You’ll need:
  • Google Play Console account
  • App created in Play Console
  • Service account key (EAS guides you through this)
Submit to App Store:
eas submit --platform ios
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:
npx expo prebuild
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 ios/YourApp.xcworkspace
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

keytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
Remember the passwords you set!
2

Configure Gradle

Create android/gradle.properties:
MYAPP_RELEASE_STORE_FILE=my-release-key.keystore
MYAPP_RELEASE_KEY_ALIAS=my-key-alias
MYAPP_RELEASE_STORE_PASSWORD=your-store-password
MYAPP_RELEASE_KEY_PASSWORD=your-key-password
Update android/app/build.gradle:
android {
  signingConfigs {
    release {
      storeFile file(MYAPP_RELEASE_STORE_FILE)
      storePassword MYAPP_RELEASE_STORE_PASSWORD
      keyAlias MYAPP_RELEASE_KEY_ALIAS
      keyPassword MYAPP_RELEASE_KEY_PASSWORD
    }
  }
  buildTypes {
    release {
      signingConfig signingConfigs.release
    }
  }
}
3

Build APK

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

Or build AAB (for Play Store)

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

Running on Physical Devices

Development Builds

Create a development build to test on device:
eas build --profile development --platform ios
eas build --profile development --platform android
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:
# Install expo-updates
npx expo install expo-updates

# Publish update
eas update --branch production
OTA updates work for JavaScript code only. Native code changes require a new build.
Configure in app.json:
app.json
{
  "expo": {
    "updates": {
      "url": "https://u.expo.dev/your-project-id"
    },
    "runtimeVersion": "1.0.0"
  }
}
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:
eas credentials
Select platform and “Remove all credentials” then rebuild.
Check:
  1. Running in production mode locally:
    expo start --no-dev --minify
    
  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:
eas credentials
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