Ошибка: `вызов FirebaseApp.configure () перед использованием Firestore` - PullRequest
0 голосов
/ 25 ноября 2018

Справочная информация

Я начал разработку серверной части для простого приложения и настроил класс базы данных (с именем DBDelegate), с которым будут взаимодействовать все файлы.В моем 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
}

Это static public, поэтому я могу получить доступ к dbDelegate из других файлов.

В других моих файлах для удобства чтения у меня есть следующее: (потому что это класс, который он будет передавать по ссылке)

let dbDelegate = AppDelegate.dbDelegate

В моем DBDelegate классе:

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

Сборка и запуск

Когда я собираю свой код, он строится нормально.

При запуске приложение быстро вылетает с SIGABRT.Сообщение об ошибке:
Terminating app due to uncaught exception 'FIRAppNotConfiguredException', reason: 'Failed to get FirebaseApp instance. Please call FirebaseApp.configure() before using Firestore'

Что я пробовал

  • Я попытался установить точку останова для функции init в классе DBDelegate.Это не достигает точки останова.
  • Я попытался сделать все dbDelegate переменные lazy:
    • Я получил ошибку компиляции для той в AppDelegate: lazy must not be used on an already-lazy global
    • Ошибки времени выполнения для других: пожалуйста, вызовите FirebaseApp.configure () перед использованием Firestore.
  • Я попробовал следующее (назначая dbDelegate в didFinishLaunchingWithOptions):
    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
    }
  • Я получаю сообщение об ошибке компиляции: Static member 'dbDelegate' cannot be used on instance of type 'AppDelegate'

Любая помощь будет отличной!

Редактировать: Я нашел нестандартное решение, см. Ниже.

Ответы [ 5 ]

0 голосов
/ 30 июля 2019

Вы можете переопределить метод init AppDelegate с помощью FirebaseApp.configure () и убедиться, что он загружается до создания любых окон.

override init() {
        FirebaseApp.configure()
}
0 голосов
/ 12 июня 2019

let dbDelegate = AppDelegate.dbDelegate

В вашем классе DBDelegate:

var db : Firestore?
init() {
    FirebaseApp.configure()
    db = Firestore.firestore()
}
0 голосов
/ 26 ноября 2018

Во-первых, я хотел бы поблагодарить @DionzB за предложение использовать синглтоны (что я и сделал).В этом ответе я буду ссылаться на его / ее пост.

Хорошо, поэтому после некоторого исследования и игры с точками останова я обнаружил, что мой пользовательский класс действительно выполняется до AppDelegate.Зная это, я создал переменную перед следующей строкой:

static let shared = FirebaseService()

имя не имеет значения, потому что я / вы его не назовете, и присвойте его FirebaseApp.configure()

Класс FirebaseService становится:

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

    init() {
    }
}

Далее, вы должны убедиться, что FirebaseApp.configure () не где-то еще в вашем коде.Не должно быть и в AppDelegate.Наличие нескольких FirebaseApp.configure () приводит к сбою приложения.

0 голосов
/ 18 января 2019

Скорее всего, ваш код в неправильном порядке.Убедитесь, что ваш код окна помещен ПОСЛЕ firebaseApp.configure, а не раньше.Я получал тот же сбой, пока просто не разместил свои коды создания окон: (window = UIWindow (frame: UIScreen.main.bounds) и т. Д.) После соединения firebaseApp.configure. Просто поменяйте местами их размещение:

    FirebaseApp.configure()
    let db = Firestore.firestore()
    let settings =  db.settings
    settings.areTimestampsInSnapshotsEnabled = true
    db.settings = settings

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = HomeController()
    window?.makeKeyAndVisible()
0 голосов
/ 25 ноября 2018

Было бы лучше создать новый синглтон для Firebase.

class FirebaseService: NSObject {
    static let shared = FirebaseService()

    init() {
         FirebaseApp.configure()
    }
}

Тогда вы сможете получить доступ ко всему через общий доступ, например:

FirebaseService.shared.methodName

Для настройки в делегате приложения вам потребуетсяназывать это как:

_ = FirebaseService.shared
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...