iOS 10 UNUserNotificationCenterDelegate non chiamato. notifiche push non funzionanti

Strappandomi i capelli legandomi per far funzionare le notifiche push su iOS10. Configurazione corrente:

nell'applicazione func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool :

 if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in if error == nil { print("DID REQUEST THE NOTIFICATION") UIApplication.shared.registerForRemoteNotifications() } } print("DID SET DELEGATE") } 

Nell'applicazione func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) :

 print("DID REGISTER FOR A REMOTE NOTIFICATION AND THE TOKEN IS \(deviceToken.base64EncodedString())" let request = UpdatePushNotificationSubscription_Request(deviceToken: deviceToken) updatePushNotificationSubscriptionWorker.updateSubscription(request) 

Ho verificato che il token sia stato caricato correttamente nel back-end e che effettivamente corrisponda.

Ho anche implementato:

  @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { print("GOT A NOTIFICATION") } @available(iOS 10.0, *) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { //This is for the user tapping on the notification print("GOT A NOTIFICATION") } 

Ho impostato le autorizzazioni per tutti i target e la spinta abilitata:

inserisci la descrizione dell'immagine qui

Ora quando provo a submit un messaggio dal back-end, il dispositivo non riceve nulla. I delegati non vengono chiamati. Non ho idea di cosa sto facendo male qui. Push funziona con iOS9 e dispositivi Android. Qualche suggerimento su cosa potrei fare male?

Solutions Collecting From Web of "iOS 10 UNUserNotificationCenterDelegate non chiamato. notifiche push non funzionanti"

Prova a fare in modo che la class AppDelegate implementa il protocollo UNUserNotificationCenterDelegate anziché una class separata che implementa il protocollo.

Ho avuto una lezione separata per il delegato e non ha funzionato. Ecco come appariva il mio codice quando l'ho fatto funzionare:

 import UIKit import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application UIApplication.shared.registerForRemoteNotifications() let center = UNUserNotificationCenter.current() center.delegate = self //DID NOT WORK WHEN self WAS MyOtherDelegateClass() center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in // Enable or disable features based on authorization. if granted { // update application settings } } return true } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent: UNNotification, withCompletionHandler: @escaping (UNNotificationPresentationOptions)->()) { withCompletionHandler([.alert, .sound, .badge]) } func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive: UNNotificationResponse, withCompletionHandler: @escaping ()->()) { withCompletionHandler() } // and so forth for your other AppDelegate stuff 

Questa risposta si riferisce a iOS 10+, utilizzando il framework UserNotifications .

È necessaria una class conforms al protocollo UNUserNotificationCenterDelegate . Non import se crei una nuova class solo per questo, o la aggiungi alla tua class AppDelegate . Consiglierei comunque di creare una class dedicata. Ai fini di questa risposta, supponiamo di creare una class UserNotificationController per questo.

La class può avere i seguenti methods:

optional func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

optional func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

Quindi, nel metodo AppDelegate.application(_:didFinishLaunchingWithOptions:) , è necessario impostare il delegate UNUserNotificationCenter.current() su un'istanza della class UserNotificationController . Probabilmente vorrai usare un'istanza condivisa.

Richiedere l'authorization all'utente per abilitare le notifiche utilizzando il UNUserNotificationCenter.requestAuthorization(options:completionHandler:) e nel completionHandler , verificare il valore granted . Se true , registrarsi per le notifiche remote chiamando UIApplication.shared.registerForRemoteNotifications() .

Ora, quando l'app riceve una notifica push, possono verificarsi diverse situazioni. Proverò a elencare i casi più comuni qui.

Notifiche locali:

Se l'app è in primo piano, l'app chiamerà UserNotificationController .userNotificationCenter(_:willPresent:withCompletionHandler:) .

Se l'app è in background (in esecuzione o less), non viene chiamato nulla finché l'utente non tocca la notifica, a quel punto l'app si aprirà e chiamerà UserNotificationController .userNotificationCenter(_:didReceive:withCompletionHandler:) .

Notifiche remote:

Il contenuto del payload influenzerà ciò che accade. Esistono tre casi per il carico utile, a) solo le normali opzioni di alert , badge e sound b) inclusa l'opzione content-available il content-available (impostata su 1 o true ) c) inclusa l'opzione del mutable-content (impostata su 1 o true ) . Inoltre, c'è tecnicamente d) in cui si dispone di content-available sia content-available che mutable-content , ma che triggersno entrambi i casi.

Per a) solo alert , sound , informazioni sui badge :

Funziona allo stesso modo di una notifica locale.

Per b) content-available == true:

Se l'app è in primo piano, UserNotificationController .userNotificationCenter(_:willPresent:withCompletionHandler:) .

Se l'app è in background, (in esecuzione o less), viene chiamato AppDelegate.application(_:didReceiveRemoteNotification:fetchCompletionHandler:) , non uno dei methods nella class UserNotificationController .

Per c) mutable-content == true:

Se hai aggiunto un UNNotificationServiceExtension alla tua applicazione, gestirà la notifica e potrà modificare il contenuto. Questo succede indipendentemente dallo stato della tua applicazione principale. Se la notifica (facoltativamente modificata) viene toccata dall'utente, viene gestita come una notifica locale qui sopra.

Senza un UNNotificationServiceExtension , la notifica viene trattata come una normale notifica remota di cui sopra.

Note aggiuntive:

Quando si utilizza il mutable-content , è necessario includere informazioni di alert nel payload, altrimenti il ​​sistema lo considererà immutabile e non chiamerà nel tuo UNNotificationServiceExtension . La notifica modificata deve comunque includere informazioni di alert , altrimenti verrà utilizzato il payload della notifica originale. Purtroppo non c'è modo di impedire che la notifica venga visualizzata all'utente.

Quando si utilizza il content-available , se l'utente ha chiuso forzatamente l'app l'ultima volta che lo ha usato, il sistema non riavviverà l'app o richiamerà AppDelegate.application(_:didReceiveRemoteNotification:fetchCompletionHandler:) . Sebbene continui a visualizzare qualsiasi avviso, riproduce il suono e aggiorna il badge come indicato nel carico utile.