如何强制博览会应用更新

Joe*_*son 6 android react-native expo

我有一个用EXPO写的应用程序,无法弄清楚如何推送新版本。在博览会网站上,如果我从QR代码运行该应用程序,则该应用程序是正确的,但该应用程序商店中的本机应用程序不会更新。

我一直在使用的步骤是1)exp build:android 2)exp publish

如何使应用程序实际更新?

Bru*_*rdo 9

TL; DR:默认情况下强制执行OTA更新。可以通过添加代码来强制启动App Store更新,以在启动时检查您的应用版本,如果有新版本,请在应用页面上打开App Store。

更新独立的Expo应用程序有两种方法:

  1. 使用OTA更新 expo-cli publish
  2. 使用Google Play / App Store

这两种方法都有优点和缺点。

OTA更新

这是将更新交付给Expo应用程序的常用方法。OTA通过expo CLI工具完成,并根据您的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
Run Code Online (Sandbox Code Playgroud)

如果要发布,但独立应用程序未更新,则可能是将代码推送到错误的发布渠道。您可以在此处阅读有关发行渠道的更多信息。

OTA默认情况下是强制执行的:

默认情况下,Expo将在您启动应用程序时自动检查更新,并尝试获取最新发布的版本。如果有可用的新捆绑包,Expo将在尝试启动体验之前尝试下载它。

但是它可以禁用通过设置这种行为updates.enabled,以false在app.json,然后实现自己的逻辑(或没有),按照他们的文档的例子:

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
}
Run Code Online (Sandbox Code Playgroud)

该系统非常适合将新的JS代码推送给用户,它确实可以进行实时测试,因为您可以与用户一起测试应用程序,发现缺陷,修复它并发布新代码,这些代码几乎可以立即下载。

但是,此方法有其局限性,例如:您不能以这种方式更新Expo SDK版本,必须构建一个新的独立应用程序并通过应用程序商店分发(或您选择的任何其他方法)。

应用商店

这是分发您的.apk.ipa文件的最常见方法。可以分别使用Android和iOS 的expo-cli build:android和来创建这些文件expo-cli build:ios

似乎正在测试一个Android API,以强制通过这种方法更新应用程序(SO threadarticle),但我认为它尚不可用。

通过这种方法强制执行更新的一种可能的解决方案是在启动时检查您的应用程序版本,如果商店中有可用的新版本,则可以通过深层链接打开应用程序的商店页面,以便用户能够下载它。下面的示例应帮助您形象地理解我的意思。

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
   }
}
Run Code Online (Sandbox Code Playgroud)

这是有关链接到Google Play的文档。

希望这个回答您所有的问题,如果没有留下评论,我将编辑答案。


Gil*_*ana 8

更新的答案

由于已接受的答案已发布,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
  }
Run Code Online (Sandbox Code Playgroud)

对于那些想知道在哪里运行此代码的人,我建议将其插入到 componentDidMount/useEffect() 方法中。[1]:https : //docs.expo.io/guides/configuring-ota-updates/