Safe Process for Updating Expo on Deployed Apps?

I’m in the process of updating my already-deployed app to exp22, and I’m trying to ensure I don’t mess anything up! Normally when I publish everyone will receive the updates OTA, although my understanding is that this doesn’t apply to SDK updates.

So–when I DO publish this update, will it cause any issues with the already deployed apps?

Will they just stop receiving OTA updates until they receive an update through the Store?

So, process being:

  1. App is deployed
  2. Publish standard updates
  3. Apps receive updates OTA
  4. Update sdk
  5. Publish sdk upgrade
  6. Deployed apps are not updated
  7. Upload new builds to Store(s)
  8. Deployed apps begin to receive OTA updates again.

Is that correct?

I think your understanding is 100% correct.

We will continue to serve the SDK 21 bundle to the older clients, and they won’t get the SDK 22 version until they download the new version of your app from the respective app store.

@skevy How does expo link a particular js bundle to a particular native client?

I have a detached app and was wondering how expo handles changes in native code and js bundle targeting. Are there some docs I can look at?

At the moment, the linking between an expo bundle and a standalone app is only by SDK version – the latest sdk 21 bundle will be served to the client that supports sdk 21 as it’s latest version, the latest sdk 22 bundle will be served to the client that supports sdk 22, etc.

We’re working on providing more fine grained control over this release process, but no ETA on that yet.

This behaviour is fine if one hasn’t detached. But with detached builds this is troublesome. Interesting :smiley:
Thanks Adam, keep up the good work.

the dev experieince with expo is awesome but I’m at a point where this issue has become troublesome. Essentially, I have an expokit project and I don’t want to wait until a new expo release to push out changes with 3rd party native modules.

I’m not sure I understand your question correctly. You can change the third-party native modules without updating ExpoKit as long as they’re compatible with the version of React Native that your copy of ExpoKit uses. You do need to wait for ExpoKit updates if you (a) want a new version of React Native and (b) new versions of the Expo SDKs – that’s how ExpoKit works.

Apologies for not being clear. I was talking about this Safe Process for Updating Expo on Deployed Apps?

The bundle-serving behavior described in that post is no longer the current behavior. Instead, the client will get the most recently published JS for any SDK version it supports (as opposed to the most recently published JS for the newest SDK version it supports).

That said, this change in behavior doesn’t help your detached app scenario, if I understand correctly: v1 of your app includes native module A and v2 of your app includes native module B, but they both use the same version of ExpoKit and you want the native v1 and v2 apps to receive different JS bundles. If my understanding is correct, then release channels are the best way to address your needs.

These are the docs for release channels: https://docs.expo.io/versions/latest/guides/release-channels.html.

You could create a separate release channel for each version of your native app. Even if they use the same version of ExpoKit, the app will fetch JS only for the release channel you specified when compiling your native app. There is a small section in the release channel docs about how to use release channels with ExpoKit.