Expo OTA 更新的配置与实现

Expo 支持 Over-The-Air (OTA) 更新,使您能够在不要求用户从应用商店重新下载的情况下推送更新。这一功能可以动态修复错误、更新功能或修改内容。以下是详细的配置、实现和管理 OTA 更新的指南。


前置条件

  1. 管理工作流(Managed Workflow):OTA 更新适用于使用 Expo 管理工作流的应用。如果使用裸工作流(Bare Workflow),需要自定义配置或使用第三方解决方案。

  2. Expo CLI:确保安装了最新版本的 Expo CLI。

    npm install -g expo-cli
    
  3. Expo 账户:您需要一个 Expo 账户来发布更新。


第 1 步:启用 OTA 更新

Expo 默认启用 OTA 更新,但您可以在 app.jsonapp.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 发布更改。

  1. 修改代码或资源:更新项目中的 JavaScript 或资源。

  2. 发布更新

    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 更新

测试步骤

  1. 运行 expo publish 推送更新。
  2. 在目标设备上重启应用。
  3. 确认应用已接收到更新。

常见问题

  • 未接收到更新:确保应用配置了正确的发布通道。
  • 更新未应用:确保在更新下载完成后重启应用。

第 6 步:OTA 更新的限制

支持的更改

  • JavaScript 代码更改
  • 资源更新(如图像、字体)

不支持的更改

  • 原生代码更改(例如新增原生模块、修改需要重新构建的 app.json 配置)。
  • 依赖项的更改需要重新构建应用。

对于不支持的更改,您需要使用 eas buildexpo build 重新构建应用并提交到应用商店。


第 7 步:高级功能:迁移到 EAS Update

Expo 的新服务 EAS Update 提供了版本控制、回滚和增量更新等高级功能。

迁移步骤

  1. 安装 EAS CLI

    npm install -g eas-cli
    
  2. 登录到 Expo

    eas login
    
  3. 配置项目

    eas build:configure
    
  4. 发布更新

    eas update
    

EAS Update 的优势

  • 增量更新减少了下载大小。
  • 支持快速回滚到以前的版本。
  • 更好的版本控制和发布管理。

结论

通过 Expo 的 OTA 更新,您可以动态更新应用,而无需用户从应用商店重新下载新版本。通过配置 app.json、利用发布通道以及使用 Updates API,您可以确保用户体验的流畅性,同时保持对应用更新的完全控制。

对于高级用例,可以考虑迁移到 EAS Update,以利用增量更新和回滚功能等增强功能。