Expo OTA Updates Are a Loaded Gun. Here's the Safety.
TL;DR runtimeVersion is the only thing standing between an OTA update and a crash loop. Use the fingerprint policy, not appVersion . An OTA update can't change native code. If you touched ios/ , android/ , a config plugin, or a package with native code, ship a store build. No exceptions. Default checkOnLaunch + fallbackToCacheTimeout: 0 means users get the update next launch, not this one. Decide…
Expo OTA updates can be problematic if not handled correctly. The runtimeVersion is crucial as it determines whether an update is delivered or not. If the runtime version mismatch occurs, the app will crash, and there's no way to fix it with a subsequent update. To avoid this, use the fingerprint policy instead of appVersion. This policy hashes the native project and ensures that only compatible updates are delivered.
If any native changes are made, such as adding a package with ios/ or android/ directories, config plugins, updating Expo SDK version, or enabling/disabling new architecture, a store build should be shipped instead of an OTA update.
When publishing OTA updates, use the right channel. Channels are used to point builds at a stream of updates, while branches are where updates live. Treat the branch name as a unique identifier, not a free-form string. It's recommended to publish updates to a preview channel first and then to the production channel after confirmation. The default Expo update behavior means users are always one launch behind, so prompt the user to reload the app after an update to ensure they have the latest version.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.