Subchapter 3.2
references/ios-app-store.mdMarkdown8 KBView on GitHub
eas credentials -p iosThis interactive flow helps you:
API keys avoid 2FA prompts in CI/CD:
.p8 key fileConfigure in eas.json:
{
"submit": {
"production": {
"ios": {
"ascApiKeyPath": "./AuthKey_XXXXX.p8",
"ascApiKeyIssuerId": "xxxxx-xxxx-xxxx-xxxx-xxxxx",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}Or use environment variables:
EXPO_ASC_API_KEY_PATH=./AuthKey.p8
EXPO_ASC_API_KEY_ISSUER_ID=xxxxx-xxxx-xxxx-xxxx-xxxxx
EXPO_ASC_API_KEY_ID=XXXXXXXXXXFor manual submissions, you can use Apple ID:
EXPO_APPLE_ID=your@email.com
EXPO_APPLE_TEAM_ID=XXXXXXXXXXNote: Requires app-specific password for accounts with 2FA.
# Build and submit to App Store Connect
eas build -p ios --profile production --submit
# Submit latest build
eas submit -p ios --latest
# Submit specific build
eas submit -p ios --id BUILD_ID
# Quick TestFlight submission
npx testflightBefore submitting, complete in App Store Connect:
App Information
app.json)Pricing and Availability
App Privacy
App Review Information
{
"cli": {
"version": ">= 16.0.1",
"appVersionSource": "remote"
},
"build": {
"production": {
"ios": {
"resourceClass": "m-medium",
"autoIncrement": true
}
}
},
"submit": {
"production": {
"ios": {
"appleId": "your@email.com",
"ascAppId": "1234567890",
"appleTeamId": "XXXXXXXXXX"
}
}
}
}Find ascAppId in App Store Connect → App Information → Apple ID.
| Issue | Solution |
|---|---|
| Crashes/bugs | Test thoroughly before submission |
| Incomplete metadata | Fill all required fields |
| Placeholder content | Remove “lorem ipsum” and test data |
| Missing login credentials | Provide demo account |
| Privacy policy missing | Add URL in App Store Connect |
| Guideline 4.2 (minimum functionality) | Ensure app provides value |
Request expedited review for:
Go to App Store Connect → your app → App Review → Request Expedited Review.
iOS uses two version identifiers:
CFBundleShortVersionString): User-facing, e.g., “1.2.3”CFBundleVersion): Internal, must increment for each uploadConfigure in app.json:
{
"expo": {
"version": "1.2.3",
"ios": {
"buildNumber": "1"
}
}
}With autoIncrement: true, EAS handles build numbers automatically.
Release immediately when approved:
{
"apple": {
"release": {
"automaticRelease": true
}
}
}{
"apple": {
"release": {
"automaticRelease": "2025-03-01T10:00:00Z"
}
}
}Gradual rollout over 7 days:
{
"apple": {
"release": {
"phasedRelease": true
}
}
}Rollout: Day 1 (1%) → Day 2 (2%) → Day 3 (5%) → Day 4 (10%) → Day 5 (20%) → Day 6 (50%) → Day 7 (100%)
eas credentials -p ios
# Sync with Apple Developer Portal
eas credentials -p ios --syncUse EAS Metadata to manage App Store listing from code:
# Pull existing metadata
eas metadata:pull
# Push changes
eas metadata:pushSee ./app-store-metadata.md for detailed configuration.
Create the app in App Store Connect first with matching bundle ID.
Increment build number. With autoIncrement: true, this is automatic.
Add export compliance to app.json:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}eas credentials -p ios --syncApp Store Connect processing can take 5-30 minutes. Check status in App Store Connect → TestFlight.
For automated submissions in CI/CD:
# .eas/workflows/release.yml
name: Release to App Store
on:
push:
tags: ['v*']
jobs:
build:
type: build
params:
platform: ios
profile: production
submit:
type: submit
needs: [build]
params:
platform: ios
profile: production