TL;DR:默认情况下强制执行 OTA 更新。可以通过添加代码在启动时检查您的应用版本来强制执行 App Store 更新,如果有新版本,请在您的应用页面上打开 App Store。
有两种更新独立 Expo 应用程序的方法:
- OTA 更新使用
expo-cli publish
- 使用 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 的文档。
希望这能回答你所有的问题,如果没有发表评论,我会编辑答案。