React Native iOS应用OneSignalExtension.framework重复生成错误求助
问题描述
在使用 Xcode 15.1、OneSignal 4.5.1 的 React Native iOS 应用中,遇到以下编译错误:
Multiple commands produce '/Users/hamzabakaran/Library/Developer/Xcode/DerivedData/mobile-ctpnuulbuipfykbyqdihvziwoxdf/Build/Products/Debug-iphonesimulator/AppName.app/Frameworks/OneSignalExtension.framework'
Target 'mobile' (project 'mobile') has copy command from '/Users/hamzabakaran/Documents/Projects/app/app-mobile/ios/Pods/OneSignalXCFramework/iOS_SDK/OneSignalSDK/OneSignal_Extension/OneSignalExtension.xcframework/ios-arm64_i386_x86_64-simulator/OneSignalExtension.framework' to '/Users/hamzabakaran/Library/Developer/Xcode/DerivedData/mobile-ctpnuulbuipfykbyqdihvziwoxdf/Build/Products/Debug-iphonesimulator/AppName.app/Frameworks/OneSignalExtension.framework'
尝试切换到 OneSignal 4.5.0 并移除 Embed Frameworks 中的 OneSignalExtension.xcframework 后,又出现新错误:
/Users/hamzabakaran/Documents/Projects/app/app-mobile/ios/Pods/boost/boost/container_hash/hash.hpp:131:33 No template named 'unary_function' in namespace 'std'; did you mean '__unary_function'?
解决方案
一、修复 OneSignal 4.5.1 的「Multiple commands produce」错误
该错误源于 OneSignalExtension.framework 被重复引用或错误嵌入到主 target:
- 检查并修正 Podfile 配置
打开ios/Podfile,确认没有重复添加 OneSignalXCFramework 的引用,确保 Notification Service Extension target 的配置正确(仅扩展target引用OneSignalExtension)。执行以下命令清理并重装Pods:
pod deintegrate && pod install- 检查并修正 Podfile 配置
- 调整 Xcode 的 Embed Frameworks 设置
打开 Xcode 项目,选中主 target(mobile),进入 Build Phases → Embed Frameworks,移除其中的OneSignalExtension.framework——该框架仅属于 Notification Service Extension target,主应用target无需嵌入。
- 调整 Xcode 的 Embed Frameworks 设置
- 清理编译缓存
点击 Xcode 菜单 Product → Clean Build Folder,再手动删除 Derived Data:
rm -rf ~/Library/Developer/Xcode/DerivedData- 清理编译缓存
二、修复 OneSignal 4.5.0 带来的 Boost 库错误
若坚持使用 4.5.0 版本,可通过以下方式解决 Boost 库的 C++ 标准兼容问题:
- 更新 Boost 依赖版本
在ios/Podfile中指定适配 C++17 的 Boost 版本:
执行命令更新:pod 'boost', '>= 1.76.0'pod update boost- 更新 Boost 依赖版本
- 修改 Xcode C++ 标准设置
选中主 target 和所有 Pods 相关 target,进入 Build Settings:
- 搜索「C++ Language Dialect」,设置为
GNU++14或C++14 - 搜索「C++ Standard Library」,设置为
libstdc++(若项目兼容)
- 修改 Xcode C++ 标准设置
建议优先方案
优先修复 OneSignal 4.5.1 的重复引用问题,无需降级到 4.5.0——降级带来的 Boost 兼容问题反而更复杂,解决重复嵌入后即可正常编译。
内容的提问来源于stack exchange,提问作者HB1306

