Обработка, куда пользователь уходит при нажатии на уведомление? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть несколько различных типов уведомлений, все из которых должны перенаправлять пользователя на другой контроллер представления при нажатии на уведомление.

Как это должно быть обработано (я использую Swift 5,путь)? Из моего исследования я вижу, что люди склонны представлять новый контроллер представления в функции AppDelegate didReceive, но, выполняя всю логику для нескольких различных контроллеров представления, все в AppDelegate кажется неправильным. Это действительно правильный способ сделать это?

Далее, я использую Firebase для отправки сообщений на устройство из серверной части. У меня есть отдельный класс, FirebaseUtils, где я обрабатываю всю логику для данных, которые передаются. Было бы лучше представить контроллер представления здесь? Если так, как бы я это сделал без контроллера корневого представления?

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Обычно я настраиваю что-то вроде этого (не проверено):

  • Создайте протокол NotificationHandler для вещей, которые могут обрабатывать уведомления
protocol NotificationHandler {
    static func canHandle(notification: [AnyHashable : Any])
    static func handle(notification: [AnyHashable : Any], completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
}
  • Создайте notificationHandlers переменную в AppDelegate и заполните ее вещами, которые могут потребоваться для обработки уведомлений.
let notificationHandlers = [SomeHandler.self, OtherHandler.self]

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

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    guard let handler = notificationHandlers.first(where: 
        { $0.canHandle(notification: userInfo) }) {
    else {
        return
    }

    handler.handle(notification: userInfo, completionHandler: completionHandler)
}

Этот подход удерживает логику от AppDelegate, что правильно, и не позволяет другим типам возиться внутри AppDelegate, которыйтоже правильно.

0 голосов
/ 06 ноября 2019

хотел бы что-нибудь подобное для вас?

struct NotificationPresenter {
   func present(notification: [AnyHashable: Any], from viewController: UIViewController) {
      let notificationViewController: UIViewController

      // decide what type of view controller to show and set it up

      viewController.present(notificationViewController, animated: true, completion: nil)
   }
}
extension UIViewController {
   static func topViewController(_ parentViewController: UIViewController? = nil) -> UIViewController {
      guard let parentViewController = parentViewController else {
         return topController(UIApplication.shared.keyWindow!.rootViewController!)
      }

      return parentViewController.presentedViewController ?? parentViewController
   }
}

let notificationPresenter = NotificationPresenter()

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any], 
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
   notificationPresenter.present(userInfo, from: UIViewController.topViewController())
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...