iOS端EAS Update初始化失败求助(Expo SDK45→49迁移)
解决EXUpdates.UpdatesNotInitializedException 1报错的排查方案
针对裸工作流从Expo SDK45升级到49并迁移EAS Update时遇到的这个报错,以下是几个关键排查和修复方向:
确保EXUpdates在原生端完成初始化
裸工作流下,EXUpdates模块需要在App启动阶段由原生代码完成初始化,否则无法调用JS侧的更新API:- iOS:检查
AppDelegate.mm(或.m)文件,确保在didFinishLaunchingWithOptions方法中,创建window后添加初始化代码:
这段代码要放在// 初始化EXUpdates并显示启动屏 [EXUpdatesController.sharedController startAndShowLaunchScreen:self.window];return YES;之前,且确保self.window已正确初始化。 - Android:检查
MainApplication.java,在onCreate方法开头添加初始化代码:
同时确认import expo.modules.updates.UpdatesController; @Override public void onCreate() { super.onCreate(); // 初始化Updates控制器 UpdatesController.initialize(this); // 其他初始化代码... }AndroidManifest.xml中已配置正确的meta-data项,比如expo.modules.updates.EXPO_UPDATE_URL和expo.modules.updates.EXPO_RUNTIME_VERSION。
- iOS:检查
检查runtimeVersion的一致性
确保以下三处的runtimeVersion完全匹配:- 本地
app.config.json中配置的runtimeVersion - EAS Build构建出的App中实际生效的runtimeVersion(可通过查看iOS的
expo.plist或Android的strings.xml确认) - EAS Update发布时指定的runtimeVersion(执行
eas update时的配置或分支关联的版本)
只要有一处不匹配,更新就无法被检测到,甚至会触发初始化异常。
- 本地
调整更新检查的调用时机
避免在App刚启动时立即调用checkForUpdateAsync,此时原生端的EXUpdates可能还未完成初始化。建议:- 将更新检查逻辑放在用户主动触发的事件中(比如“检查更新”按钮的点击事件)
- 如果需要自动检查,可在根组件的
useEffect中监听AppState变为active后再执行:import { AppState } from 'react-native'; useEffect(() => { const subscription = AppState.addEventListener('change', async (nextAppState) => { if (nextAppState === 'active') { await onCheckUpdate(); } }); return () => subscription.remove(); }, []);
验证EAS渠道关联是否正确
确认eas.json中develop配置的channel与实际发布更新时指定的渠道一致,且该渠道的更新已正确关联到对应runtimeVersion。可通过eas update:list命令查看已发布的更新信息,核对渠道、runtimeVersion等参数。
内容的提问来源于stack exchange,提问作者Juan Salvador Portugal
相关产品推荐
相关产品推荐

