expo / expo/eas-cli

EAS Update not working for internal distribution on iOS

Open
#2,714 4 comments 1 reaction 0 assignees View on GitHub
needs review
Dominant language
TypeScript
Stars
1.4k
Forks
236
Avg merge
3d 8h
Merged PRs (30d)
98

Description

### Build/Submit details page URL

_No response_

### Summary

### Issue Summary

I am unable to get my preview app, which is distributed internally, to work with EAS Update. I have reviewed several related issues but have not found a solution that resolves the problem. The issues I have checked include:

- [Issue 2045 on EAS CLI GitHub](https://github.com/expo/eas-cli/issues/2045)
- [Does `eas build` update previously released apps? (Stack Overflow)](https://stackoverflow.com/questions/73488280/does-expo-eas-build-command-update-previously-released-app?rq=2)
- [Issue 2080 on EAS CLI GitHub](https://github.com/expo/eas-cli/issues/2080)
- [EAS Update not working properly (Stack Overflow)](https://stackoverflow.com/questions/75078402/eas-update-is-not-working-properly-for-my-project)
- [Linking EAS update branch with build channel (Stack Overflow)](https://stackoverflow.com/questions/73561558/expo-eas-how-to-link-eas-update-branch-with-build-channel)
- [EAS Update not pushing updates to APKs (Stack Overflow)](https://stackoverflow.com/questions/77923269/eas-update-not-pushing-updates-to-apps-installed-directly-with-apk)

I have also followed the debugging guide provided in the [Expo Docs](https://docs.expo.dev/eas-update/debug/) and explored various suggestions from ChatGPT and Claude. Unfortunately, nothing has resolved the issue.

### Current Situation

Everything seems to be configured correctly:

- The channel is mapped to the correct branch.
- I can see all updates on [expo.dev](https://expo.dev), but they do not appear in the app on my phone.
- When I run the preview EAS build again, everything works as expected, and all the code is visible on the device.

However, when I attempt to make changes locally and distribute them internally for testing, the updates do not show on my phone, even though everything seems to be in order. Here's the configuration I’m using for the `preview` build:

```json
"preview": {
"distribution": "internal",
"ios": {
"enterpriseProvisioning": "adhoc"
},
"env": {
"DB_TYPE": "production",
"ENV": "production",
"NODE_ENV": "production"
},
"channel": "preview"
}
```

### What I Have Tried

- Changed the branch connected to the preview channel to match the name of my Git branch.
- Updated the versioning policy to `runtimeVersion: { policy: "appVersion" }`.
- Attempted to fetch updates manually using `useEffect` or a user action button via `expo-updates`.
- Explicitly added update parameters.
- Explicitly added `"expo-updates"` as a plugin in `app.config`.
- Tried various combinations of app versions (preserving the same version, incrementing the version before the update).
- Tested all solutions I found across different issues on the web, but none of them have worked.

### Question

Is it even possible to use EAS Update with an internal distribution build for iOS? I've found a lot of related issues, but no concrete solutions yet.

Any guidance or solutions would be greatly appreciated!

### Managed or bare?

Managed

### Environment

```
expo-env-info 1.2.1 environment info:
System:
OS: macOS 14.4
Shell: 5.9 - /bin/zsh
Binaries:
Node: 18.15.0 - ~/.knode/bin/node
npm: 9.5.0 - ~/.knode/bin/npm
Managers:
CocoaPods: 1.15.2 - /opt/homebrew/bin/pod
SDKs:
iOS SDK:
Platforms: DriverKit 23.5, iOS 17.5, macOS 14.5, tvOS 17.5, visionOS 1.2, watchOS 10.5
IDEs:
Xcode: 15.4/15F31d - /usr/bin/xcodebuild
npmPackages:
@expo/metro-config: ^0.10.0 => 0.10.0
expo: ^49.0.23 => 49.0.23
react: 18.2.0 => 18.2.0
react-dom: 18.2.0 => 18.2.0
react-native: 0.72.10 => 0.72.10
react-native-web: ~0.19.6 => 0.19.11
npmGlobalPackages:
eas-cli: 13.3.0
Expo Workflow: managed
```

``` package.json
{
"scripts": {
"ios": "expo run:ios",
"eject": "expo eject",
"test": "jest --watchAll",
"start": "expo start --dev-client",
"start:dev-client:prod": "DB_TYPE=production expo start --dev-client",
"android": "expo run:android",
"dev": "ENV=local expo start --dev-client",
"dev:prod-db": "ENV=local DB_TYPE=production expo start --dev-client",
"eas:build:run:ios": "eas build:run -p ios",
"eas:build:simulator:ios": "eas build --profile development-simulator --platform ios",
"eas:build:development:ios": "eas build --profile development --platform ios",
"eas:build:preview:ios": "eas build --profile preview --platform ios",
"eas:build:production:ios": "eas build --profile production --platform ios",
"eas:update:preview:ios": "eas update --branch preview --message",
"eas:update:production:ios": "eas update --branch production --message"
},
"jest": {
"preset": "jest-expo"
},
"resolutions": {
"@expo/config-plugins": "~6.0.0",
"@expo/prebuild-config": "~6.0.0"
},
"dependencies": {
"@expo-google-fonts/poppins": "^0.2.2",
"@expo-google-fonts/titan-one": "^0.2.2",
"@expo/config-plugins": "^7.2.2",
"@expo/metro-config": "^0.10.0",
"@expo/prebuild-config": "^6.2.4",
"@expo/vector-icons": "^13.0.0",
"@react-native-async-storage/async-storage": "1.18.2",
"@react-native-community/netinfo": "9.3.10",
"@react-navigation/native": "^6.0.4",
"@react-navigation/stack": "^6.0.9",
"dotenv": "^16.3.1",
"expo": "^49.0.23",
"expo-asset": "~8.10.1",
"expo-av": "~13.4.1",
"expo-cached-image": "49",
"expo-constants": "~14.4.2",
"expo-dev-client": "~2.4.13",
"expo-file-system": "~15.4.5",
"expo-font": "~11.4.0",
"expo-linear-gradient": "~12.3.0",
"expo-linking": "~5.0.2",
"expo-localization": "~14.3.0",
"expo-network": "~5.4.0",
"expo-splash-screen": "~0.20.5",
"expo-status-bar": "~1.6.0",
"expo-updates": "~0.18.19",
"expo-web-browser": "~12.3.2",
"firebase": "^9.22.0",
"i18next": "^22.4.15",
"prettier": "^2.2.1",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-i18next": "^12.2.2",
"react-native": "0.72.10",
"react-native-gesture-handler": "~2.12.0",
"react-native-reanimated": "~3.3.0",
"react-native-safe-area-context": "4.6.3",
"react-native-screens": "~3.22.0",
"react-native-shared-element": "0.8.8",
"react-native-svg": "13.9.0",
"react-native-touchable-scale": "^2.2.0",
"react-native-web": "~0.19.6",
"react-navigation-stack": "^2.10.4",
"recoil": "^0.5.2",
"react-native-svg-transformer": "1.0.0"
},
"devDependencies": {
"@babel/core": "^7.19.3",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
"@babel/plugin-proposal-optional-chaining": "^7.21.0",
"@types/react": "~18.2.14",
"jest-expo": "~49.0.0",
"typescript": "^5.1.3"
},
"private": true,
"name": "...",
"version": "0.0.2"
}
```

```app.json
{
"expo": {
"name": "myappname",
"slug": "myappname",
"description": "... ",
"version": "0.0.2",
"orientation": "portrait",
"icon": "...",
"scheme": "...",
"userInterfaceStyle": "automatic",
"splash": {
"image": "...",
"resizeMode": "cover",
"backgroundColor": "..."
},
"platforms": ["ios"],
"updates": {
"fallbackToCacheTimeout": 0
},
"assetBundlePatterns": ["**/*"],
"ios": {
"supportsTablet": false
}
}
}

```

```app.config.ts
import { ExpoConfig, ConfigContext } from "expo/config";
import * as dotenv from "dotenv";

type Environment = "development" | "staging" | "production" | "local";

const env: Environment = (process.env.ENV as Environment) || "development";

const dbType: Environment =
(process.env.DB_TYPE as Environment) || "development";
const dbTypeUpper = dbType.toUpperCase();

if (env === "local") {
dotenv.config({ path: `.env` });
}

function isDevelopment(env: Environment): boolean {
return env === "development" || env === "local";
}

function getName(baseName: string): string {
if (isDevelopment(env) && dbType === "development") {
return `...-dev`;
} else if (isDevelopment(env) && dbType === "production") {
return `...-prod-db`;
} else if (env === "staging") {
return `...-staging`;
} else {
return baseName;
}
}

export default ({ config }: ConfigContext): ExpoConfig => ({
...config,
name: getName("..."),
slug: "...",
plugins: ["expo-localization", "expo-updates"],
ios: {
bundleIdentifier:
process.env.ENV === "production"
? "..."
: "...-dev",
},
extra: {
firebaseConfig: {
...
},
eas: {
projectId: "myId",
},
},
updates: {
url: "https://u.expo.dev/myId",
enabled: true,
checkAutomatically: "ON_LOAD",
},
runtimeVersion: { policy: "appVersion" },
});

```

```eas.json

{
"cli": {
"version": ">= 5.9.3"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"env": {
"ENV": "development",
"DB_TYPE": "production"
},
"channel": "development"
},
"preview": {
"distribution": "internal",
"ios": {
"enterpriseProvisioning": "adhoc"
},
"env": {
"DB_TYPE": "production",
"ENV": "production",
"NODE_ENV": "production"
},
"channel": "preview"
},
"production": {
"node": "18.18.0",
"env": {
"DB_TYPE": "production",
"ENV": "production",
"NODE_ENV": "production"
},
"channel": "production"
}
},
"submit": {
"production": {}
}
}

```

### Error output

There is no error, everything seems to work just fine, only issue is that updates are not visible on real iOS device.

### Reproducible demo or steps to reproduce from a blank project

Use EAS Update for above configurations with internal distribution preview build and see no updates on the real device.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.