如何在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' # 若需用户认证可添加 endpod 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
相关产品推荐
相关产品推荐

