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

Firebase初始化报错:需先配置FirebaseApp再初始化Auth实例

解决Firebase Auth初始化前未配置默认FirebaseApp的问题

错误原因分析

从调用栈可以看出,AuthenticationViewModel在初始化阶段就调用了Auth.auth(),但这个时机早于FirebaseApp.configure()的执行。SwiftUI项目中,@main标记的App结构体初始化可能优先于AppDelegate的application(_:didFinishLaunchingWithOptions:)方法,导致Firebase核心还未完成配置,Auth就被提前初始化了。

解决方案

方案1:将Firebase配置移至SwiftUI的@main结构体(推荐)

SwiftUI项目更适合在App入口的初始化方法中完成Firebase配置,确保Auth访问前配置已完成:

@main
struct PlantsApp: App {
    init() {
        // 优先完成Firebase核心配置
        FirebaseApp.configure()
        // 再配置Auth模拟器
        Auth.auth().useEmulator(withHost: "localhost", port: 9099)
    }
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

同时可以移除原AppDelegate中的配置代码,避免重复执行。

方案2:保留AppDelegate并延迟Auth的访问

如果需要继续使用AppDelegate,首先确保它与SwiftUI App正确关联:

@main
struct PlantsApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

然后修改AuthenticationViewModel,不要在初始化时直接访问Auth,而是将Auth监听逻辑延迟到视图加载后:

class AuthenticationViewModel: ObservableObject {
    private var authStateHandle: AuthStateDidChangeListenerHandle?
    
    // 延迟初始化Auth监听
    func registerAuthStateHandler() {
        authStateHandle = Auth.auth().addStateDidChangeListener { auth, user in
            // 处理用户状态变化逻辑
        }
    }
    
    // 记得在合适的时机移除监听(比如视图消失)
    func removeAuthStateHandler() {
        if let handle = authStateHandle {
            Auth.auth().removeStateDidChangeListener(handle)
        }
    }
}

在对应的视图中,通过onAppear触发监听注册:

struct ContentView: View {
    @StateObject var viewModel = AuthenticationViewModel()
    
    var body: some View {
        // 你的视图内容
        Text("Plants App")
            .onAppear {
                viewModel.registerAuthStateHandler()
            }
            .onDisappear {
                viewModel.removeAuthStateHandler()
            }
    }
}

额外排查步骤

  1. 确认GoogleService-Info.plist文件存在于项目中,且已勾选对应的target(重新初始化Firebase模拟器套件可能误删或未关联该文件)
  2. 清理项目缓存:
    • 按下Cmd+Shift+K清理构建文件夹
    • 删除模拟器中的App,重新安装
    • 重启Xcode和Firebase模拟器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:00:24