# Expo IOS Deployment

> Produce an EAS iOS development build for testing on registered devices — expo-dev-client setup, credential generation, device registration, and eas.json iOS config

- Skill: `powr-data/expo-ios-deployment` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add powr-data/expo-ios-deployment`
- Raw SKILL.md: https://api.skillmd.com/api/skills/powr-data/expo-ios-deployment/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: POWR-DATA (https://skillmd.com/u/powr-data)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/powr-data/expo-ios-deployment

---


# Expo iOS Deployment

## Purpose

Get an Expo/React Native app running on a physical iOS device through an EAS development build (ad hoc distribution) — covering `expo-dev-client` setup, automatic certificate and provisioning profile generation, device UDID registration, and the `eas.json` iOS fields required before submission. This is the iOS development testing loop, distinct from production store submission.

## When to use

When you need to test an Expo iOS app on a real device and Expo Go is not an option (SDK 56+ removed it) or you need native modules. Apply during development, before production build and store submission. For production build and submit, use `eas-build-submit`; for App Store Connect listing, use `app-store-listing`.

## Inputs expected

- An Expo project with `eas.json` (or to be created)
- EAS CLI installed and logged in (`eas login`)
- An Apple Developer Program membership
- The physical iOS device(s) you intend to test on
- Bundle identifier for the app

---

## Guiding principles

- **Install `expo-dev-client` before building.** EAS cannot produce an iOS development build without it. The EAS CLI detects when it is missing and offers to install it automatically during `eas build --platform ios --profile development`, but installing it up front avoids the interruption.
- **The development build flow has three steps that must run in order.** First `eas credentials` (generates the distribution certificate and provisioning profile automatically), then `eas device:create` (registers the device UDID), then `eas build --platform ios --profile development`. Building before the device is registered produces a build the device cannot install.
- **EAS manages all certificates — do not touch the Apple Developer portal manually.** `eas credentials` creates and stores the distribution certificate and provisioning profile for you. Manual certificate work in the Apple Developer portal is unnecessary and risks conflicts with EAS-managed credentials.
- **Register devices with `eas device:create` using the Website option.** This produces a registration URL to open on the target device, which captures its UDID and adds it to the provisioning profile. Ad hoc distribution only installs on devices registered this way — an unregistered device cannot install the build.
- **A development build is ad hoc distribution, not the App Store.** It installs only on registered devices and is for development/testing. It is a separate artefact from the production build you later submit to the App Store via `eas-build-submit`.
- **`eas.json` needs the Apple Team ID and `ascAppId` before submission.** The Apple Team ID is shown in the Apple Developer Portal header on the Certificates, Identifiers & Profiles page. The numeric `ascAppId` is obtained after creating the app in App Store Connect. Both belong under `submit.production.ios` in `eas.json` before running `eas submit`.

## Process

1. **Install `expo-dev-client`.** Run `npx expo install expo-dev-client` so EAS can produce a development build.
2. **Generate credentials.** Run `eas credentials` and let EAS create the distribution certificate and provisioning profile automatically.
3. **Register the test device.** Run `eas device:create`, choose the Website option, and open the resulting URL on the target iOS device to capture its UDID.
4. **Build the development profile.** Run `eas build --platform ios --profile development`. Install the resulting build on the registered device.
5. **Record iOS submission config.** Add the Apple Team ID and `ascAppId` under `submit.production.ios` in `eas.json` ahead of production submission.

## Output format

1. **Prerequisite check** — `expo-dev-client` installed, EAS CLI logged in
2. **Credential summary** — distribution certificate and provisioning profile generated by EAS
3. **Device registration** — device(s) registered via `eas device:create`, UDID captured
4. **Build result** — development build produced and installed on the registered device
5. **eas.json iOS config** — Apple Team ID and `ascAppId` recorded under `submit.production.ios`

## Quality checklist

- [ ] `expo-dev-client` installed before building
- [ ] Credentials generated via `eas credentials` — no manual Apple portal certificate work
- [ ] Target device registered with `eas device:create` (Website option) before building
- [ ] Development build installs and runs on the registered device
- [ ] Apple Team ID and `ascAppId` set under `submit.production.ios` in `eas.json`

## Avoid

- Building an iOS development build without `expo-dev-client` installed — it will not work
- Running the steps out of order — register the device before building, or it cannot install the result
- Doing manual certificate work in the Apple Developer portal — let `eas credentials` manage them
- Expecting a development build to install on an unregistered device — ad hoc distribution requires UDID registration
- Running `eas submit` before the Apple Team ID and `ascAppId` are set in `eas.json`

## Example usage

> "I'm on Expo SDK 56 so Expo Go won't work for iOS testing. Get my app onto my iPhone with an EAS development build — I'm on Windows with the phone plugged in — and set up `eas.json` so I can submit to the App Store later."

---

_Source: This skill is sourced from the [Matrix Skills](https://github.com/POWR-DATA/mtx-skills) library. Learn more at the [AI Agent Skills Library](https://powrdata.com.au/ai-agent-skills)._

