App Store Deployment
Deploy your iOS app to the App Store
App Store Deployment
This guide walks you through building your iOS app and shipping it to the App Store, from account setup to approval.
Quick Start
Already have an Apple Developer Account and App Store Connect app created? Run these commands:
# 1. Build production IPA
yarn build:prod
# 2. Submit to App Store Connect
eas submit --platform ios --profile productionEAS handles code signing, provisioning profiles, and upload automatically. Your build will appear in App Store Connect within minutes.
First time deploying to iOS? Follow the full guide below. It takes about 30 minutes to set everything up.
Full Guide
Prerequisites
Before you start, make sure you have:
- Apple Developer Account ($99/year), developer.apple.com
- Mac computer (required for Transporter upload, optional if using
eas submit) - Xcode installed (latest version from Mac App Store)
- App built and tested locally with
yarn ios - App assets ready (1024x1024 icon, screenshots, description, privacy policy URL)
Part 1: Apple Developer Account Setup
Step 1: Join the Apple Developer Program
- Visit developer.apple.com/programs
- Click "Enroll"
- Sign in with your Apple ID (or create one)
- Choose your account type:
- Individual, For personal apps ($99/year)
- Organization, For company apps ($99/year, requires a D-U-N-S number)
- Complete payment
- Wait for approval (usually 24–48 hours)
Organization accounts require a D-U-N-S number, which can take 1–2 weeks to obtain. Start early if you need one. Check if you already have one at dnb.com.
Step 2: Enable Two-Factor Authentication
Two-factor authentication is required for App Store Connect access.
- Go to appleid.apple.com
- Navigate to Sign-In and Security → Two-Factor Authentication
- Follow the prompts to enable it
Step 3: Generate an App-Specific Password (for EAS Submit)
If you plan to use eas submit from the command line:
- Go to appleid.apple.com
- Navigate to Sign-In and Security → App-Specific Passwords
- Click "Generate" and name it "EAS Submit"
- Save this password, you'll need it when running
eas submit
Part 2: App Store Connect Setup
Step 1: Create Your App
- Go to appstoreconnect.apple.com
- Click "My Apps" → "+" → "New App"
- Fill in the details:
| Field | Value |
|---|---|
| Platforms | iOS |
| Name | Your app name (max 30 characters, must be unique on the App Store) |
| Primary Language | Your main language |
| Bundle ID | Must match bundleIdentifier in your app.json (e.g., com.yourcompany.yourapp) |
| SKU | A unique identifier (e.g., yourapp_ios_v1) |
| User Access | Full Access |
Bundle ID not showing? You need to register it first in the Apple Developer Portal → Identifiers → "+" → App IDs.
Step 2: Complete App Information
In App Store Connect, navigate through these tabs to fill in your app details:
App Information Tab
- Category: Select a Primary category (e.g., Productivity, Lifestyle) and optionally a Secondary
- Content Rights: Declare if your app uses third-party content
- Age Rating: Complete the questionnaire (takes 2 minutes)
Pricing and Availability Tab
- Price: Free or select a price tier
- Availability: Select countries where your app will be available
Privacy Tab
- Click "Get Started" under App Privacy
- Declare data collection practices for each category:
- Contact Info, User Content, Identifiers, Usage Data, etc.
- Link your Privacy Policy URL (required)
Version Information Tab
This is where you add your store listing content:
| Field | Details |
|---|---|
| Screenshots | Required for 6.7" (iPhone 15 Pro Max) and 6.5" (iPhone 11 Pro Max). iPad screenshots needed if supportsTablet: true. |
| Description | Max 4,000 characters. First 3 lines are visible before "more". |
| Keywords | Max 100 characters, comma-separated (e.g., ai,productivity,planner) |
| Support URL | Your support page or contact link |
| Marketing URL | Your app's website (optional) |
| What's New | Release notes for this version |
Screenshot sizes: Use a tool like Screenshots Pro or AppMockUp to generate store-ready screenshots with device frames. You need at minimum 6.7" and 6.5" iPhone sizes.
Part 3: Project Configuration
Update app.json
Ensure your app.json has the correct iOS configuration:
{
"expo": {
"name": "Your App Name",
"slug": "your-app-slug",
"version": "1.0.0",
"ios": {
"bundleIdentifier": "com.yourcompany.yourapp",
"buildNumber": "1",
"supportsTablet": true,
"infoPlist": {
"NSCameraUsageDescription": "This app uses the camera to take photos.",
"NSPhotoLibraryUsageDescription": "This app accesses your photos to let you choose a profile picture."
}
}
}
}Remove unused permissions! Apple will reject your app if you request permissions you don't use. Only include infoPlist entries for features your app actually uses.
Configure EAS Submit
Add your Apple credentials to eas.json so EAS can upload builds automatically:
{
"submit": {
"production": {
"ios": {
"appleId": "your@email.com",
"ascAppId": "1234567890",
"appleTeamId": "ABC123DEF4"
}
}
}
}Where to find these values:
| Field | Where to Find |
|---|---|
appleId | Your Apple ID email |
ascAppId | App Store Connect → Your App → General → App Information → Apple ID (numeric) |
appleTeamId | developer.apple.com/account → Membership Details → Team ID |
Part 4: Build & Submit
Step 1: Run the Production Build
yarn build:prodThis triggers an EAS cloud build that:
- Compiles your app for iOS
- Signs it with your provisioning profile (EAS manages this automatically)
- Generates an
.ipafile - Stores it on your Expo dashboard
First build? EAS will prompt you to log in and may ask you to select or create credentials. Follow the prompts, EAS handles provisioning profiles and certificates automatically.
The build typically takes 10–20 minutes. You can monitor progress at expo.dev.
Step 2: Upload to App Store
Choose one of these methods:
Option A: EAS Submit (Recommended)
The fastest way, runs entirely from the command line:
eas submit --platform ios --profile productionEAS will ask you to select a build and then upload it directly to App Store Connect.
Option B: Transporter App (Manual)
If you prefer a visual tool:
- Download Transporter from the Mac App Store
- Sign in with your Apple ID
- Download your
.ipafrom the Expo dashboard → your project → Builds - Drag and drop the
.ipainto Transporter - Click "Deliver"
Transporter gives more detailed error messages if something goes wrong.
Privacy Manifests (Required since 2024)
Apple requires a PrivacyInfo.xcprivacy file for apps using certain APIs. Expo SDK 50+ handles this automatically when configured in app.json:
"ios": {
"privacyManifests": {
"NSPrivacyAccessedAPITypes": [
{
"NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryFileTimestamp",
"NSPrivacyAccessedAPITypeReasons": ["C617.1"]
},
{
"NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults",
"NSPrivacyAccessedAPITypeReasons": ["CA92.1"]
}
]
}
}If you receive emails from Apple about missing privacy manifests, check Expo's privacy manifest docs for the latest required entries.
Part 5: TestFlight & App Review
TestFlight Beta Testing
Before releasing publicly, test with real users via TestFlight.
Internal Testing (No Review)
- Go to TestFlight tab in App Store Connect
- Click "+" next to Internal Group to create a group
- Add team members by email (up to 100 internal testers)
- Testers receive an email with a link to install via the TestFlight app
- Builds are available immediately, no review required
External Testing (Requires Review)
- Click "+" next to External Group to create a group
- Add testers by email or generate a public link
- Fill in the beta test details (what to test, contact info)
- Submit for Beta App Review (usually approved within 24 hours)
- External testers can then install via TestFlight
Submit for App Review
Once you're satisfied with testing:
- Go to the App Store tab → select your version (e.g., 1.0)
- Scroll to Build → click "+" → select your uploaded build
- Fill in App Review Information:
- Contact info: Name, phone, email
- Demo account: If your app requires login, provide test credentials
- Notes: Any special instructions for the reviewer
- Verify all metadata, screenshots, and privacy info are complete
- Click "Submit for Review"
Review Timeline
| Review Type | Typical Duration |
|---|---|
| Beta App Review | 24 hours |
| First App Review | 24–48 hours |
| Update Review | 24 hours |
| Expedited Review | Same day (request via Apple's form) |
Common rejection reasons: Missing privacy policy, requesting unused permissions, incomplete metadata, crashes during review. Test thoroughly before submitting.
Common Issues
| Issue | Solution |
|---|---|
| "Missing Compliance" | In App Store Connect, select "No" for encryption export if you only use standard HTTPS (no custom encryption). |
| Privacy Manifest emails | Update expo-secure-store and add the required API types to privacyManifests in app.json. |
| Bundle ID mismatch | Ensure bundleIdentifier in app.json matches exactly what's registered in App Store Connect. |
| Build fails with signing error | Run eas credentials to check/reset your iOS credentials. EAS manages them automatically but sometimes needs a refresh. |
| "Invalid Binary" after upload | Usually a missing NSPrivacyAccessedAPITypes entry. Check Apple's email for the specific issue. |
| App rejected for permissions | Remove any infoPlist permission strings for features you don't use. |
| Screenshots rejected | Ensure screenshots show actual app content (no placeholder text) and match the selected device sizes. |
Next Steps
- Google Play Deployment, Deploy your Android version
- CI/CD Setup, Automate builds with GitHub Actions