DEV Community

Cathy Lai
Cathy Lai

Posted on • Edited on

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

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
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 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
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

EAS submit

Then we submit to the same profile.

eas submit --profile production
Enter fullscreen mode Exit fullscreen mode

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

Enter fullscreen mode Exit fullscreen mode

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

Then EAS will schedule the submission:

✔ Scheduled iOS submission

Submission details: xxxx
Waiting for submission to complete. You can press Ctrl+C to exit.
⠼
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) 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)

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.