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
- EAS Build (Recommended)
- Local Builds
Requirements:
- Expo account (free): expo.dev/signup
- Node.js 18+
- Your Expo project
- Apple Developer account ($99/year)
- Not required for testing, only for App Store submission
- Google Play Developer account ($25 one-time)
- Not required for testing, only for Play Store submission
Building with EAS (Recommended)
Step 1: Install EAS CLI
Step 2: Log In to Expo
Step 3: Configure EAS Build
In your project directory:eas.json with build profiles:
eas.json
- 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
Generate keystore
EAS will generate a new keystore for signing:
EAS securely stores your keystore. You can download it later if needed.
Testing the APK
Testing the APK
Install on your Android device:
- Download the APK to your phone
- Open it to install
- You may need to enable “Install from Unknown Sources”
- Test all features
Step 5: Build for iOS
Set up Apple credentials
EAS needs access to your Apple Developer account:You’ll receive a verification code via email/SMS.
Testing the IPA
Testing the IPA
Option 1: TestFlight (Recommended)Install with Apple Configurator or Xcode.
- Upload to App Store Connect
- Add internal testers
- They install via TestFlight app
Step 6: Submit to App Stores
EAS can submit builds automatically! Submit to Google Play:- Google Play Console account
- App created in Play Console
- Service account key (EAS guides you through this)
- 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 nativeios/ and android/ folders:
Build iOS Locally
Configure signing
- Select your project in the navigator
- Go to “Signing & Capabilities”
- Select your team
- Xcode will handle provisioning
Build Android Locally
Running on Physical Devices
Development Builds
Create a development build to test on device:- Include dev menu
- Connect to Metro bundler
- Support Fast Refresh
- Include all your native dependencies
Install on Device
iOS:- Download IPA from EAS dashboard
- Install via Xcode: Window → Devices and Simulators
- Drag IPA onto device
- Download APK from EAS dashboard
- Transfer to device
- Open APK to install
- Or use
adb install app.apk
App Store Guidelines
iOS App Store
App Review Guidelines
App Review Guidelines
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
App Store Connect Setup
App Store Connect Setup
- Create app in App Store Connect
- Fill in metadata:
- Name, subtitle, description
- Keywords
- Category
- Content rating
- Upload screenshots (required sizes)
- Set pricing
- Submit for review
Common Rejection Reasons
Common Rejection Reasons
- Crashes or bugs
- Missing functionality
- Poor user experience
- Privacy policy issues
- Misleading description
- Placeholder content
Google Play Store
Play Console Setup
Play Console Setup
- Create app in Play Console
- Complete store listing:
- Title, description
- Screenshots (phone, tablet, TV)
- Feature graphic
- App icon
- Set content rating (questionnaire)
- Add privacy policy
- Choose countries
- Set pricing
- Upload AAB
Release Tracks
Release Tracks
- 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
App Review Process
App Review Process
Google Play reviews are typically faster than iOS:
- Initial review: Few hours to 2 days
- Updates: Usually faster
- Automated checks run immediately
- 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.
app.json:
app.json
Production Checklist
Before Building
Before Building
- 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 Store Submission
App Store Submission
- 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
Play Store Submission
Play Store Submission
- 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
Build fails with credentials error
Build fails with credentials error
Reset credentials:Select platform and “Remove all credentials” then rebuild.
App crashes on production build
App crashes on production build
Check:
- Running in production mode locally:
- All environment variables set
- API URLs correct (not localhost)
- All assets included
- No development-only code
iOS app rejected
iOS app rejected
Common fixes:
- Add NSPhotoLibraryUsageDescription in app.json
- Ensure privacy policy is accessible
- Test on actual device
- Provide test account
- Remove references to other platforms
Android signing issues
Android signing issues
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