App Store Deployment
Build, submit, and publish your mobile app to the Apple App Store with EAS Build and EAS Submit.
App Store Deployment
This guide covers building your iOS app with EAS, submitting to the App Store, and navigating the review process.
Prerequisites
- Apple Developer account — $99/year at developer.apple.com
- App registered in App Store Connect — appstoreconnect.apple.com
- EAS CLI installed and logged in
1. Prepare Your App
Update app.json before your first production build:
{
"expo": {
"name": "Your App Name",
"slug": "your-app-slug",
"version": "1.0.0",
"ios": {
"bundleIdentifier": "com.yourcompany.yourapp",
"buildNumber": "1",
"supportsTablet": true
}
}
}Important: The
bundleIdentifiercannot be changed after publishing to the App Store. Choose carefully.
2. Build with EAS
eas build --platform ios --profile productionEAS handles certificate and provisioning profile management automatically. On your first build, it will:
- Create a Distribution Certificate
- Create a Provisioning Profile
- Store them securely on EAS servers
The build takes approximately 10-20 minutes. You can monitor progress on expo.dev.
3. Submit to App Store
eas submit --platform iosEAS Submit uploads the build to App Store Connect. You will need your Apple ID and an app-specific password (generate one at appleid.apple.com).
4. Complete the Submission
In App Store Connect, fill in the required metadata:
- Screenshots — Required for 6.7" and 5.5" iPhone sizes (iPad if you support tablets)
- Description — App description, keywords, support URL
- Privacy policy URL — Required for all apps
- App category — Select the most relevant category
- Review notes — Provide a demo account if sign-up requires verification
Review Notes Template
Demo account:
Email: reviewer@example.com
Password: ReviewTest123!
This app requires an internet connection.
Push notifications are optional.App Store Review Process
Apple reviews typically take 24-48 hours (can be longer for first submissions). Your app may be approved, rejected, or put on hold.
Common Rejection Reasons
| Reason | How to Avoid |
|---|---|
| Broken login | Provide a working demo account in review notes |
| Missing privacy policy | Add a privacy policy URL in App Store Connect and in-app |
| Incomplete metadata | Provide screenshots for all required device sizes |
| Crash on launch | Test the production build on a real device before submitting |
| No Apple Sign-In | If you offer Google OAuth, you must also offer Apple Sign-In on iOS |
| Wrong purchase method | Digital goods must use Apple's In-App Purchase (Stripe is only for physical goods/services) |
| Missing usage descriptions | If using camera, location, etc., add purpose strings to app.json |
Version Bumping
For each new release, increment the version and build number in app.json:
{
"expo": {
"version": "1.1.0",
"ios": {
"buildNumber": "2"
}
}
}The version is shown to users. The buildNumber must be unique per submission.
Environment Variables
Set production environment variables for EAS builds:
eas secret:create --name EXPO_PUBLIC_SUPABASE_URL \
--value "https://prod.supabase.co" --scope projectOr configure them in eas.json:
{
"build": {
"production": {
"env": {
"EXPO_PUBLIC_SUPABASE_URL": "https://prod.supabase.co"
}
}
}
}