SwiftUI集成Firebase Apple登录启动崩溃:NSInternalInconsistencyException
解决SwiftUI+SPM引入Firebase服务启动崩溃问题
问题原因
崩溃抛出NSInternalInconsistencyException,本质是Firebase Auth实例初始化早于FirebaseApp.configure()执行。你的AuthState作为@State属性,会在SomeApp结构体初始化时就创建,如果AuthState内部直接初始化了Firebase Auth相关实例,此时FirebaseApp.configure()还未执行(即使在AppDelegate的didFinishLaunching中配置,也晚于@State属性的初始化时机),就会触发错误。
解决方案
方案1:提前在App结构体初始化时配置Firebase,延迟AuthState初始化
修改@main的App代码,将Firebase配置移到结构体初始化方法中,并延迟创建AuthState,确保Firebase配置完成后再初始化Auth相关逻辑:
import FirebaseService import SwiftUI @main struct SomeApp: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate @State private var authState: AuthState? = nil init() { // 优先配置Firebase FirebaseApp.configure() // 延迟到主队列初始化AuthState,确保Firebase配置完成 DispatchQueue.main.async { self.authState = AuthState() } } var body: some Scene { WindowGroup { guard let authState = authState else { ProgressView() return } switch authState.value { case .undefined: ProgressView() case .authenticated: ContentView() case .notAuthenticated: AuthView() } } } }
方案2:修改AuthState,延迟Firebase Auth访问
如果AuthState内部有直接初始化Firebase Auth的代码(比如全局变量、静态属性或初始化方法中调用Auth.auth()),将这部分逻辑改为延迟执行,例如在需要时再获取Auth实例:
// 示例AuthState修改方式 enum AuthStatus { case undefined, authenticated, notAuthenticated } class AuthState: ObservableObject { @Published var value: AuthStatus = .undefined private var auth: Auth? // 延迟初始化 init() { // 不要在init中直接访问Auth.auth() // 改为在后续逻辑中初始化 setupAuthListener() } private func setupAuthListener() { // 确保Firebase已配置后再获取Auth实例 guard FirebaseApp.app() != nil else { // 可以重试或抛出错误 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.setupAuthListener() } return } self.auth = Auth.auth() // 后续添加监听逻辑 auth?.addStateDidChangeListener { [weak self] _, user in self?.value = user != nil ? .authenticated : .notAuthenticated } } }
额外检查项
- 确认
GoogleService-Info.plist已添加到主项目中,且目标成员资格勾选了当前应用(SPM依赖包无法读取主项目外的plist)。 - 检查FirebaseService依赖包中是否存在全局初始化Firebase服务的代码(比如静态属性中直接调用
Auth.auth()),如果有,需联系包作者修改或自行fork调整。
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

