blog.laialex.com
All posts

expo应用内更新

摘要

Expo 应用内更新实现指南 Expo 提供了两种主要的应用内更新方案,适用于不同的使用场景: 1\. Expo 托管更新 (OTA Updates) 适用于使用 Expo 托管服务的项目: import * as Updates from

Expo 应用内更新实现指南 Expo 提供了两种主要的应用内更新方案,适用于不同的使用场景: 1\. Expo 托管更新 (OTA Updates) 适用于使用 Expo 托管服务的项目:

import * as Updates from 'expo-updates';
async function checkForUpdate() {
  try {
    const update = await Updates.checkForUpdateAsync();
    if (update.isAvailable) {
      await Updates.fetchUpdateAsync();
      // 可以立即重载应用或通知用户稍后重载
      Updates.reloadAsync();
    }
  } catch (e) {
    // 处理错误
    console.error('更新检查失败:', e);
  }
}

2\. 使用 EAS 更新 (推荐) 对于使用 EAS Build 的项目,Expo 提供了更强大的更新系统:

import { Updates } from 'expo';
async function checkEASUpdate() {
  try {
    const { isAvailable, manifest } = await Updates.checkForUpdateAsync();
    if (isAvailable) {
      // 显示更新提示
      Alert.alert(
        '更新可用',
        '发现新版本,是否立即更新?',
        [
          { text: '稍后', style: 'cancel' },
          { text: '更新', onPress: async () => {
            await Updates.fetchUpdateAsync();
            Updates.reloadAsync();
          }}
        ]
      );
    }
  } catch (error) {
    console.error('更新检查错误:', error);
  }
}

配置要点 app.json/app.config.js 中配置更新策略:

{
  "expo": {
    "updates": {
      "enabled": true,
      "checkAutomatically": "ON_LOAD", // 或 "ON_ERROR", "ON_RECOVERY", "WIFI_ONLY"
      "fallbackToCacheTimeout": 0
    }
  }
}

发布更新:

# 发布到默认频道
expo publish
# 或使用 EAS 更新
eas update --branch production --message "修复了一些bug"

最佳实践 在应用启动时检查更新 (App.js 或根组件中) 考虑用户的网络环境,大更新可提示用户连接WiFi 提供跳过更新的选项(对于非关键更新) 记录更新失败情况以便排查问题

注意事项 原生代码变更仍需通过应用商店更新 测试时可以使用 expo publish --release-channel test 发布到测试频道 更新大小限制通常为50MB(取决于Expo服务配置) 如需更复杂的更新策略,可以考虑实现自定义更新UI和逻辑。 [1]: https://blog.laialex.com/emdash/api/media/asset/med0220/2025-07-10T01%3A07%3A06.png [2]: https://blog.laialex.com/emdash/api/media/asset/med0218/2025-07-10T01%3A05%3A53.png [3]: https://blog.laialex.com/emdash/api/media/asset/med0219/2025-07-10T01%3A06%3A35.png

全文完

Discussion

No comments yet