【问题标题】:How do I force an expo app to update如何强制 expo 应用程序更新
【发布时间】:2018-07-03 06:19:15
【问题描述】:

我有一个用 expo 编写的应用程序,但不知道如何推送新版本。在世博会网站上,如果我从二维码运行应用程序,应用程序是正确的,但来自应用程序商店的本机应用程序不会更新。

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

如何让应用真正更新?

【问题讨论】:

标签: android react-native expo


【解决方案1】:

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

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

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

这两种方法各有优缺点。

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

应用商店

这是分发.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 的文档。

希望这能回答你所有的问题,如果没有发表评论,我会编辑答案。

【讨论】:

  • 这个Linking.openURL("market://details?id=&lt;&gt;"); 也可以从iOS 发送到AppStore 吗?在我的应用上,它仅适用于 Android
  • 这仅适用于 Android,是的。我不知道如何在 iOS 上实现类似的结果。
【解决方案2】:

更新答案

自从发布接受的答案后,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/

【讨论】:

  • 此代码对于获取更新和更新应用程序很有用,但此更新将下载到哪里以及对于开发人员来说,如何向用户提供更新。请帮我解决这个问题。
  • 世博会为您处理。当您创建应用程序的构建时,它会自动将构建上传到 Expo 的亚马逊服务(它也会为您提供一个 URL 来检查)。您只需要插入上面的代码,Expo 就会更新应用程序 OTA (Over The Air)。
  • 谢谢。这很有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多