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

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

三、额外排查点

如果问题仍然存在,可以检查以下内容:

  1. OneSignal版本兼容性:确保你使用的react-native-onesignal版本和RN0.69.12兼容(建议锁定在4.x版本,5.x版本不支持旧RN);
  2. Swift文件语法检查:打开Xcode进入OneSignalNotificationServiceExtension target,查看NotificationService.swift是否有语法错误或使用了已废弃的API;
  3. Xcode构建日志详情:在Xcode中点击「Report Navigator」,查看Swift编译失败的具体错误信息(比如某个API不存在、类型不匹配等),针对性修复。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:25:31