关于android:我如何强制博览会应用更新

How do I force an expo app to update

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

我一直在使用的步骤是
1)exp建立:android
2)exp发布

如何使应用实际更新?


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

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

  • 使用expo-cli publish更新OTA
  • 使用Google Play / App Store
  • 这两种方法都有优点和缺点。

    OTA更新

    这是将更新交付给Expo应用程序的常用方法。 OTA通过expo CLI工具完成,并根据您的package.json设置提供新的Javascript代码。此选项还提供了使用发布渠道发布代码的选项,这意味着您可以先将更新推送到暂存环境,验证更新,然后通过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中将updates.enabled设置为false,然后实现自己的逻辑(或根本不实现)来禁用此行为,如其文档中的示例所示:

    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版本,必须构建一个新的独立应用程序并通过应用程序商店分发(或您选择的任何其他方法)。

    应用商店

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

    似乎正在测试一个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/