OTA After Launch

Over-the-Air Updates After Launch

EAS Update set up EAS Update 6,418 , where an update reaches only builds with the same runtime version. After launch, the question is which runtime version to give each build. "runtimeVersion": { "policy": "appVersion" } uses version, so you must remember to raise it whenever native code changes. The fingerprint policy computes it instead, with @expo/fingerprint (https://github.com/expo/expo/tree/main/packages/@expo/fingerprint 52,467 ): a hash of everything that can change the native app, from app.json and config plugins to every native module's files. It ships with Expo 6,418 (0.20.13 here), so you can see what it does before you use EAS 6,418 :

Fingerprinting BookNest, then changing JavaScript and a config plugin optionShell
npx @expo/fingerprint fingerprint:generate > fp-1.1.0.json
echo "// a JavaScript-only change" >> src/store/cart.ts
npx @expo/fingerprint fingerprint:generate > fp-js.json
sed -i 's/"imageWidth": 200/"imageWidth": 180/' app.json
npx @expo/fingerprint fingerprint:generate > fp-plugin.json
node -p "['1.1.0', 'js', 'plugin'].map((n) => require('./fp-' + n + '.json').hash).join('\n')"
npx @expo/fingerprint fingerprint:diff fp-1.1.0.json fp-plugin.json | grep -E '"(op|id)"'
Output
80fdae8d53a68184a398a753cb509c49b1dce581
80fdae8d53a68184a398a753cb509c49b1dce581
9159c17963c4f3f495932c5694c5338dbe8434a0
    "op": "changed",
      "id": "expoConfig",
      "id": "expoConfig",

The JavaScript change left the hash alone, so an update could reach every 1.1.0 build; one splash plugin option, which changes what prebuild writes, changed it. BookNest's fingerprint covers 157 sources, every autolinked module included, so a native upgrade gets a new runtime version even if you forget. (Undo the test edits.)

Rollouts limit the damage of a bad update. From Expo's documentation (not run here), eas update --channel production --rollout-percentage=10 sends an update to a tenth of the builds, eas update:edit raises the share, and eas update:rollback republishes an earlier update or tells builds to return to the bundle they shipped with. Both stores allow downloaded interpreted code that keeps the app's reviewed purpose, so use updates for fixes and small features, and send anything that changes what the app is through review.