当前位置: 首页 > 知识库问答 >
问题:

错误:在使用Firestore之前调用Firebasepp.configure()

曹建明
2023-03-14

我已经开始为一个简单的应用程序开发后端,并且我已经建立了一个数据库类(名为DB委托),所有文件都将与之通信。在我的AppDelegate.swift中,我有以下内容:

static public var dbDelegate:DBDelegate = DBDelegate()

private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FirebaseApp.configure()
    return true
}

它是一个静态公共,所以我可以从其他文件中访问db委托

在我的其他文件中,我有以下帮助可读性:(因为它是一个类,它将通过引用传递)

let dbDelegate = AppDelegate.dbDelegate

在我的DBDelegate课程中:

var db = Firestore.firestore()
init() {
    FirebaseApp.configure()
}

当我构建代码时,它构建得很好。

运行时,应用程序立即崩溃与SIGABRT。错误消息是:
由于未捕获异常而终止应用程序'FIRAppNotCon的异常',原因是:'失败获取FirebasApp实例。请调用Firebase App.configure()之前使用的FiRecovery'

  • 我已尝试在DBDelegate类中的init函数上放置断点。它没有到达断点。
  • 我已尝试将所有的dbDelegate变量设置为惰性的
    • 我在AppDelegate中得到了一个编译错误:lazy不能在已经懒惰的全局上使用
    • 其他人的运行时错误:请在使用Firestore之前调用FirebaseApp.configure()
        static public var dbDelegate:DBDelegate!
        private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.
            FirebaseApp.configure()
            dbDelegate = DBDelegate()
            return true
        }
    
    • 我得到编译错误:静态成员'db委托'不能用于类型'App委托'的实例

    任何帮助都会很好!

    编辑:我找到了一个简陋的解决方案,见下文。

共有1个答案

岳志义
2023-03-14

首先,我要感谢@DionzB建议使用单例(我做到了)。我将在这个答案中引用他/她的帖子。

好的,在研究和使用断点之后,我发现我的自定义类实际上是在AppDelegate之前执行的。知道了这一点,我在以下行之前创建了一个变量:

static let shared = FirebaseService()

名称并不重要,因为我/你不会调用它,并将其分配给Firebase App.configure()

Firebase Service类变成:

class FirebaseService: NSObject {
    let constantToNeverTouch = FirebaseApp.configure()
    static let shared = FirebaseService()

    init() {
    }
}

接下来,您必须确保FirebaseApp.configure()不在代码中的其他位置。它也不应该在AppDelegate中。有多个FirebaseApp.configure()会使应用程序崩溃。

 类似资料:
  • 问题内容: 如果没有线程正在等待,使用,任何来电或没有任何效果。我有一种情况,如果在等待集为空时调用,则后续调用不应将线程置于等待状态。如何做到这一点?信号量可能是我能想到的一种解决方案。有没有更优雅的解决方案? 问题答案: 这种情况似乎非常适合。呼叫而不是和而不是等待。

  • 我现在刚到Spring。我试图遵循调用PostConstruct和BeanPostProcessor的顺序。 根据我所学,以下是顺序:- null null SpringConfig文件foo.xml删除了beans标记上下文:component-scan base-package=“SpringTest” 回应 初始化MySpring构造函数 初始化ApplicationContext Post

  • 问题内容: 问题 我正在使用内联函数定义设置反应 然后在DOM引用中未设置 我的理解是,回调应该在安装期间运行,但是在ref回调函数 之前* 调用添加语句揭示。 * 例如,我看过的其他代码示例在github上的讨论都表明相同的假设,应该在中定义的任何回调 之后调用,甚至在对话中也要说明 那么在所有的ref回调都执行完之后,componentDidMount是否被触发? 是。 我正在使用反应 15.

  • 问题内容: 因此,我遵循了Parse SDK网站的《快速入门指南》中的说明。该应用程序第一次运行良好。但是,当我最小化该应用程序并从任务切换器再次运行它时,它会强制关闭。 该错误对我来说没有任何意义。Logcat- Mainactivity.java 问题答案: 您可以有一个单独的类来执行初始化工作。因此,创建一个可扩展的类。 然后在AndroidManifest.xml中,将类添加到Applic

  • 但我明白了,尽管我的规则是公开的 我怎样才能做到这一点?我计划在未来使用改型。

  • 考虑以下合成函数: 现在,当我想在Vue抛出错误:“未捕获错误:[Vue composition api]必须在使用任何函数之前调用Vue.use(plugin)。” 组件API由文件“/boot/auth”中的Quasar Framework启动文件实例化。js': 有没有办法在组件之外使用导出的计算属性? 根据这个例子,它是一个使用相同组合API的库,当对象中实例化了时,它应该可以工作。有更多