We’re really struggling with this, as well.
The update listener only checks for updates when the app is first starting, even though it sounds like an always-on thing from the documentation, so, if you only update by publishing to Expo, you’re always at least one app close/ restart cycle away from getting an update.
In the case of Android, you’re always two close/ restarts away from getting the update, because after the first reopen, the update is detected, and on the next open, the update is applied.
Because your JS is bundled whenever you create a new IPA/ APK, it would seem like a new app store update would guarantee that your JS is updated. This seems to be the case with iOS, and, besides, you can disable remote JS downloads for iOS, anyway. But, with Android, in my experience, installing a new APK over the old one does not update the JS.The APK update triggers the first app close, and thus the update is downloaded when the app is opened again, but it isn’t applied until the next restart after that.
If you listen for the update, there is the option to call Util.reload(), but that appears to be broken for apps that secure images behind session cookies (please someone else confirm this is an issue, I’m going crazy here).
In conclusion, it appears that even publishing a new APK cannot guarantee your users will get the latest JS soon after the Play Store update. This is a big deal when you think of a critical bug fix or rolling out a new feature - if a user sees from iOS / Android that your app was updated, but they go into the app and don’t see any of the changes, that’s not good. My leadership has told me that’s unacceptable.
The one way I know to virtually guarantee your user gets the update in a timely manner - or at least definitely gets the update when the Play Store is updated - is to make it impossible for your new version to use JS from the old version. So,
a) always do updates via the App Store / Play Store (or at least important updates), and
b) upgrade Expo to a new version in your new IPA/ APK
OR change your slug***
OR use a new release channel
I’d be so happy if someone from Expo could validate my experiences here or tell me what is either something I’ve done wrong or is maybe a one-off experience. I’d be happy to write a small book on it if I had a fact-checker. This stuff is amazing, OTA JS bundle updates are great for a certain audience, but it is currently really hard to understand precisely what is going on, absent of a ton of trial and error (I’ve published 23 updates this week alone just trying to figure out what’s going on).
*** I’ve tried this at least for Android - Expo’s build process doesn’t mind that you change the slug. Just remember to download your certs/ keystore so you can provide them when you build with the new slug- Expo saves those based on slug.