DEV Community

Cathy Lai
Cathy Lai

Posted on

How to Build and Test iOS Apps on a Physical Phone: Expo EAS and Apple TestFlight (Part 2/3)

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Again the bundle identifier is unique in the App Store.

Project Credentials Configuration

Project                   @cathyapp1234/oauth-pro2
Bundle Identifier         com.cathyapp1234.oauthpro2
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)

Collapse
 
bhavin-allinonetools profile image
Bhavin Sheth

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.

Collapse
 
cathylai profile image
Cathy Lai • Edited

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.