How do I force an expo app to update
我有一个用Expo编写的应用程序,无法弄清楚如何推送新版本。 在博览会网站上,如果我从QR代码运行该应用程序,则该应用程序是正确的,但该应用程序商店中的本机应用程序不会更新。
我一直在使用的步骤是
1)exp建立:android
2)exp发布
如何使应用实际更新?
TL; DR:默认情况下强制执行OTA更新。可以通过添加代码来强制启动App Store更新,以在启动时检查您的应用版本,如果有新版本,请在应用页面上打开App Store。
更新独立的Expo应用程序有两种方法:
这两种方法都有优点和缺点。
OTA更新
这是将更新交付给Expo应用程序的常用方法。 OTA通过expo CLI工具完成,并根据您的
1 2 | expo-cli publish -release-channel staging # pushes and update to the staging channel expo-cli publish -release-channel production # pushes an update to the production channel |
如果要发布,但独立应用程序未更新,则可能是将代码推送到错误的发布渠道。您可以在此处阅读有关发行渠道的更多信息。
OTA默认是强制执行的:
By default, Expo will check for updates automatically when your app is launched and will try to fetch the latest published version. If a new bundle is available, Expo will attempt to download it before launching the experience.
但是,可以通过在app.json中将
1 2 3 4 5 6 7 8 9 10 | try { const update = await Expo.Updates.checkForUpdateAsync(); if (update.isAvailable) { await Expo.Updates.fetchUpdateAsync(); // ... notify user of update ... Expo.Updates.reloadFromCache(); } } catch (e) { // handle or log error } |
该系统非常适合将新的JS代码推送给用户,它确实可以进行实时测试,因为您可以与用户一起测试您的应用,查找缺陷,修复它并发布新的代码,这些代码几乎可以立即下载。
但是这种方法有其局限性,例如:您不能以这种方式更新Expo SDK版本,必须构建一个新的独立应用程序并通过应用程序商店分发(或您选择的任何其他方法)。
应用商店
这是分发
似乎正在测试一个Android API,以强制应用程序通过此方法进行更新(SO线程,文章),但我认为它尚不可用。
通过这种方法强制执行更新的一种可能的解决方案是在启动时检查您的应用程序版本,如果商店中有可用的新版本,则可以通过深层链接打开应用程序的商店页面,以便用户能够下载它。下面的示例应帮助您形象地理解我的意思。
1 2 3 4 5 6 | componentDidMount { const hasNewVersion = isStoreUpdateAvailable(); // Checks the store for a new app update if (hasNewVersion) { Linking.openURL("market://details?id=<>"); // Opens the app's store page so the user can download the update } } |
这是有关链接到Google Play的文档。
希望这个回答您所有的问题,如果没有留下评论,我会编辑答案。
更新的答案
自发布接受的答案以来,Expo更改了[Updates API] [1]。
这是重大变化。
Updates.reloadFromCache has been renamed to Updates.reloadAsync, and Updates.reload has been removed.
1 2 3 4 5 6 7 8 9 10 11 12 | import * as Updates from 'expo-updates' // Updates* try { const update = await Updates.checkForUpdateAsync() if (update.isAvailable) { await Updates.fetchUpdateAsync() // NOTIFY USER HERE Updates.reloadAsync() } } catch (e) { // HANDLE ERROR HERE } |
对于那些想在哪里运行此代码的人,我建议将其插入componentDidMount / useEffect()方法中。
[1]:https://docs.expo.io/guides/configuring-ota-updates/