Как перейти непосредственно к определенному контроллеру представления, если было открыто уведомление

У меня есть UITabBarController который представляет в одной вкладке таблицу чатов. Если пользователь нажимает на одну строку, отобразится контроллер представления, который представляет последние сообщения.

Сейчас я представляю Push-уведомления. Желаемым поведением будет автоматический переход в комнату чата, если пользователь открывает Push-уведомление. Хотя есть много информации о том, как обращаться с этими вариантами использования, мне не удается реализовать ее.

Вот мой код до сих пор:

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        if (!isUserLoggedIn()) {
            // show login vc
        } else {
            let protectedController = mainStoryboard.instantiateViewController(withIdentifier: "TabBarController") as! UITabBarController

            if let notificationPayload = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? NSDictionary {
                if let chatId = notificationPayload["chatId"] as? String {
                    print(chatId)
                    // show chat VC
                }
            }

            window!.rootViewController = protectedController
            window!.makeKeyAndVisible()
        }


        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
        application.registerForRemoteNotifications()

        return true
    }

Оператор print никогда не будет вызываться, но это может быть связано с тем, что приложение полностью закрывается перед открытием уведомления.

2 ответа

Решение

didFinishLaunchingWithOptions не обязательно вызывается, когда вы нажимаете на уведомление, только если ваше приложение больше не находится в памяти

В вашем willFinishLaunchingWithOptions функция вашего приложения Delegate, настроить делегата для currentNotificationCenter

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    UNUserNotificationCenter.current().delegate = self
}

Убедитесь, что ваш AppDelegate инвентарь UNUserNotificationCenterDelegate актуально для вас может быть это

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    if let chatID = userInfo["chatID"] as? String {
        // here you can instantiate / select the viewController and present it
    }
    completionHandler()
}

Обновите, чтобы ответить на следующий вопрос: Как добавить UIViewController к UINavigationController в вашем UITabbarController

Для того, чтобы создать экземпляр вашего ViewController и добавить его в свой UITabbarController:

let myViewController = MyViewController() 
guard let tabbarController = self.window.rootViewController as? UITabbarController else {
    // your rootViewController is no UITabbarController
    return
}
guard let selectedNavigationController = tabbarController.selectedViewController as? UINavigationController else {
    // the selected viewController in your tabbarController is no navigationController!
    return
}
selectedNavigationController.pushViewController(myViewController, animated: true)

Когда пользователь нажимает на уведомление, метод обратного вызова делегата приложения:

Применение:didReceiveRemoteNotification:fetchCompletionHandler:

Больше информации об уведомлениях от Apple.

Вы должны поместить свой код внутри этого метода.

Также вы можете создать класс Router (подкласс NSObject), который будет отображать контроллер представления чата и будет отвечать за навигацию между контроллерами представления в приложении.

Это хороший способ инкапсулировать эту логику в отдельный класс, не сохраняя ее в классе AppDelegate.

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