[SWIFT] Recevoir des notifications PUSH paramétrées sur iOS

En tant que prémisse de cet article, on suppose que les notifications PUSH sont déjà arrivées.

Références pour la mise en œuvre des notifications PUSH: Configurer l'application client Firebase Cloud Messaging sur iOS (https://firebase.google.com/docs/cloud-messaging/ios/client)

Par défaut, la bannière de notification PUSH n'est pas affichée lorsque l'application est en cours d'exécution. La valeur arrive à la prochaine didReceiveRemoteNotification.


class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        //réduction...

        Messaging.messaging().delegate = self

        //réduction...
}

extension AppDelegate: MessagingDelegate {

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

}

Cependant, lorsque UNUserNotificationCenter est connecté, le didReceiveRemoteNotification ci-dessus n'est plus appelé et la fonction suivante est maintenant appelée. En outre, en fonction de la valeur renvoyée à completionHandler, la bannière de notification PUSH sera affichée même si l'application se trouve sur toute la surface.

DidReceive a été appelé lorsque vous avez tapé sur l'application, qu'elle soit en cours d'exécution ou non. Vous ne pouvez pas utiliser didReceiveRemoteNotification dans les cas où il existe un processus pour appuyer sur la notification PUSH.

extension AppDelegate : UNUserNotificationCenterDelegate {
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo

        print(userInfo)
        
        if #available(iOS 14.0, *) {
            completionHandler([[.banner, .list, .sound]])
        } else {
            completionHandler([[.alert, .sound]])
        }
        
        // NOTE:Cliquez ici si vous ne souhaitez pas afficher de notifications push
        // completionHandler([])
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo

        //S'affiche comme une alerte pour vérifier facilement userInfo lorsqu'il n'est pas démarré
        if let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController {
            let alertController = UIAlertController(title: "userInfo", message: userInfo.description, preferredStyle: .alert)
            let okAction = UIAlertAction(title: "OK", style: .default, handler: nil)
            alertController.addAction(okAction)
            rootViewController.present(alertController, animated: true, completion: nil)
        }
                
        completionHandler()
    }
    
}

Références

Recommended Posts

Recevoir des notifications PUSH paramétrées sur iOS
Le problème que la fenêtre contextuelle d'autorisation de notification push n'apparaît pas sur iOS14
[IOS] canOpenURL devient faux dans iOS14
Développement ATDD sur iOS (édition de base)