FBLPromise在CocoaPods与SwiftPM共存场景下崩溃问题求助
解决SwiftPM与CocoaPods混合依赖Firebase时的FBLPromise崩溃问题
我太懂这种混合依赖管理的糟心了——明明只是想升级个SDK,结果从警告直接变崩溃,还因为项目结构限制没法随便移除依赖。结合你的场景(SwiftPM组件必须依赖Promises,Firebase暂时还在CocoaPods),给你几个可行的解决方向:
方案1:统一Promises版本并避免重复嵌入
核心思路是让CocoaPods和SwiftPM使用完全相同版本的Promises,并且只嵌入一次:
- 先查看你SwiftPM依赖中Promises的具体版本(比如
1.2.12),然后在Podfile里强制指定这个版本:use_modular_headers! # 开启模块化头,提升跨依赖管理兼容性 pod 'Firebase/Core' pod 'PromisesObjC', '= 1.2.12' # 替换成你SwiftPM里的实际版本 - 执行
pod install后,打开Xcode项目,找到SwiftPM引入的Promises包(在Package Dependencies下),选中它对应的target,在General标签的Frameworks, Libraries, and Embedded Content里,把Promises的状态改成Do Not Embed。这样就只会保留CocoaPods嵌入的那一份Promises,避免重复符号冲突。
方案2:让CocoaPods的Firebase复用SwiftPM的Promises
如果不想额外通过CocoaPods引入Promises,可以用CocoaPods的钩子修改Firebase的依赖,让它直接使用SwiftPM的版本:
在Podfile中添加pre_install钩子:
pre_install do |installer| installer.pod_targets.each do |target| # 移除所有Firebase组件对PromisesObjC的依赖 if target.name.start_with?('Firebase') target.dependencies.reject! { |dep| dep.name == 'PromisesObjC' } end end end use_modular_headers! pod 'Firebase/Core'
执行pod install后,CocoaPods会跳过安装PromisesObjC,直接复用SwiftPM已经引入的版本,从根源上避免重复实现。
方案3:逐步迁移Firebase到SwiftPM
如果项目允许,最彻底的解决方式是把Firebase从CocoaPods迁移到SwiftPM——Firebase官方早就支持SwiftPM集成了:
- 在Xcode中打开File > Add Packages,输入Firebase的仓库地址,指定你需要的版本(比如v6.26.0);
- 移除Podfile中Firebase相关的配置,执行
pod install清理CocoaPods的Firebase依赖; - 调整项目中的Firebase初始化代码(大部分情况下不需要修改,SwiftPM和CocoaPods的API是一致的)。
为什么升级后会从警告变崩溃?
之前的Firebase版本中,两个来源的FBLPromise API还保持兼容,所以只是出现重复符号警告;但v6.26.0中Firebase对Promises的扩展(比如firebaseInstallationID方法)做了调整,导致主app中SwiftPM编译的FBLPromise没有这个方法,运行时调用就直接崩溃了。
内容的提问来源于stack exchange,提问作者basvk
相关产品推荐
相关产品推荐

