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

