js OTA problem on Android

I have struggled with OTA on Android for 1-2moths. It was working fine but suddenly got broken and I cannot figure out why. The success of the OTA can be easily verified on iOS. However, when performing such JS OTA, the new bundle does not seem to make it to Android, even if the app is restarted, the phone is restarted, or the app is removed from the phone and reinstalled. For some reason, the Android app seems to only fetch the bundle that it was originally published with.
If I build an APK, and then publish the latest JS bundle on the same release channel as the APK, it updates the following files. So despite the fact that the release channel is the same, it seems there is some bundle URL that is changing so the APK does not get the latest bundle
However, if I publish the JS bundle, then build the APK, the app will have the latest bundle. But then next time I publish to the same release channel, the app is still stuck with whatever version of the bundle it has when the APK was made.
Expo version 27 (I know it’s not the latest but anyway the OTA was working before)

For start: could you show output of exp publish:history?

is it safe to publish it here? there are appId and channel Id.

Yeah, I would say it’s safe, but if you don’t want to post it here - just DM me.

│ General Info │                        │
│ fullName     │ xxxxxxxxxxxxxx │
│ publishedTime                          │ appVersion    │ sdkVersion    │ platform      │ channel       │ channelId                              │ publicationId                          │
│ 2018-09-24T15:34:41.639Z               │ 6.6.1         │ 27.0.0        │ ios           │ v66x          │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-3e71   │ xxxxxxxxxxxxxxxxxx-dbe9   │
│ 2018-09-24T15:34:41.639Z               │ 6.6.1         │ 27.0.0        │ android       │ v66x          │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-8a7d   │ xxxxxxxxxxxxxxxxxx-dbe9   │
│ 2018-09-21T14:00:22.084Z               │ 6.6.0         │ 27.0.0        │ ios           │ v66x          │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-3f5d   │ xxxxxxxxxxxxxxxxxx-5619   │
│ 2018-09-21T14:00:22.084Z               │ 6.6.0         │ 27.0.0        │ android       │ v66x          │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-74be   │ xxxxxxxxxxxxxxxxxx-5619   │
│ 2018-09-17T18:36:13.048Z               │ 6.4.1         │ 27.0.0        │ android       │ v64x          │ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-b676   │ xxxxxxxxxxxxxxxxxx-bc25   │

Did you changed anything in your app.json file apart from version number?

Please DM me your experience name (@nickname/appname)

I did my best but I have no idea how to send private message here, any clues?

Oh, I was sure it could be done :smiley: You can find me on expo-developers Slack - should be easier :wink: https://slack.expo.io/

Hey everyone,

I have exact same issue with ejected CRNA ExpoKit app, - updates arrive to iOS and not on Android.
The workaround is to clear the application data (note that on Android the app data isn’t cleared when you re-install the app). So we are asking Android users to always clear the application data once update arrives through the app store, and only after that they can see the new version of app.

I suspect it may be due to wrong OTA Updates configuration. Our app.json looks like this:

    "updates": {
      "enabled": false,
      "checkAutomatically": "ON_ERROR_RECOVERY",
      "fallbackToCacheTimeout": 0

We don’t need the OTA as our users use app mostly offline. It is expected that app will always use the local asset shipped within the app, but it doesn’t for some reason.

Our app is created with Create React Native App and then ejected to detached ExpoKit in order to be able to publish it to the AppStore and Play Market.

Would like to get this fixed, as it is a huge Android issue for us every time we want to rollout an update.

Was able to resolve the issue in a following manner.
After I’ve ejected, the app.json contained the following fragment.

    "ios": {
      "bundleIdentifier": "com.******.******",
      "publishBundlePath": "ios/appname/Supporting/shell-app.bundle",
      "publishManifestPath": "ios/appname/Supporting/shell-app-manifest.json"
    "android": {
      "package": "com.******.******"

Not sure why publishBundlePath and publishManifestPath are not there by default for Android. The build didn’t container a local copy of JS asset, so was always getting the one from the Expo service or just falling back to the locally cached version (old one) if OTA is disabled.

This configuration worked:

    "ios": {
      "bundleIdentifier": "com.******.******",
      "publishBundlePath": "ios/[app path]/Supporting/shell-app.bundle",
      "publishManifestPath": "ios/[app path]/Supporting/shell-app-manifest.json"
    "android": {
      "package": "com.******.******",
      "publishBundlePath": "android/app/src/main/assets/shell-app.bundle",
      "publishManifestPath": "android/app/src/main/assets/shell-app-manifest.json"

Note that you also need to keep the application versions updated in package.json and app.json before running exp publish --release-channel ${MY_CHANNEL}

This topic was automatically closed 15 days after the last reply. New replies are no longer allowed.