Обычно я настраиваю что-то вроде этого (не проверено):
- Создайте протокол
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, которыйтоже правильно.