Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Official Expo AI agent skill for deploying Expo apps to App Store and Google Play.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/ios-app-store.md
1# Submitting to iOS App Store23## Prerequisites451. **Apple Developer Account** - Enroll at [developer.apple.com](https://developer.apple.com)62. **App Store Connect App** - Create your app record before first submission73. **Apple Credentials** - Configure via EAS or environment variables89## Credential Setup1011### Using EAS Credentials1213```bash14eas credentials -p ios15```1617This interactive flow helps you:18- Create or select a distribution certificate19- Create or select a provisioning profile20- Configure App Store Connect API key (recommended)2122### App Store Connect API Key (Recommended)2324API keys avoid 2FA prompts in CI/CD:25261. Go to App Store Connect → Users and Access → Keys272. Click "+" to create a new key283. Select "App Manager" role (minimum for submissions)294. Download the `.p8` key file3031Configure in `eas.json`:3233```json34{35"submit": {36"production": {37"ios": {38"ascApiKeyPath": "./AuthKey_XXXXX.p8",39"ascApiKeyIssuerId": "xxxxx-xxxx-xxxx-xxxx-xxxxx",40"ascApiKeyId": "XXXXXXXXXX"41}42}43}44}45```4647Or use environment variables:4849```bash50EXPO_ASC_API_KEY_PATH=./AuthKey.p851EXPO_ASC_API_KEY_ISSUER_ID=xxxxx-xxxx-xxxx-xxxx-xxxxx52EXPO_ASC_API_KEY_ID=XXXXXXXXXX53```5455### Apple ID Authentication (Alternative)5657For manual submissions, you can use Apple ID:5859```bash61EXPO_APPLE_TEAM_ID=XXXXXXXXXX62```6364Note: Requires app-specific password for accounts with 2FA.6566## Submission Commands6768```bash69# Build and submit to App Store Connect70eas build -p ios --profile production --submit7172# Submit latest build73eas submit -p ios --latest7475# Submit specific build76eas submit -p ios --id BUILD_ID7778# Quick TestFlight submission79npx testflight80```8182## App Store Connect Configuration8384### First-Time Setup8586Before submitting, complete in App Store Connect:87881. **App Information**89- Primary language90- Bundle ID (must match `app.json`)91- SKU (unique identifier)92932. **Pricing and Availability**94- Price tier95- Available countries96973. **App Privacy**98- Privacy policy URL99- Data collection declarations1001014. **App Review Information**102- Contact information103- Demo account (if login required)104- Notes for reviewers105106### EAS Configuration107108```json109{110"cli": {111"version": ">= 16.0.1",112"appVersionSource": "remote"113},114"build": {115"production": {116"ios": {117"resourceClass": "m-medium",118"autoIncrement": true119}120}121},122"submit": {123"production": {124"ios": {125"appleId": "[email protected]",126"ascAppId": "1234567890",127"appleTeamId": "XXXXXXXXXX"128}129}130}131}132```133134Find `ascAppId` in App Store Connect → App Information → Apple ID.135136## TestFlight vs App Store137138### TestFlight (Beta Testing)139140- Builds go to TestFlight automatically after submission141- Internal testers (up to 100) - immediate access142- External testers (up to 10,000) - requires beta review143- Builds expire after 90 days144145### App Store (Production)146147- Requires passing App Review148- Submit for review from App Store Connect149- Choose release timing (immediate, scheduled, manual)150151## App Review Process152153### What Reviewers Check1541551. **Functionality** - App works as described1562. **UI/UX** - Follows Human Interface Guidelines1573. **Content** - Appropriate and accurate1584. **Privacy** - Data handling matches declarations1595. **Legal** - Complies with local laws160161### Common Rejection Reasons162163| Issue | Solution |164|-------|----------|165| Crashes/bugs | Test thoroughly before submission |166| Incomplete metadata | Fill all required fields |167| Placeholder content | Remove "lorem ipsum" and test data |168| Missing login credentials | Provide demo account |169| Privacy policy missing | Add URL in App Store Connect |170| Guideline 4.2 (minimum functionality) | Ensure app provides value |171172### Expedited Review173174Request expedited review for:175- Critical bug fixes176- Time-sensitive events177- Security issues178179Go to App Store Connect → your app → App Review → Request Expedited Review.180181## Version and Build Numbers182183iOS uses two version identifiers:184185- **Version** (`CFBundleShortVersionString`): User-facing, e.g., "1.2.3"186- **Build Number** (`CFBundleVersion`): Internal, must increment for each upload187188Configure in `app.json`:189190```json191{192"expo": {193"version": "1.2.3",194"ios": {195"buildNumber": "1"196}197}198}199```200201With `autoIncrement: true`, EAS handles build numbers automatically.202203## Release Options204205### Automatic Release206207Release immediately when approved:208209```json210{211"apple": {212"release": {213"automaticRelease": true214}215}216}217```218219### Scheduled Release220221```json222{223"apple": {224"release": {225"automaticRelease": "2025-03-01T10:00:00Z"226}227}228}229```230231### Phased Release232233Gradual rollout over 7 days:234235```json236{237"apple": {238"release": {239"phasedRelease": true240}241}242}243```244245Rollout: Day 1 (1%) → Day 2 (2%) → Day 3 (5%) → Day 4 (10%) → Day 5 (20%) → Day 6 (50%) → Day 7 (100%)246247## Certificates and Provisioning248249### Distribution Certificate250251- Required for App Store submissions252- Limited to 3 per Apple Developer account253- Valid for 1 year254- EAS manages automatically255256### Provisioning Profile257258- Links app, certificate, and entitlements259- App Store profiles don't include device UDIDs260- EAS creates and manages automatically261262### Check Current Credentials263264```bash265eas credentials -p ios266267# Sync with Apple Developer Portal268eas credentials -p ios --sync269```270271## App Store Metadata272273Use EAS Metadata to manage App Store listing from code:274275```bash276# Pull existing metadata277eas metadata:pull278279# Push changes280eas metadata:push281```282283See ./app-store-metadata.md for detailed configuration.284285## Troubleshooting286287### "No suitable application records found"288289Create the app in App Store Connect first with matching bundle ID.290291### "The bundle version must be higher"292293Increment build number. With `autoIncrement: true`, this is automatic.294295### "Missing compliance information"296297Add export compliance to `app.json`:298299```json300{301"expo": {302"ios": {303"config": {304"usesNonExemptEncryption": false305}306}307}308}309```310311### "Invalid provisioning profile"312313```bash314eas credentials -p ios --sync315```316317### Build stuck in "Processing"318319App Store Connect processing can take 5-30 minutes. Check status in App Store Connect → TestFlight.320321## CI/CD Integration322323For automated submissions in CI/CD:324325```yaml326# .eas/workflows/release.yml327name: Release to App Store328329on:330push:331tags: ['v*']332333jobs:334build:335type: build336params:337platform: ios338profile: production339340submit:341type: submit342needs: [build]343params:344platform: ios345profile: production346```347348## Tips349350- Submit to TestFlight early and often for feedback351- Use beta app review for external testers to catch issues before App Store review352- Respond to reviewer questions promptly in App Store Connect353- Keep demo account credentials up to date354- Monitor App Store Connect notifications for review updates355- Use phased release for major updates to catch issues early356