Обработка действий пользователя при нажатии на push-уведомления - PullRequest
1 голос
/ 24 июня 2019

В моем приложении есть два типа push-уведомлений: тип A и тип B, и в соответствии с каждым типом я хочу перемещать пользователя к различным элементам управления представлением.прямо сейчас приложение показывает только homeVC, если пользователь нажал на уведомление, и могу ли я передать значение из объекта уведомлений элементам управления представлением.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
   userInfo["Type"] as? String == "TypeA" {
        showNotificationA()
    } else {
        showNotificationB()
    }
    completionHandler(UIBackgroundFetchResult.newData)
}


 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
       // How to identify which notification the user clicked to navigate to the right view?
        if UIApplication.shared.applicationState == .inactive {    
        }
        completionHandler()
    }

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Обычно обработка push-уведомлений состоит из следующих этапов:

  1. Включение push-уведомлений в разделе возможностей настроек проекта
  2. Запрос доступа к использованию удаленных и локальных уведомлений и делегирование входящих уведомлений вашей сущности наблюдателя уведомлений (класс, структура)

Это делается в классе AppDelegate, аналогично:

 UNUserNotificationCenter
         .current()
         .requestAuthorization(options: [.alert, .badge]) { (granted, error) in
            UNUserNotificationCenter.current().delegate = MyCustomDelegateEntity
         }
  1. Реализация func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) в вашем делегате, который получает входящие уведомления
  2. Уведомления можно отличить по идентификатору, который находится в объекте UNNotificationResponse. На основании идентификатора вы можете решить, как реагировать соответственно.

В вашем конкретном случае вы должны создать экземпляр желаемого контроллера представления из NotificationDelegate аналогично

let rootVC = MyViewController.instantiateFrom(storyboard: "StoryboardName")
let navigationController = UINavigationController(rootViewController: rootVC)

(UIApplication.shared.delegate as? AppDelegate)?.window?.rootViewController = navigationController

Содержимое ViewController.instantiateFrom (раскадровка :) выглядит примерно так:

return UIStoryboard(name: storyboard, bundle: nil).instantiateViewController(withIdentifier: String(describing: self)) as! MyViewController
0 голосов
/ 24 июня 2019

Вы можете перенаправить все ваши уведомления на один контроллер и в этом контроллере basview проверить, с какого типа уведомления оно пришло, и соответственно перемещаться.

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

...