Firebase случайно падает при запуске - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть приложение Firebase в Swift.Теперь моя проблема очень проста для объяснения, но очень странна для отладки.

Проблема: всякий раз, когда я открываю приложение, оно работает совершенно нормально.Делает все, что должно, и т. Д. Но когда я просто на некоторое время оставляю приложение в фоновом режиме и открываю его, я получаю сбой.Я должен открыть его как 2 раза, чтобы сбой произошел, или он убил его.

Повторное создание ошибки: шаг 1: Откройте приложение (сделайте что-нибудь там или просто оставьте его), а затем просто вернитесь кдомой и не убивайте его, сохраняя в фоновом режиме

Шаг 2: Откройте приложение через некоторое время.---> дает сбой

Шаг 3: Через некоторое время или сразу же откройте его снова после шага 2 ---> Сбой снова

Шаг 4: Откройте его в третий раз.---> работает совершенно нормально.

Примечание. Чтобы избежать сбоев, мне всегда придется его убивать.Это в целом ужасный UX.

Кроме того, я проверил свои списки.они правильно функционируют.Тем не менее, когда он падает, я получаю эту ошибку:

2018-12-20 19:05:44.272413-0800 SpotMi[15557:862318] *** Terminating app due to uncaught exception 'FIRAppNotConfigured', reason: 'Failed to get default Firebase Database instance. Must call `[FIRApp configure]` (`FirebaseApp.configure()` in Swift) before using Firebase Database.'
*** First throw call stack:
(0x1a1e2bea0 0x1a0ffda40 0x1a1d32674 0x1030c8d20 0x102f9cd24 0x102f992b0                     0x102f9926c 0x10f928dc8 0x10f92ae28 0x10ef95e18 0x102f9935c 0x102f49644     0x102f4a55c 0x102f4ad94 0x102e03b18 0x102d5cd4c 0x102f49260 0x102f493b0 0x102f4ac74 0x102f4b11c 0x102dbaf3c 0x102dbafd8 0x1cea6620c 0x1cea6663c 0x1cf0551e4 0x1cf051200 0x1cf0240a0 0x1cf02585c 0x1cf02b2a8 0x1ce8c7358 0x1ce8cffd8 0x1ce8c6fd4 0x1ce8c7974 0x1ce8c5a74 0x1ce8c5720 0x1ce8ca8e0 0x1ce8cb840 0x1ce8ca798 0x1ce8cf684 0x1cf0297a0 0x1cec12bac 0x1a48609d4 0x1a486b79c 0x1a486ae94 0x10f928dc8 0x10f92ca10 0x1a489fa9c 0x1a489f728 0x1a489fd44 0x1a1dbc1cc 0x1a1dbc14c 0x1a1dbba30 0x1a1db68fc 0x1a1db61cc 0x1a402d584 0x1cf02d054 0x102d5da9c 0x1a1876bb4)
libc++abi.dylib: terminating with uncaught exception of type NSException

Appdelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    #if DEVELOPMENT
    print("Development Mode Started")
    let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")
    guard let fileopts = FirebaseOptions.init(contentsOfFile: filePath!)
        else {
            fatalError("Couldn't load config file")
    }
    FirebaseApp.configure(options: fileopts)

    #else
    print("Production Mode Started")
    FirebaseApp.configure()
    #endif

    return true
}

Я попытался вставить этот патч в init(), но тогда уведомления перестали работать.

Как мне решить эту проблему.И что я делаю не так?

Дайте мне знать, если потребуется дополнительная информация.

Мой синглтон Firebase ниже:

class FBDataservice : NSObject {

static var ds = FBDataservice() //<-------- Always crahses on this line

let DB_URL: DatabaseReference = Database.database().reference()
let ST_URL: StorageReference = Storage.storage().reference()

private lazy var _REF_BASE = DB_URL
private lazy var _REF_POSTS = DB_URL.child("key1")
private lazy var _REF_USERS = DB_URL.child("key2")

private lazy var _ST_REF_PROFPOST = ST_URL.child("key3")

var REF_BASE: DatabaseReference! {
    return _REF_BASE
}

var REF_POSTS: DatabaseReference! {
    return _REF_POSTS
}

var REF_USERS: DatabaseReference! {
    return _REF_USERS
}

var REF_POST_USERIMG: StorageReference {
    return _ST_REF_USERPOST
}


}

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я предполагаю, что подключение к Firebase занимает слишком много времени, поэтому, когда возникает зависимость в вашем коде, приложение не знает, что делать.Вы можете попытаться поместить связанные с подключением коды (Firebase.configure) в блок try-catch, чтобы увидеть, что происходит.

0 голосов
/ 21 декабря 2018

AppDelegate инициализирует все начальные контроллеры представления (и все первичные контроллеры представления в контроллере навигации с вкладками) и вызовет viewDidLoad() на них во время запуска приложения.Это сделано специально ( viewDidload viewController вызывается перед методом appDelegate )

Проблема в том, что вы обращаетесь к вашей переменной ds в методах init () или viewDidLoad().Это приводит к возникновению состояния гонки между вызовом FirebaseApp.configure() и каждым из viewDidLoad() методов.Если когда-либо FirebaseApp.configure() завершится до инициализации viewcontroller, у вас все будет в порядке.

Чтобы решить эту проблему, вы должны взять на себя инициализацию раскадровки себе.Это требует двух шагов:

  1. Выберите ваш проект в Xcode -> General.Прокрутите вниз до Главного интерфейса и удалите его
  2. В вашем методе AppDelegate applicationDidFinishLaunching инициализируйте необходимую раскадровку следующим образом:

    class AppDelegate: UIResponder, UIApplicationDelegate {
        var window: UIWindow?
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        // configure Firebase
    
        window = UIWindow(frame: UIScreen.main.bounds)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        window?.rootViewController = storyboard.instantiateInitialViewController()
        self.window?.makeKeyAndVisible()        
    
        return true
        }
    }
    
...