Не удается избавиться от фатального исключения: ошибка NSInternalInconsistencyException - PullRequest
0 голосов
/ 10 сентября 2018
Fatal Exception: NSInternalInconsistencyException
Application windows are expected to have a root view controller at the end of application launch
-[UIApplication _runWithMainScene:transitionContext:completion:]

Отчет о сбое

Fatal Exception: NSInternalInconsistencyException
    0  ???                            0x184066d8c (Missing)
    1  ???                            0x1832205ec (Missing)
    2  ???                            0x184066bf8 (Missing)
    3  ???                            0x184a56fa0 (Missing)
    4  UIKit                          0x18dc42a80 -[UIApplication _runWithMainScene:transitionContext:completion:]
    5  UIKit                          0x18e272b1c __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke
    6  UIKit                          0x18dc41dd0 +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:]
    7  UIKit                          0x18dc41c6c -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]
    8  UIKit                          0x18dc40afc -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:]
    9  UIKit                          0x18e8d684c __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke
    10 UIKit                          0x18dc401ec -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]
    11 UIKit                          0x18e6bbac8 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke
    12 UIKit                          0x18e809bf8 _performActionsWithDelayForTransitionContext
    13 UIKit                          0x18dc3fc0c -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]
    14 UIKit                          0x18dc3f5a8 -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:]
    15 UIKit                          0x18dc3c5e0 -[UIApplication workspace:didCreateScene:withTransitionContext:completion:]
    16 UIKit                          0x18dc3c330 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:]

Заголовок отчета о сбое

UIKit
-[UIApplication _runWithMainScene:transitionContext:completion:]

applicationDidFinishLaunching

if (launchOptions == nil) {
    if (TegKeychain.get("ISLOGGEDIN") == "1") {
        heartbeat()
        let initialViewController = storyboard.instantiateViewController(withIdentifier: "WelcomeTab")
        self.window?.rootViewController = initialViewController
        self.window?.makeKeyAndVisible()
    } else {
        let initialViewController = storyboard.instantiateViewController(withIdentifier: "Entrance")
        self.window?.rootViewController = initialViewController
        self.window?.makeKeyAndVisible()
    }
} else {
    if let notifications = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject] {
        heartbeat()

        if let type = notifications["type"] as? String
        {
            if type == "msg" {
                if let userID = notifications["userID"] as? String {
                    userDefaults.set(userID, forKey: "goToChat")
                }

                let initialViewController = storyboard.instantiateViewController(withIdentifier: "WelcomeTab")
                self.window?.rootViewController = initialViewController
                self.window?.makeKeyAndVisible()

                if let tabBarController = self.window!.rootViewController as? UITabBarController {
                    tabBarController.selectedIndex = 3
                }
            }

            if type == "follow" {
                if let userID = notifications["userID"] as? String {
                    userDefaults.set(userID, forKey: "goToProfile")
                }
                let initialViewController = storyboard.instantiateViewController(withIdentifier: "WelcomeTab")
                self.window?.rootViewController = initialViewController
                self.window?.makeKeyAndVisible()

                if let tabBarController = self.window!.rootViewController as? UITabBarController {
                    tabBarController.selectedIndex = 0
                }
            }

            if type == "attend" {
                if let eventID = notifications["eventID"] as? String {
                    userDefaults.set(eventID, forKey: "goToEvent")
                }
                let initialViewController = storyboard.instantiateViewController(withIdentifier: "WelcomeTab")
                self.window?.rootViewController = initialViewController
                self.window?.makeKeyAndVisible()

                if let tabBarController = self.window!.rootViewController as? UITabBarController {
                    tabBarController.selectedIndex = 0
                }
            }
        }
    }

    if let _ = launchOptions?[UIApplicationLaunchOptionsKey.location] {
        startSignificationLocation()
    }
}

Что это за сбой и как от него избавиться?

1 Ответ

0 голосов
/ 10 сентября 2018

Ваш представитель приложения не устанавливает свойство rootViewController основного UIWindow до завершения applicationDidFinishLaunching. Это обычно настраивается для вас во всех шаблонах XCode. Если вы создаете свое собственное окно, немедленно установите его корневой контроллер вида.

Как отмечает rmaddy, если в вашем коде установлено launchOptions, но launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject] возвращает ноль, то rootViewController никогда не устанавливается. Если notifications["type"] as? String равно нулю, rootViewController никогда не устанавливается. Если тип отличается от ожидаемых трех значений, rootViewController никогда не устанавливается.

rootViewController должен быть установлен до завершения этого метода, иначе приложение вылетит. Вы должны охватить все возможные способы запуска приложения. Не существует обещанного списка всех возможных способов запуска приложения, поэтому вам понадобится какой-то запасной вариант, когда оно запускается так, как вы этого не ожидаете (иначе «приложение вылетает» - это поведение, которое вы выполняете » запросите в этом случае).

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