Как перейти непосредственно к определенному контроллеру представления, если было открыто уведомление
У меня есть 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.