expo / expo/eas-cli

eas build:dev fails on Xcode 27 because Simulator.app was replaced by DeviceHub.app

Open
#4,403 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
1.4k
Forks
236
Avg merge
3d 1h
Merged PRs (30d)
91

Description

### Summary

`eas build:dev` cannot install a cached iOS development build on macOS 27 with Xcode 27 because EAS CLI checks only for the legacy `Simulator` app. Xcode 27 replaces `Simulator.app` with `DeviceHub.app`.

The equivalent compatibility change has already landed in Expo CLI in expo/expo#46757, but the separate implementation in EAS CLI still uses the old Simulator-only behavior.

### Reproduction

1. Install macOS 27 and Xcode 27.
2. Ensure the active developer directory is correct:

```console
$ xcode-select -p
/Applications/Xcode.app/Contents/Developer
```

3. Run an iOS development client build:

```console
$ eas build:dev --profile development --skip-build-if-not-found --skip-bundler
```

4. Select iOS. EAS successfully computes the fingerprint, finds the matching build, and downloads the archive, but fails before installation:

```text
Can't determine id of Simulator app; the Simulator is most likely not installed on this machine. Run 'sudo xcode-select -s /Applications/Xcode.app/Contents/Developer'
Error: build:dev command failed.
```

The suggested `xcode-select` command does not help because the developer directory is already correct.

### Environment

```text
macOS: 27.0 (26A428)
Xcode: 27.0 (27A266a)
eas-cli: 24.4.0
Node.js: 24.19.0
Architecture: darwin-arm64
```

### Root cause

Xcode 27 contains:

```text
/Applications/Xcode.app/Contents/Applications/DeviceHub.app
CFBundleIdentifier: com.apple.dt.Devices
```

It does not contain the previous path:

```text
/Applications/Xcode.app/Contents/Developer/Applications/Simulator.app
```

The current EAS CLI implementation:

- resolves only `id of app "Simulator"` in `packages/eas-cli/src/run/ios/simulator.ts`;
- accepts only `com.apple.iphonesimulator` and `com.apple.CoreSimulator.SimulatorTrampoline` in `packages/eas-cli/src/run/ios/systemRequirements.ts`;
- opens and waits for a process named `Simulator`.

### Expected behavior

On Xcode 27, `eas build:dev` should recognize `DeviceHub` / `com.apple.dt.Devices`, install the downloaded app on the selected simulator, and launch it.

### Verified workaround

Updating the local EAS CLI implementation to:

- resolve `DeviceHub` when Simulator is unavailable;
- accept `com.apple.dt.Devices`;
- open DeviceHub and wait for the `DeviceHub` process;

allowed the same command and fingerprint-matched cached build to complete successfully:

```text
Installing your app on the simulator...
✔ Successfully installed your app on the simulator!

Launching your app...
✔ Successfully launched your app!
```

### Related Expo CLI fix

- expo/expo#46694
- expo/expo#46757

Contributor guide

Open the contributing guide

Research direction

Start with packages/eas-cli/src/run/ios/simulator.ts and packages/eas-cli/src/run/ios/systemRequirements.ts, then reproduce the failure with the documented eas build:dev command on Xcode 27. Compare the Simulator-only checks with the stated DeviceHub behavior; done means the cached app installs on the selected simulator and launches successfully.

Written by the indexing model from the issue text.

Assessment

Tech stack
macos, typescript
Domain
cli, mobile-dev
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
75/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.