SplitBundleLoader 在 RN 0.86 下编译失败
Date: 2026-07-08 Status: Fixed Scope: rn_app iOS BrownfieldLib / SplitBundleLoader
问题描述
- 现象:执行
brownfield package:ios时编译失败,报错no visible @interface for 'RCTCxxBridge' declares the selector 'executeApplicationScript:url:async:' - 触发条件:RN 0.86 + New Architecture +
RCT_REMOVE_LEGACY_ARCH=1下打包 BrownfieldLib - 影响范围:无法重打 iOS BrownfieldLib,Release OTA split bundle 加载受阻
根因分析
RN 0.86 在启用 RCT_REMOVE_LEGACY_ARCH=1 后,Legacy Bridge 的 RCTCxxBridge.executeApplicationScript:url:async: 从头文件与实现中移除。项目实际运行时使用 Bridgeless 模式(RCTBridgeProxy + RCTHost),原 SplitBundleLoader 仍调用已废弃的 Legacy API,导致编译失败。
解决方案
改为 Bridgeless 路径:通过 RCTBridgeProxy 获取 runtime 与 jsCallInvoker,在 JS 线程用 jsi::Runtime::evaluateJavaScript 加载 split bundle。Legacy 路径保留在 #ifndef RCT_REMOVE_LEGACY_ARCH 分支中以便兼容。
关键变更:
rn_app/ios/BrownfieldLib/SplitBundleLoader.mm— 适配 RN 0.86 Bridgeless API
验证方式
-
npm run brownfield:package:ios:debug编译通过(BUILD SUCCEEDED) - 真机/模拟器验证 Release OTA split bundle 动态加载
后续建议
- 在宿主 App 中验证
SplitBundleLoader.load()端到端加载 remote bundle - 关注 RN 后续版本是否提供官方 split bundle 公开 API,减少依赖 private 接口