How to check compatibility of OTA updates with custom native modules

We are building a detached app with some customized native modules.

We are starting to think about versioning, and for a way to lock OTA updates to versions compatible with the current user’s build of the native app and modules.

Is there any way to do this? I read about how the “sdkVersion” property in app.json is used to determine compatibility for OTA updates with Expo SDK versions here: https://docs.expo.io/versions/v32.0.0/distribution/advanced-release-channels/.

I wonder, could we co-opt this value to represent our own versioning for the native build? Is it a simple string equality check? Would this be stable? If not, what’s the recommended best practice here?

Thank you!

SDK version will lock your OTA updates to a particular version only if you’re upgrading your Expo SDK every time you’re putting a new native version in the store. If you change native dependencies without upgrading the Expo SDK, then checking the SDK version will not be help.

Release channels (more info in the Expo docs) can be a great help with this, I’ve found. I’ve started naming my release channels for a) my API server the build is pointing to, and b) the minimum native build number that will support that JavaScript bundle. So, if I’m building a prod version, it will be something like “prod-105”, and that will mean that any native app with a build number of 105 or greater will receive that update, since the builds will be locked to the “prod-105” release channel. That will continue until I made another change to the native bits that would break the JS (like changing a native module). Then I might make the “prod-109” release channel, and then all builds with build number 109 and forward will get that version.

Note that I may do several native builds between 105 and 109 that do not break compatibility with the JS. These will often be for things like changing icons, native image assets, other native project properties.

3 Likes

That’s a really interesting solution, thanks! I have been planning to use release channels but not thought of this kind of application. Very helpful to know it has been working well for you!