Build Options
Expo provides two ways to build your app:EAS Build
Local Builds
Prerequisites
- EAS Build (Recommended)
- Local Builds
- 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:
- 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
Start the build
Choose build type
Generate keystore
Build starts
Download APK/AAB
Testing the APK
Testing the APK
- 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
Start the build
Configure bundle identifier
Set up Apple credentials
Generate certificates
Build starts
Download IPA
.ipa file from the dashboard.Testing the IPA
Testing the IPA
- 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)
Building Locally
Generate Native Projects
First, generate the nativeios/ and android/ folders:
Build iOS Locally
Open in Xcode
Select scheme
Configure signing
- Select your project in the navigator
- Go to “Signing & Capabilities”
- Select your team
- Xcode will handle provisioning
Archive
Distribute
- Window → Organizer
- Select your archive
- Click “Distribute App”
- Choose distribution method:
- App Store Connect (for submission)
- Ad Hoc (for testing)
- Development (for your devices)
Build Android Locally
Generate signing key
Configure Gradle
android/gradle.properties:android/app/build.gradle:Build APK
android/app/build/outputs/apk/release/app-release.apkOr build AAB (for Play Store)
android/app/build/outputs/bundle/release/app-release.aabRunning 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
- 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
- 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: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
App crashes on production build
App crashes on production build
- 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
- 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
- Keystore path correct
- Passwords correct in gradle.properties
- Keystore not corrupted