Decide which variants to distribute
apps/mobile/app.config.js creates these bundle identifiers from the base BUNDLE_ID:
Register every identifier that you will sign. The included
dev-store, preview-store, and production-store profiles can all produce store-distribution builds, so each may need its own App ID and App Store Connect app. You can omit non-production store records if you only distribute those variants internally.
Replace starter Apple values
Before creating a build, replace:expo.ios.appleTeamIdinapps/mobile/app.json- Every
submit.<profile>.ios.appleTeamIdinapps/mobile/eas.json - Every
submit.<profile>.ios.ascAppIdinapps/mobile/eas.json
ascAppId is the numeric Apple ID shown in App Store Connect. It is not the bundle identifier.
Register identifiers and capabilities
In Certificates, Identifiers & Profiles, create an explicit App ID for each distributed bundle identifier. Enable only the capabilities your variant needs. The current app configuration requires attention to:- Associated Domains for
applinks:mobile-starter.amisi.ai; replace this domain and host the requiredapple-app-site-associationfile. - Sign in with Apple when using the Apple auth flow. The
expo-apple-authenticationplugin is installed; enable the capability for the App ID and addios.usesAppleSignIn: trueif required by your Expo configuration. - Push Notifications when shipping OneSignal or Expo push notifications.
- Firebase and Google sign-in settings that must match the exact bundle identifier.
expo.ios.associatedDomains in apps/mobile/app.json for your domain. Update the Firebase iOS app and plist for every variant after changing identifiers.
Create App Store Connect records
In App Store Connect:- Open My Apps and create an app.
- Select the registered bundle ID.
- Choose a unique SKU.
- Record the numeric Apple ID as the profile’s
ascAppIdineas.json. - Complete app information, pricing and availability, privacy disclosures, age rating, support and privacy URLs, and version metadata.
Configure signing with EAS
From the mobile app directory, let EAS create or reuse the distribution certificate and provisioning profile:Build and submit
The root production build command creates an internal-distribution artifact. Build the store profile explicitly for App Store Connect:dev-store and preview-store. Ensure their ascAppId values refer to records whose bundle IDs match the .dev and .preview builds.
TestFlight and review checklist
Before review:- Test the exact production-store build through TestFlight.
- Verify login, account deletion where applicable, purchases, restore purchases, notifications, universal links, and offline/error states.
- Provide a working review account when authentication gates functionality.
- Complete App Privacy disclosures for Firebase, analytics, crash reporting, subscriptions, notifications, and any other data collection.
- Add required usage descriptions and explain non-obvious functionality in review notes.
- Confirm screenshots, support URL, privacy policy, export-compliance answers, and contact details.
- Follow Apple’s Sign in with Apple requirements when offering qualifying third-party sign-in options.
Troubleshooting
Bundle ID is unavailable
Use an identifier owned by your team. Bundle IDs are globally unique and become difficult or impossible to change after release.Provisioning profile lacks a capability
Enable the capability on the App ID, update Expo config, and regenerate the provisioning profile witheas credentials before rebuilding.
Build does not appear in App Store Connect
Confirm the build’s bundle ID, App Store Connect record, signing team, andascAppId. Then review EAS submission and App Store Connect processing logs.
Official documentation
- Apple Developer Program
- Certificates, Identifiers & Profiles
- App Store Connect
- App Store Review Guidelines
- TestFlight
- EAS Submit for iOS