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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:05:22