Expo OTA 更新的配置与实现
Expo 支持 Over-The-Air (OTA) 更新,使您能够在不要求用户从应用商店重新下载的情况下推送更新。这一功能可以动态修复错误、更新功能或修改内容。以下是详细的配置、实现和管理 OTA 更新的指南。
前置条件
-
管理工作流(Managed Workflow):OTA 更新适用于使用 Expo 管理工作流的应用。如果使用裸工作流(Bare Workflow),需要自定义配置或使用第三方解决方案。
-
Expo CLI:确保安装了最新版本的 Expo CLI。
npm install -g expo-cli
-
Expo 账户:您需要一个 Expo 账户来发布更新。
第 1 步:启用 OTA 更新
Expo 默认启用 OTA 更新,但您可以在 app.json
或 app.config.js
文件中显式配置。
{
"expo": {
"updates": {
"enabled": true, // 启用 OTA 更新
"checkAutomatically": "ON_LOAD", // 应用加载时检查更新
"fallbackToCacheTimeout": 0 // 如果没有找到更新,立即使用缓存版本
}
}
}
关键配置属性
enabled
:是否启用 OTA 更新。设置为true
即可启用。checkAutomatically
:"ON_LOAD"
:应用启动时检查更新(推荐)。"ON_ERROR_RECOVERY"
:仅在应用启动时遇到错误时检查更新。
fallbackToCacheTimeout
:0
:如果没有找到更新,立即使用缓存版本。- 正整数(如
3000
):等待指定时间(以毫秒为单位)后,使用缓存版本。
第 2 步:发布更新
启用 OTA 更新后,您可以通过 Expo CLI 发布更改。
-
修改代码或资源:更新项目中的 JavaScript 或资源。
-
发布更新:
expo publish
该命令会将项目的最新版本上传到 Expo 服务器。用户下次打开应用时会接收到更新。
示例输出
Publishing to channel 'default'...
Building optimized bundles and generating sourcemaps...
Upload complete.
第 3 步:监听更新事件
为了提升用户体验,您可以使用 Expo 的 Updates
API 通知用户有可用更新并以编程方式管理更新行为。
示例代码
import React, { useEffect } from "react";
import { Alert } from "react-native";
import * as Updates from "expo-updates";
export default function App() {
useEffect(() => {
const checkForUpdates = async () => {
try {
const update = await Updates.checkForUpdateAsync();
if (update.isAvailable) {
// 下载并应用更新
await Updates.fetchUpdateAsync();
Alert.alert(
"发现新版本",
"新版本已准备好。重新启动应用以应用更新。",
[
{
text: "重启",
onPress: () => Updates.reloadAsync(),
},
]
);
}
} catch (e) {
console.error("检查更新时出错:", e);
}
};
checkForUpdates();
}, []);
return (
// 主应用组件
<YourMainComponent />
);
}
第 4 步:使用发布通道(Release Channels)
发布通道允许您向不同环境(例如测试、生产)部署更新,而不会影响所有用户。
发布到特定通道
expo publish --release-channel staging
在 app.json
中配置通道
{
"expo": {
"updates": {
"releaseChannel": "staging"
}
}
}
使用 staging
通道的用户仅会接收到发布到该通道的更新。
第 5 步:测试 OTA 更新
测试步骤
- 运行
expo publish
推送更新。 - 在目标设备上重启应用。
- 确认应用已接收到更新。
常见问题
- 未接收到更新:确保应用配置了正确的发布通道。
- 更新未应用:确保在更新下载完成后重启应用。
第 6 步:OTA 更新的限制
支持的更改
- JavaScript 代码更改
- 资源更新(如图像、字体)
不支持的更改
- 原生代码更改(例如新增原生模块、修改需要重新构建的
app.json
配置)。 - 依赖项的更改需要重新构建应用。
对于不支持的更改,您需要使用 eas build
或 expo build
重新构建应用并提交到应用商店。
第 7 步:高级功能:迁移到 EAS Update
Expo 的新服务 EAS Update 提供了版本控制、回滚和增量更新等高级功能。
迁移步骤
-
安装 EAS CLI:
npm install -g eas-cli
-
登录到 Expo:
eas login
-
配置项目:
eas build:configure
-
发布更新:
eas update
EAS Update 的优势
- 增量更新减少了下载大小。
- 支持快速回滚到以前的版本。
- 更好的版本控制和发布管理。
结论
通过 Expo 的 OTA 更新,您可以动态更新应用,而无需用户从应用商店重新下载新版本。通过配置 app.json
、利用发布通道以及使用 Updates
API,您可以确保用户体验的流畅性,同时保持对应用更新的完全控制。
对于高级用例,可以考虑迁移到 EAS Update,以利用增量更新和回滚功能等增强功能。