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.
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 3 to 4.
✔ 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
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) so they can be notified and get a link to TestFlight to access our app.
Video of the whole process.
Please view this video for more information.


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.