You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bare Workflow下EAS Update生产应用不生效问题求助

EAS Update 生产应用无法接收更新排查方案

核心排查点及修复建议

1. 确认 Runtime Version 完全匹配

EAS Update 仅向runtimeVersion与更新包一致的应用推送更新,这是最常见的匹配失败原因:

  • 执行 eas update:list,查看已发布的update的runtimeVersion是否为1.0.0(与你app.json中配置的一致)
  • 若不一致,重新发布时显式指定:eas update --auto --runtime-version 1.0.0
  • 同时检查生产安装包的runtimeVersion:iOS可查看info.plist的EXUpdatesRuntimeVersion,Android查看build.gradle的expo.updates.runtimeVersion,必须与发布的update版本完全相同

2. 验证 Build 与 Channel 的关联关系

  • 确保生产环境的安装包是通过eas build --profile production构建的,该profile在eas.json中指定了channel: "production"
  • 执行eas channel:view production,确认channel指向的分支是develop
  • 执行eas update:list,确认发布的update属于develop分支且关联到production channel

3. 修复 checkForUpdate 函数逻辑问题

你的代码存在两处关键问题:

  • 未正确获取当前应用manifest:const appBuildNumber = isIos ? manifest.ios.buildNumber : manifest.android.versionCode;中的manifest未定义,应替换为Updates.manifest
  • 仅在buildNumber变化时触发更新:EAS Update支持不修改buildNumber的代码更新,你的逻辑会忽略这类合法更新。建议调整逻辑,只要检测到可用更新就提示用户重启:
export const checkForUpdate = async ({ userRun }) => {
  try {
    const update = await Updates.checkForUpdateAsync({ 
      policy: Updates.CheckPolicy.IMMEDIATE // 强制实时检查,跳过缓存
    });
    const { isAvailable, manifest: newManifest } = update;
    if (isAvailable) {
      await Updates.fetchUpdateAsync();
      // 无论buildNumber是否变化,都提示更新
      const onPress = Updates.reloadAsync;
      const appVersion = `v${newManifest.version}-${isIos ? newManifest.ios.buildNumber : newManifest.android.versionCode}`;
      handleUpdates({ appVersion, onPress }); 
    } 
  } catch (e) {
    console.log('checkForUpdateError:' + e);
    handleAlertNew({ userRun });
  }
  return true;
};

4. 补全 Bare Workflow 原生配置

Bare Workflow下需确保原生端正确集成expo-updates:

  • iOS:
    1. 确认info.plist中EXUpdatesURL与app.json的updates.url一致(https://u.expo.dev/[你的项目ID])
    2. 检查AppDelegate.m文件中是否有expo-updates初始化代码:
      #import <EXUpdates/EXUpdates.h>
      // ...
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
        // ...
        [EXUpdatesController.sharedController startAndShowLaunchScreen:self.window];
        // ...
      }
      
  • Android:
    1. 确认app/build.gradle中配置正确:
      expo {
        updates {
          url = "https://u.expo.dev/[你的项目ID]"
          runtimeVersion = "1.0.0"
        }
      }
      
    2. 检查MainApplication.java中是否初始化expo-updates:
      import expo.modules.updates.UpdatesController;
      // ...
      @Override
      public void onCreate() {
        super.onCreate();
        // ...
        UpdatesController.initialize(this);
      }
      

5. 排除缓存干扰

  • iOS:卸载应用后重新安装生产包,再测试更新
  • Android:清除应用缓存后重启,或卸载重装
  • 在checkForUpdateAsync中添加policy: Updates.CheckPolicy.IMMEDIATE(如上述代码所示),绕过Expo默认的更新检查缓存

6. 确认更新发布状态

执行eas update:list,检查:

  • 目标update的status为Active
  • update的branch为develop,channel为production

内容的提问来源于stack exchange,提问作者shaun Ko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:13:21