React Native 0.69.12 iOS编译失败:fmt组件报错修复后出现OneSignalNotificationServiceExtension相关错误
React Native 0.69.12 iOS编译失败:fmt组件报错修复后出现OneSignalNotificationServiceExtension相关错误
我完全懂你这种被旧项目版本绑定、又遇到新Xcode编译兼容问题的无奈——React Native 0.69.12和Xcode 16.3之间确实存在不少编译规则的差异,尤其是C++和Swift部分的变化,而你又没法升级RN,只能针对性调整配置。咱们一步步来解决:
首先,你之前遇到的fmt组件编译失败,是因为Xcode 16默认的C++标准和lib库设置和旧版Pods依赖不兼容;而后来出现的OneSignal扩展Swift编译错误,是因为你设置的架构排除规则和Swift编译的要求冲突了。下面是具体的修复方案:
一、优化并统一Post_install配置
把你现在分散的三个target循环合并,避免重复处理,同时针对性调整每个组件的编译规则:
post_install do |installer| # 全局调整所有Pods Target的基础编译设置 installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # 适配Xcode16模拟器架构:Apple Silicon Mac排除i386,Intel Mac排除arm64 if `uname -m` == 'arm64' config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'i386' else config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' end # 仅Debug模式启用「仅活动架构」,Release模式关闭避免打包问题 config.build_settings['ONLY_ACTIVE_ARCH'] = config.name == 'Debug' ? 'YES' : 'NO' # 统一设置C++库为libc++,减少跨组件编译冲突 config.build_settings['CLANG_CXX_LIBRARY'] = 'libc++' end end # 单独针对fmt组件调整C++编译规则 installer.pods_project.targets.each do |target| if target.name == 'fmt' target.build_configurations.each do |config| # 强制C++17标准,适配Xcode16的Clang编译要求 config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17' # 添加兼容宏,解决旧版C++代码的语法兼容问题 config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'] # 禁用Clang模块,避免模块导入冲突 config.build_settings['CLANG_ENABLE_MODULES'] = 'NO' config.build_settings['CLANG_MODULES_AUTOLINK'] = 'NO' end end end # 单独针对OneSignalNotificationServiceExtension调整Swift编译规则 installer.pods_project.targets.each do |target| if target.name == 'OneSignalNotificationServiceExtension' target.build_configurations.each do |config| # 确保Swift版本和RN0.69兼容(RN0.69默认适配Swift 5.5) config.build_settings['SWIFT_VERSION'] = '5.5' # Swift扩展需要开启模块支持,和全局fmt的设置区分开 config.build_settings['CLANG_ENABLE_MODULES'] = 'YES' # 继承全局架构规则,不要单独修改导致冲突 config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = installer.pods_project.build_configurations.first.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] end end end end
配置说明:
- 全局架构调整:根据你的Mac芯片类型自动适配模拟器架构排除规则,避免Xcode16的架构不匹配问题;
- fmt组件:保留你之前的C++17设置,同时添加兼容宏解决旧代码的编译报错;
- OneSignal扩展:明确指定Swift版本(和RN0.69兼容的5.5),开启Swift必需的模块支持,避免Swift编译失败。
二、执行完整的清理和重建步骤
确保所有旧的编译产物被彻底清除,再重新构建:
# 1. 清理RN项目依赖缓存 rm -rf node_modules rm package-lock.json yarn.lock npm install # 或 yarn install # 2. 彻底清理iOS编译缓存和Pods rm -rf ios/Pods rm -rf ios/Podfile.lock rm -rf ios/DerivedData rm -rf ~/Library/Developer/Xcode/DerivedData # 3. 重新安装Pods并更新仓库 cd ios && pod install --repo-update cd .. # 4. 用CLI重新运行项目(或打开Xcode手动构建) npx react-native run-ios --scheme 'VeeraHealthPcosDev' --configuration Debug --simulator='iPhone 13' --verbose
三、额外排查点
如果问题仍然存在,可以检查以下内容:
- OneSignal版本兼容性:确保你使用的
react-native-onesignal版本和RN0.69.12兼容(建议锁定在4.x版本,5.x版本不支持旧RN); - Swift文件语法检查:打开Xcode进入
OneSignalNotificationServiceExtensiontarget,查看NotificationService.swift是否有语法错误或使用了已废弃的API; - Xcode构建日志详情:在Xcode中点击「Report Navigator」,查看Swift编译失败的具体错误信息(比如某个API不存在、类型不匹配等),针对性修复。
内容来源于stack exchange
相关产品推荐
相关产品推荐

