In Part 1, we've checked in the React Native code on the GitHub. Now we will build the binary with Expo EAS (Expo Application Service) service.
EAS Build
Production (store-signed) binary
eas build --platform ios --profile production
When prompted, let EAS manage:
- certificates
- provisioning profiles
- signing
This produces an App Store–signed IPA.
Resolved "production" environment for the build. Learn more: https://docs.expo.dev/eas/environment-variables/#setting-the-environment-for-your-builds
....
✔ Incremented buildNumber from x to y.
✔ Using remote iOS credentials (Expo server)
If you provide your Apple account credentials we will be able to generate all necessary build credentials and fully validate them.
...
✔ Do you want to log in to your Apple account? … yes
› Log in to your Apple Developer account to continue
✔ Apple ID: … cathy.xxxx@xxxxx.com
› Restoring session /Users/cathy/.app-store/auth/cathy.xxxx@xxxxx.com/cookie
› Session expired Local session
› Using password for cathy.xxxx@xxxxx.com from your local Keychain
Learn more: https://docs.expo.dev/distribution/security#keychain
✔ Logged in New session
› Team Cathy Lai (XXXXXX)
› Provider Cathy Lai (xxxxxxxx)
✔ Bundle identifier registered com.cathyapp1234.oauthpro2
✔ Synced capabilities: No updates
✔ Synced capability identifiers: No updates
✔ Fetched Apple distribution certificates
✔ Fetched Apple provisioning profiles
Again the bundle identifier is unique in the App Store.
Project Credentials Configuration
Project @cathyapp1234/oauth-pro2
Bundle Identifier com.cathyapp1234.oauthpro2
Distribution Certificate and Provisioning Profiles are auto generated. It is the "permission slip" from Apple to allow the binary to run on the specific phones.
In the Apple ecosystem, we can’t just drag and drop an app file onto an iPhone like we can with a .exe on a PC. Apple requires a strict chain of trust to ensure that the app is legitimate, created by a verified developer, and running on an authorized device.
App Store Configuration
Distribution Certificate
Serial Number XXXXXXXDA97EA34FFC3B28C8BA6C44
Expiration Date Tue, 04 Aug 2026 05:10:17 GMT+1200
Apple Team XXXXXX (Cathy Lai (Individual))
Updated 6 months ago
Provisioning Profile
Developer Portal ID XxXXXXXXXX
Status active
Expiration Tue, 04 Aug 2026 05:10:17 GMT+1200
Apple Team XXXXXXXXXX (Cathy Lai (Individual))
Updated 17 days ago
All credentials are ready to build @cathyapp1234/oauth-pro2 (com.cathyapp1234.oauthpro2)
Compressing project files and uploading to EAS Build. Learn more: https://expo.fyi/eas-build-archive
✔ Uploaded to EAS 1s
✔ Computed project fingerprint
See logs: https://expo.dev/accounts/cathyapp1234/projects/oauth-pro2/builds/xxxxxxx
Waiting for build to complete. You can press Ctrl+C to exit.
Build queued...
Waiting in priority queue
|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■|
✔ Build finished
🍏 iOS app:
https://expo.dev/artifacts/eas/xxxxxxxxx.ipa
EAS submit
Then we submit to the same profile.
eas submit --profile production
Follow the prompts to select the correct configs (platforms, etc) :
✔ Select platform › iOS
✔ What would you like to submit? › Select a build from EAS
✔ Which build would you like to submit? › - ID: 5841b2f1-b3c1-4b4b-93d2-b3b587744843 (11 days ago)
Ensuring your app exists on App Store Connect. This step can be skipped by providing ascAppId in the
submit profile. Learn more: https://expo.fyi/asc-app-id
Login again for App Store
› Log in to your Apple Developer account to continue
✔ Apple ID: … cathyl.apple@gmail.com
› Restoring session /Users/cathy/.app-store/auth/cathyl.apple@gmail.com/cookie
› Session expired Local session
› Using password for cathyl.apple@gmail.com from your local Keychain
Learn more: https://docs.expo.dev/distribution/security#keychain
✔ Logged in, verify your Apple account to continue
Two-factor Authentication (6 digit code) is enabled for cathyl.apple@gmail.com. Learn more: https://support.apple.com/en-us/HT204915
✔ How do you want to validate your account? … device / sms
✔ Please enter the 6 digit code … 429798
✔ Valid code
✔ Logged in and verified
› Team Cathy Lai (VJ2LKA46QZ)
› Provider Cathy Lai (124547644)
✔ Bundle identifier registered com.cathyapp1234.oauthpro2
✔ Prepared App Store Connect for oauth-pro2 com.cathyapp1234.oauthpro2
Looking up credentials configuration for com.cathyapp1234.oauthpro2...
✔ App Store Connect API Key already set up.
Using Api Key ID: VWQTD6L5L3 ([Expo] EAS Submit MnT3S3wHKr)
ASC App ID: 6758167617
Project ID: a31c0453-d16e-4818-aa19-d380a5bfc5d4
App Store Connect API Key:
Key Name : [Expo] EAS Submit MnT3S3wHKr
Key ID : VWQTD6L5L3
Key Source: EAS servers
Build:
Build ID : 5841b2f1-b3c1-4b4b-93d2-b3b587744843
Build Date : 13/02/2026, 8:36:43 am
App Version : 1.0.0
Build number: 7
Then EAS will schedule the submission:
✔ Scheduled iOS submission
Submission details: xxxx
Waiting for submission to complete. You can press Ctrl+C to exit.
⠼
Expo will auto-create the app in App Store Connect
- App record created
- Bundle ID registered
- Build uploaded
- Appears in TestFlight
Next
We will add some testers (via emails) in Part 3so they can be notified and get a link to TestFlight to access our app.
Join Me
Watch me build my prototype app and submit it to the App Store!


Top comments (2)
This brings back memories 😄 The first time I built with EAS and saw the IPA appear in TestFlight, it finally felt “real.” One small tip from my side: always double-check the bundle identifier early — changing it later can create a lot of confusion with certificates and profiles. Letting EAS manage signing saved me hours. Nice step-by-step breakdown, this will help many people avoid the usual headaches.
Thanks Bhavin!
Yes I always felt deploying early is important, as the code always look perfect on the development machine but not necessarily on the devices. Best to test early and often.
Thanks for the tip - yes it’s important to use a sensible bundle ID right in the beginning.