| name | apple-appstore-setup |
| description | Set up Apple Developer account, App Store Connect app listing, and EAS credentials for iOS builds and TestFlight distribution. Use when creating a new iOS app, configuring Apple certificates/provisioning, or troubleshooting App Store Connect submission issues. |
Apple App Store Setup
Prerequisites
- Apple Developer Program membership ($99/year) at developer.apple.com
- Xcode installed (for Simulator; not required for EAS cloud builds)
- EAS CLI:
npm install -g eas-cli && eas login
Step 1: Configure App Identifier
- Go to developer.apple.com/account/resources/identifiers
- Click + → App IDs → App
- Fill in:
- Description: Your app name
- Bundle ID: Explicit —
com.yourorg.appname (must match ios.bundleIdentifier in app.json)
- Enable capabilities you need: Push Notifications, Sign in with Apple, Associated Domains (deep links)
- Register
Bundle ID in app.json:
{
"expo": {
"ios": {
"bundleIdentifier": "com.yourorg.appname"
}
}
}
Step 2: Create App Store Connect Listing
- Go to appstoreconnect.apple.com
- My Apps → + → New App
- Fill in:
- Platform: iOS
- Name: Your app display name
- Primary Language: English (or your language)
- Bundle ID: Select the one you just registered
- SKU: Unique internal identifier (e.g.
com-yourorg-appname)
- Create
Note the App ID (10-digit number) from the URL: appstoreconnect.apple.com/apps/XXXXXXXXXX — you need this for eas.json.
Step 3: Configure EAS Credentials
EAS manages certificates and provisioning profiles in the cloud. Run once per app:
cd mobile
eas credentials --platform ios
Select: production → Manage credentials → let EAS generate certificates automatically.
Then set up the App Store Connect API Key for submissions (required for eas submit to work):
eas credentials --platform ios
Select: production → App Store Connect: Manage your API Key → Set up your project to use an API Key for EAS Submit
Follow the prompts — EAS will ask for your Key ID, Issuer ID, and .p8 file. This is separate from build credentials and must be done before the first eas submit.
EAS stores everything encrypted on its servers — no local .p12 files needed.
Step 4: Configure eas.json
{
"cli": {
"version": ">= 12.0.0",
"appVersionSource": "remote"
},
"build": {
"production": {
"distribution": "store",
"autoIncrement": true,
"env": {
"EXPO_PUBLIC_SUPABASE_URL": "https://xxx.supabase.co",
"EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY": "eyJ..."
}
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "XXXXXXXXXX"
}
}
}
}
ascAppId is the 10-digit App ID from App Store Connect.
Step 5: App Store Connect API Key (for CI/CD)
Required for non-interactive submissions from GitHub Actions.
- appstoreconnect.apple.com/access/api
- Keys → +
- Name:
CI/CD, Access: App Manager
- Download the
.p8 file — download once only
- Note the Key ID (10 chars) and Issuer ID (UUID at top of page)
Upload to EAS (run once):
eas secret:create --scope project --name APPLE_API_KEY_P8 --value "$(cat AuthKey_XXXXXXXXXX.p8 | base64)"
eas secret:create --scope project --name APPLE_API_KEY_ID --value "XXXXXXXXXX"
eas secret:create --scope project --name APPLE_API_KEY_ISSUER --value "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Or add to GitHub Actions secrets (see dev-to-prod.sh output).
Step 6: First Build and TestFlight
cd mobile
eas build --platform ios --profile production
eas build:list --platform ios
eas submit --platform ios --profile production --latest
After submission, Apple processes the build for 10–15 minutes, then it appears in TestFlight.
Add internal testers: App Store Connect → TestFlight → Internal Testing → Add testers.
App Store Submission Checklist
Before submitting for App Review:
Generate screenshots with Maestro or manually in Simulator: Device → Take Screenshot.
iOS vs Android: Key Difference
iOS creates everything automatically — EAS handles provisioning profiles, certificates, and push notification entitlements. You create the App Store Connect listing once and EAS does the rest. No manual cert management needed.
Android is the opposite: the first AAB upload must be done manually, service accounts must be created manually, and the Play Console listing has many required forms to fill before publishing.
Gotchas
"Missing compliance" — Set ITSAppUsesNonExemptEncryption = false in app.json if your app doesn't use custom encryption (most apps):
{ "expo": { "ios": { "infoPlist": { "ITSAppUsesNonExemptEncryption": false } } } }
"Bundle ID already registered" — Someone else (or a previous project) used that bundle ID. Choose a unique one.
Build number conflict — Always use appVersionSource: "remote" + autoIncrement: true to avoid this.
TestFlight build missing after 15 min — Check App Store Connect → Activity for processing errors. Usually a missing compliance declaration.
"Invalid API key" — The .p8 file must be base64-encoded before storing as a secret. Verify with echo $APPLE_API_KEY_P8 | base64 -d | head -1 — should show -----BEGIN PRIVATE KEY-----.
Signing certificate expired — Run eas credentials --platform ios and select "Remove" then re-generate. EAS handles this automatically.
eas submit fails with "Set ascAppId in the submit profile" — Add the 10-digit App ID to eas.json:
{ "submit": { "production": { "ios": { "ascAppId": "6758882748" } } } }
Get it from the App Store Connect URL: appstoreconnect.apple.com/apps/XXXXXXXXXX.
eas submit fails with "no API key configured" — Run eas credentials --platform ios → production → App Store Connect: Manage your API Key and complete the setup. Build credentials and submit credentials are configured separately.