我有一个用expo编写的应用程序,无法弄清楚如何推送新版本。在博览会网站上,如果我通过QR代码运行该应用程序,则该应用程序是正确的,但该应用程序商店中的本机应用程序不会更新。
我一直在使用的步骤是 1)exp建立:android 2)exp publish
如何使应用实际更新?
答案 0 :(得分:5)
自发布接受的答案以来,Expo更改了[Updates API] [1]。
这是重大变化。
Updates.reloadFromCache已重命名为 Updates.reloadAsync ,并且Updates.reload已删除。
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/
答案 1 :(得分:4)
TL; DR :默认情况下会强制执行OTA更新。可以通过添加代码来强制启动App Store更新,以在启动时检查您的应用版本,如果有新版本,请在应用页面上打开App Store。
有两种更新独立Expo应用程序的方法:
expo-cli publish
的OTA更新这两种方法都有优点和缺点。
这是将更新交付给Expo应用程序的常用方法。 OTA通过expo CLI tool完成,并根据您的package.json
设置提供新的Javascript代码。此选项还提供了使用发布渠道发布代码的选项,这意味着您可以先将更新推送到您的暂存环境,然后验证更新,然后通过CLI将其推送到生产环境,如下所示:
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
如果您要发布,但独立应用程序未更新,则可能是将代码推送到错误的发布渠道。您可以了解有关发布渠道here的更多信息。
默认情况下,OTA是强制执行的:
默认情况下,Expo将在启动应用程序时自动检查更新,并尝试获取最新发布的版本。如果有可用的新捆绑包,Expo将在尝试启动体验之前尝试下载它。
不过,可以通过在app.json中将updates.enabled
设置为false
来禁用此行为,然后按照自己的文档中的示例实现您自己的逻辑(或根本不执行):>
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版本,必须构建一个新的独立应用程序并通过应用程序商店分发(或您选择的任何其他方法)。< / p>
这是分发.apk
和.ipa
文件的最常用方法。可以分别使用Android和iOS的expo-cli build:android
和expo-cli build:ios
创建这些文件。
似乎正在测试一个Android API以强制通过这种方法(SO thread,article)来更新应用程序,但我认为它尚不可用。
通过此方法强制执行更新的一种可能的解决方案是在启动时检查您的应用程序版本,如果商店中有可用的新版本,请通过deep linking打开应用程序的商店页面,以便用户能够下载它。下面的示例应帮助您形象地理解我的意思。
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
}
}
以下是有关linking to Google Play的文档。
希望这个答案回答您所有的问题,如果没有留下评论,我会编辑答案。