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()
}
}
Что это за сбой и как от него избавиться?
Делегат вашего приложения не устанавливает свойство rootViewController
основного UIWindow до завершения applicationDidFinishLaunching
. Обычно это настраивается для вас во всех шаблонах Xcode. Если вы создаете собственное окно, не забудьте сразу установить его корневой контроллер представления.
Как отмечает rmaddy, в вашем коде, если launchOptions
установлен, но launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject]
возвращает ноль, то rootViewController
никогда не устанавливается. Если notifications["type"] as? String
равен нулю, rootViewController
никогда не устанавливается. Если тип отличается от трех ожидаемых значений, rootViewController
никогда не устанавливается.
rootViewController
должен быть установлен до завершения этого метода, иначе приложение выйдет из строя. Вам нужно охватить все возможные способы запуска приложения. Не существует обещанного списка всех возможных способов запуска приложения, поэтому вам понадобится какой-то запасной вариант, когда оно запускается не так, как вы ожидаете (иначе «приложение вылетает» - это поведение, которое вы повторный запрос в этом случае).
Отредактировал вопрос и добавил свое applicationDidFinishLaunching
@UtkuDalmaz И в опубликованном вами коде есть несколько путей кода, которые не приводят к установке rootViewController.
@rmaddy должен ли я установить rootviewcontroller также, если установлен UIApplicationLaunchOptionsKey.location?
Всегда нужно устанавливать rootViewController
.
Если вы не прошли
if let type = notifications["type"] as? String
, действительно ли вы устанавливаете rootViewController? Не могли бы вы добавить отпечатки / точку останова, чтобы увидеть, куда именно пойдет ваше исполнение?