Не удается избавиться от критического исключения: ошибка NSInternalInconsistencyException

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()
    }
}

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

Если вы не прошли if let type = notifications["type"] as? String, действительно ли вы устанавливаете rootViewController? Не могли бы вы добавить отпечатки / точку останова, чтобы увидеть, куда именно пойдет ваше исполнение?

Larme 10.09.2018 18:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Делегат вашего приложения не устанавливает свойство rootViewController основного UIWindow до завершения applicationDidFinishLaunching. Обычно это настраивается для вас во всех шаблонах Xcode. Если вы создаете собственное окно, не забудьте сразу установить его корневой контроллер представления.

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

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

Отредактировал вопрос и добавил свое applicationDidFinishLaunching

Utku Dalmaz 10.09.2018 17:38

@UtkuDalmaz И в опубликованном вами коде есть несколько путей кода, которые не приводят к установке rootViewController.

rmaddy 10.09.2018 18:12

@rmaddy должен ли я установить rootviewcontroller также, если установлен UIApplicationLaunchOptionsKey.location?

Utku Dalmaz 10.09.2018 22:07

Всегда нужно устанавливать rootViewController.

Rob Napier 10.09.2018 22:41

Другие вопросы по теме