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

在Xcode框架中集成Firebase Firestore遇大量错误,如何使其作为依赖正常运行?

在Xcode框架中集成Firebase Firestore遇大量错误,如何使其作为依赖正常运行?

我之前拆分单体Xcode项目到多框架结构时,也踩过Firebase Firestore的依赖大坑,结合你给出的项目结构,给你几个亲测有效的解决方向:

先对应你的当前项目结构(方便定位问题)

  • App主目标
    • 嵌入并签名,依赖Infrastructure框架
    • 直接关联多个Firebase库
  • Infrastructure框架
    • 仅链接(不嵌入)Networking和Core框架
    • 依赖FirebaseFirestore,用于在响应对象中解码@DocumentID
  • Networking框架
    • 仅链接(不嵌入)Core框架
    • 包含通用的Database + HTTP服务类
    • 依赖FirebaseFirestore做数据库查询
  • Core框架
    • 仅包含共享工具类

针对你的场景的具体解决方案

1. 统一Firebase依赖的引入方式(SwiftPM优先,别混着用)

首先要把所有框架和主App的Firebase依赖统一成SwiftPM引入,绝对不要混合CocoaPods和SwiftPM,这是最容易触发重复符号、类型不兼容的雷区:

  • 打开Xcode项目,在根目录的Package Dependencies里添加Firebase的SwiftPM包,指定稳定版本(比如10.x系列)
  • 给需要用到FirebaseFirestore的目标(Infrastructure、Networking、App)分别添加FirebaseFirestore作为Target Dependency,注意:
    • 框架目标(Infrastructure、Networking):只选Do Not Embed
    • 主App目标:选Embed & Sign,确保Firebase二进制文件最终只在主App里嵌入一次,避免重复符号错误

2. 解决@DocumentID跨框架类型不兼容问题

你在Infrastructure框架里用@DocumentID时,很可能会碰到“类型不匹配”的错误——因为不同框架引入的Firestore类型会被Xcode判定为不同类型。解决办法:

  • 在Core框架里创建Firestore类型的公共别名,比如:
    import FirebaseFirestore
    
    public typealias FirestoreDocumentID = DocumentID
    public typealias FirestoreDocumentReference = DocumentReference
    
  • 所有用到这些类型的框架(Infrastructure、Networking)都通过Core的别名来引用,而不是各自直接import FirebaseFirestore用原生类型,这样能保证跨框架的类型一致性

3. 把Firebase初始化收敛到主App

主App是唯一应该初始化Firebase的地方,框架里绝对不要调用FirebaseApp.configure(),否则会触发初始化冲突:

  • 在主App的AppDelegate或SceneDelegate的didFinishLaunchingWithOptions里,只调用一次FirebaseApp.configure()
  • 框架里的Firestore代码直接用Firestore.firestore()就行,不用额外初始化

4. 清缓存+重构建(很多时候这步就能解决80%的问题)

依赖问题大概率和Xcode的缓存有关,按这个步骤清干净:

  • 关闭Xcode,删掉项目目录下的DerivedData文件夹(可以通过Xcode的File > Project Settings找到路径)
  • 清空~/Library/Caches/org.swift.swiftpm目录
  • 重新打开Xcode,先执行Product > Clean Build Folder(快捷键Cmd+Shift+K),再重新构建

5. 检查框架的访问控制权限

确保框架里暴露的Firestore相关类、方法都是public的,不然主App或其他框架会访问不到:

  • 比如Networking框架里的Database服务类,要写成public class DatabaseService
  • 对应的方法也要是public func fetchDocuments(...),这样外部才能正常调用

额外的结构优化建议

  • 尽量把Firebase的具体实现收敛到Networking框架里,让它作为Firestore的唯一入口,Infrastructure框架只通过Networking的接口操作Firestore,而不是直接依赖FirebaseFirestore,后续替换或升级Firebase会更省心
  • 不要在多个框架里重复引入Firebase的不同组件,保持依赖的单一性

备注:内容来源于stack exchange,提问作者Niall Mccormack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 15:29:38