Run Your Expo App on a Physical Phone (with a Development Build) โ€” Expo 53 + Expo Router

  • Thread starter Thread starter Cathy Lai
  • Start date Start date
C

Cathy Lai

Guest
Hot reloading on device, native modules, fast iteration โ€” without the App Store or Play Store hassle.

Tags: expo, reactnative, mobile, eas, devops

Works with: Expo SDK 53, Expo Router, EAS Build/Submit

Why a โ€œdevelopment buildโ€?​


A development build is your own custom โ€œExpo Goโ€โ€”it includes your appโ€™s native plugins and permissions so you can test everything on a real device with hot reload. You install it once, then iterate quickly via expo start --dev-client.

TL;DR (after youโ€™ve done it once)​


Code:
# 1) Start the dev server
npx expo start --dev-client

# 2) On your phone
# Open your installed development build and scan the QR code

# 3) Code, save, hot-reload
# Rebuild only if you change native stuff (plugins, permissions, SDK version)

Prereqs​

  • Node + npm/yarn installed
  • Logged in to Expo: npx expo login (or npx expo whoami)
  • EAS CLI: npm i -g eas-cli
  • Same Wi-Fi for computer & phone (or use tunnel)

iOS specific

  • iOS 16+ recommended
  • Settings โ†’ Privacy & Security โ†’ Developer Mode: On (iOS will reboot when enabling)

Android specific

  • Enable Developer options and USB debugging (if installing via USB/ADB)

1) Add a development profile​


Create or update eas.json in your project root:


Code:
{
  "cli": { "version": ">= 10.0.0" },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "ios": { "resourceClass": "m-medium" },
      "android": {}
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {
      "autoIncrement": "version"
    }
  },
  "submit": {
    "production": {}
  }
}
developmentClient: true tells EAS to build a dev client (your custom Expo Go) that includes your native modules.

2) Build the development client (install it once)​

iOS​


Code:
eas build -p ios --profile development
  • First time? EAS will help register your device (UDID) via QR.
  • Let EAS manage certs/profiles.
  • When the build is done, open the build page and tap Install on your iPhone.
  • If prompted, trust the developer and ensure Developer Mode is enabled.

Android​


Code:
eas build -p android --profile development
  • Youโ€™ll get an APK (or AAB if configured).
  • Install options:
    • From the EAS build page, scan the install QR on your phone, or
    • Via USB: adb install your-app.apk (authorize USB debugging)

3) Day-to-day: run it on your phone​


Code:
npx expo start --dev-client
  • Open the development build on your phone (it has your app name/icon).
  • Scan the QR from the terminal or web UI.
  • Edit code โ†’ save โ†’ hot refresh.
  • Rebuild only when you change native stuff:
    • Add/modify a plugin or native module
    • Change iOS/Android permissions/capabilities
    • Upgrade Expo SDK / React Native version

Copy-paste cheatsheets​

iOS (wireless)​


Code:
# First time (one-time)
eas build -p ios --profile development

# Every day
npx expo start --dev-client
# then open the dev client on iPhone and scan the QR

Android (wireless or USB)​


Code:
# One-time
eas build -p android --profile development

# Daily run
npx expo start --dev-client
# open dev client on Android and scan QR

# If Metro canโ€™t connect over Wi-Fi:
adb reverse tcp:8081 tcp:8081   # optional; maps device port to your machine

Using Expo Router? Youโ€™re good โœ…


Dev clients work great with Expo Router. Changes to routes, screens, links, and layouts hot-reload instantly. Only native changes need a rebuild.

Troubleshooting​


Stuck on โ€œConnectingโ€ฆโ€

  • Computer and phone on the same network
  • Try a tunnel: npx expo start --tunnel (bypasses weird Wi-Fi)
  • Kill other packagers using port 8081

iOS wonโ€™t install

  • Make sure the iPhone is registered on your Apple team and rebuild after registration
  • Enable Developer Mode and trust the developer certificate
  • Reinstall from the EAS build page if the app was removed

Changes not showing

  • Shake device โ†’ Reload in the dev client
  • Clear cache: rm -rf .expo && npx expo start -c

โ€œDo I really need to rebuild?โ€ quick test

  • If you only changed JS/TS/Router code โ†’ No
  • If you added/changed a plugin, permission, or SDK version โ†’ Yes

Bonus: instant OTA updates (for preview/production)​


This is not required for dev clients, but useful for internal testers or production:

1) In eas.json, keep a preview or production profile.

2) In app.json/app.config.ts, ensure expo-updates is configured (SDK 53 has it by default).

3) To push an update:


Code:
eas update --branch preview --message "Fix copy on home screen"

4) For โ€œupdate immediately on launchโ€, set:


Code:
updates: {
  enabled: true,
  checkOnLaunch: "ALWAYS",
  fallbackToCacheTimeout: 0
}
Use this in non-dev builds where you want users to fetch new JS quickly. (Dev clients already stream from Metro.)

FAQs​


Can I use the App/Play Store for dev?

Noโ€”dev clients are installed via EAS internal distribution. Thatโ€™s the point: fast iteration without the stores.

Can teammates use my dev build?

Yes. Add their devices to your Apple team (iOS) or share the Android APK/QR. Theyโ€™ll scan your Metro QR when you run expo start --dev-client.

How do I debug native issues?

  • iOS: open the native project in Xcode (generated when you run npx expo prebuild or if you use bare).
  • Android: use Android Studio + Logcat.
  • JS debugging: React DevTools, console logs, or Flipper.

Final checklist​

  • [ ] eas.json has a "development" profile with "developmentClient": true
  • [ ] Built and installed the dev client on each device (one-time)
  • [ ] npx expo start --dev-client running locally
  • [ ] Phone + computer on same network (or using --tunnel)
  • [ ] Rebuild only when you change native config

If you want, drop your iOS bundle ID and Android applicationId, and Iโ€™ll give you a copy-paste script tailored to your setup. Happy building! ๐Ÿš€

Continue reading...
 


Join ๐•‹๐•„๐•‹ on Telegram
Channel PREVIEW:
Back
Top