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

#ios #swift #apple-push-notifications

Вопрос:

Я реализовал push-уведомление в приложении. Я получаю обратные вызовы по следующему методу делегата всякий раз, когда приходит толчок.

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

Я реализовал следующий метод делегирования, чтобы показывать push-уведомление, когда приложение находится на переднем плане.

 func userNotificationCenter(_ center: UNUserNotificationCenter,
                                    willPresent notification: UNNotification,
                                    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
    { 
       completionHandler([.alert, .badge, .sound])
    }
 

К сожалению, это работает не каждый раз. Независимо от состояния приложения, я получаю обратный вызов по методу didReceiveRemoteNotification. Есть ли какая-то особая причина для такого поведения? Я что-то упускаю?

Заранее спасибо

Ответ №1:

Я думаю, что вы должны использовать userNotificationCenter с « didReceive response » подписью вместо application(didReceiveRemoteNotification userInfo:..)

 // MARK: Notification handling

// If the app is in the background
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let id = response.notification.request.identifier
    print("Received notification with ID = (id)")

    completionHandler()
}

// If the app is in the foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let id = notification.request.identifier
    print("Received notification with ID = (id)")

    completionHandler([.sound, .alert])
}
 

Кроме того, пусть ваш AppDelegate будет делегатом центра сертификации.

 class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    var window: UIWindow?

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

Комментарии:

1. Спасибо. Я дважды проверил настройку делегата и обнаружил, что он был установлен не так, как ожидалось. Но меня все еще смущает, почему я получаю обратный вызов метода didReceiveRemoteNotification, даже если делегат не был установлен. Из-за этого я полностью проигнорировал проверку делегата. В любом случае, большое спасибо.