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

如何在Swift中创建两个Target并实现继承与Firebase集成?

多Target下集成Firebase并复用CoreData功能的实现方案

一、前期Target配置

  • 确保第二个Target已关联第一个Target的所有共享代码:选中共享文件(如模型类、基础业务逻辑),在右侧文件检查器的Target Membership中勾选第二个Target
  • 为第二个Target单独引入Firebase依赖:使用CocoaPods的话,在Podfile中为两个Target分别声明依赖,示例如下:
    target 'TodoOffline' do
      use_frameworks!
      pod 'CoreData'
    end
    
    target 'TodoOnline' do
      use_frameworks!
      pod 'CoreData'
      pod 'Firebase/Firestore'
      pod 'Firebase/Auth' # 若需用户认证可添加
    end
    
    执行pod install完成依赖安装

二、抽象存储层协议

为了让业务层与存储实现解耦,先定义统一的存储协议,CoreData和Firebase实现都遵循该协议:

protocol TodoStorageProtocol {
    func fetchTodos(completion: @escaping ([Todo]) -> Void)
    func saveTodo(_ todo: Todo, completion: @escaping (Error?) -> Void)
    func deleteTodo(_ todo: Todo, completion: @escaping (Error?) -> Void)
}

三、编写Firebase存储类(仅归属第二个Target)

创建Firebase存储实现类,仅让它属于第二个Target(在文件检查器的Target Membership中只勾选第二个Target),并实现上述协议:

import FirebaseFirestore

class FirebaseTodoStorage: TodoStorageProtocol {
    private let db = Firestore.firestore()
    private let todosCollection = "todos"

    func fetchTodos(completion: @escaping ([Todo]) -> Void) {
        db.collection(todosCollection).getDocuments { snapshot, error in
            guard let docs = snapshot?.documents else {
                completion([])
                return
            }
            let todos = docs.compactMap { try? $0.data(as: Todo.self) }
            completion(todos)
        }
    }

    func saveTodo(_ todo: Todo, completion: @escaping (Error?) -> Void) {
        let docRef = db.collection(todosCollection).document(todo.id.uuidString)
        do {
            try docRef.setData(from: todo)
            completion(nil)
        } catch {
            completion(error)
        }
    }

    func deleteTodo(_ todo: Todo, completion: @escaping (Error?) -> Void) {
        db.collection(todosCollection).document(todo.id.uuidString).delete { completion($0) }
    }
}

四、在第二个Target中切换存储实现

在业务逻辑类(如TodoViewModel)中,通过编译宏区分Target,初始化对应存储实例:

class TodoViewModel {
    private let storage: TodoStorageProtocol

    init() {
        #if ONLINE_TARGET // 需在第二个Target的Build Settings -> Other Swift Flags中添加 `-D ONLINE_TARGET`
            storage = FirebaseTodoStorage()
        #else
            storage = CoreDataTodoStorage() // 第一个Target的CoreData实现类
        #endif
    }

    // 业务方法统一通过storage调用,无需关心底层存储类型
    func loadTodos() {
        storage.fetchTodos { [weak self] todos in
            // 更新UI逻辑
        }
    }
}

五、核心注意事项

  • Firebase配置文件GoogleService-Info.plist仅添加到第二个Target
  • 共享模型类(如Todo)需同时勾选两个Target的Membership,若适配Firestore需实现Codable协议
  • 测试时切换不同Target,分别验证离线/在线功能

内容的提问来源于stack exchange,提问作者AMIT SAH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:58:33