配置更新

编辑页面


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

本文档已于 2022 年 8 月归档,不会再收到任何更新。请改用 EAS Update。了解更多

Expo 提供了多种设置来配置应用接收更新的方式。更新允许你发布应用 JavaScript 和资源的新版本,而无需重新构建应用并再次提交到应用商店。(阅读有关限制的更多内容)。

要创建应用更新,请运行 expo publish。如果你使用发布通道,请使用 --release-channel <channel-name> 选项指定一个。注意,如果你希望更新应用的 SDK 版本,或者进行这些更改中的任何一项,你需要使用 eas build 重新构建应用,并将二进制文件上传到相应的应用商店(在此查看文档)。

更新由 app.json 中的 updates 设置控制,它们处理应用的初始加载;同时还由 Updates SDK 模块控制,它允许你从 JS 中异步获取更新。

自动更新

如果你的 app.json 不包含 updates.fallbackToCacheTimeout 字段,它将默认值设为 0,并且 expo-updates 会尝试在后台下载更新版本以供将来使用的同时,立即使用缓存的 bundle 启动你的应用。使用此配置时,从商店下载应用并首次启动的用户将始终看到二进制文件构建时所对应的应用版本。Updates.addListener 提供了一个钩子,让你在新 bundle 下载完成时作出响应。你可以用它通知用户应该重启应用,也可以通过 Updates.reloadAsync() 以编程方式重启,例如在响应用户提示时。

你也可以设置一个非零超时时间,在这种情况下,Expo 会在启动应用之前尝试下载新更新。如果没有可用的网络连接,或者在给定时间内尚未完成下载,Expo 会回退为加载应用的缓存版本,并继续在后台尝试获取更新(此时它会被保存到缓存中,供下次应用加载时使用)。我们强烈不建议通过获取更新来阻塞应用加载,因为如果下载更新耗时较长,用户可能会觉得应用无法正常工作;而且由于在继续进入应用之前必须发起一次网络请求来检查更新,每次启动都会更慢。

在 Expo Go 中,无论应用配置中的 updates 设置如何,应用的最新已发布 bundle 都会始终被启动(除非请求超时或网络连接不可用)。

手动更新

在独立应用中,也可以关闭自动更新,而完全在你的 JS 代码中控制更新。如果你希望围绕获取更新实现一些自定义逻辑,这样做会更合适(例如,仅在 Wi-Fi 下获取)。

在 app.json 中将 updates.checkAutomatically 设置为 "ON_ERROR_RECOVERY",将阻止 Expo 在每次应用启动时自动获取最新更新。只会加载你 bundle 最近一次缓存的版本。只有当缓存 bundle 的上一次运行产生了致命 JS 错误时,才会自动获取更新。

然后你可以使用 expo-updates 模块下载新更新,并在适当时通知用户重新加载他们的应用。

import * as Updates from 'expo-updates'; try { const update = await Updates.checkForUpdateAsync(); if (update.isAvailable) { await Updates.fetchUpdateAsync(); // ... 通知用户有更新 ... await Updates.reloadAsync(); } } catch (e) { // 处理或记录错误 }

检查更新会像任何网络请求一样消耗设备的带宽和电量。此外,Expo 提供的更新可能会受到频率限制。一个好的经验法则是,在用户启动应用或将应用切换到前台时进行检查。避免在频繁循环中轮询更新。

请注意,checkAutomatically: "ON_ERROR_RECOVERY" 在 Expo Go 中会被忽略,不过命令式的 Updates 方法仍然会正常工作。

禁用更新

你可以通过在 app.json 中将 updates.enabled 设置为 false,来完全禁用应用中的更新。这将忽略所有从 Expo 服务器获取应用 bundle 的代码路径。在这种情况下,你的应用更新都需要通过 iOS App Store 和/或 Google Play Store 来分发。

此设置在 Expo Go 应用中会被忽略。