web-dev-qa-db-fra.com

UNUserNotificationCenter didRecieve La réponse n'est pas appelée si l'application est fermée.

La fonction UNUserNotificationCenter n’est pas appelée en cliquant sur Bouton d’action Discuter dans Notification après 3D Si l’application n’est pas active (même en arrière-plan ou si elle est terminée). J'ai utilisé "attacher au processus par nom" dans Xcode pour déboguer une application lorsque celle-ci était fermée. Voici le code:

import UIKit
import Mixpanel
import UserNotifications

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //setup mixpanel

        self.handlePushNotificationWithUserInfo(launchOptions: launchOptions)

        //ask for Push notification perms
        return true
    }

Lorsque Notification Pop-up (Envoyé de MixPanel), cette fonction est appelée en premier,

Appel 1:

    func handlePushNotificationWithUserInfo(launchOptions: [NSObject: AnyObject]?) {
        //Handle PushNotification when app is opened
    }

Alors ça va ici,

Appel 2:

    //register for notification
    func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {

        if #available(iOS 10.0, *) {
            let center = UNUserNotificationCenter.current()
            center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
                // Enable or disable features based on authorization.
            }
            center.delegate = self

            let actionChat = UNNotificationAction(identifier: Constants.ActionType.CHAT.rawValue, title: "Chat", options: [.foreground])
            let categoryOptions = UNNotificationCategoryOptions(rawValue: 0)
            let customerSupportCategory = UNNotificationCategory(identifier: Constants.NotificationType.CUSTOMER_SUPPORT.rawValue, actions: [actionChat], intentIdentifiers: [], options: categoryOptions)
            center.setNotificationCategories([customerSupportCategory])
        }

        application.registerForRemoteNotifications()
    }

Appel 3:

    // remote notification
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        ....Some Code....
    }

Mais ci-dessous la fonction ne s'appelle pas . Mais si app est exécuté en arrière-plan , la fonction ci-dessous est appelée et tout fonctionne correctement. OTHERWISE App passe au premier plan et le chat ne le fait plus après .

    // action buttons in enhanced Notification
    @available(iOS 10, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
        guard let action = Constants.ActionType(rawValue: response.actionIdentifier) else {
            completionHandler()
            return
        }
        switch action {
        case .CHAT:
            _ = self.handleRemoteUrl(NSURL(string: "chat") as? URL)
        default:
            _ = self.handleRemoteUrl(NSURL(string: "chat") as? URL)
        }
        completionHandler()
    }

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

Cette fonction n’est jamais appelée peut-être parce qu’elle est dépréciée dans iOS 10 par rapport à userNotificationCenter (), pas sûre. S'il vous plaît expliquer cela aussi ..

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
        ....Some Code....
    }

J'utilise l'iPhone 6s iOS 10 en tant que périphérique de débogage. XCode 8 beta-3

5
Kautsya Kanu

D'après mes propres expériences, les notifications locales dans Swift 3 et Xcode 8 sont les suivantes:

Conformité

  • Conforme à UNUserNotificationCenterDelegate

    class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { .... }
    
  • Inscrivez-vous en tant que délégué du centre de notification:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
        let center = UNUserNotificationCenter.current()
        center.delegate = self
    
        return true
    }
    

Méthodes de délégué

  • Répondre aux notifications manquées (par exemple, l'application de visualisation de l'utilisateur lorsque la notification est envoyée)

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
        print(notification.request.content.userInfo)
    }
    
  • Répondre aux notifications activées (par exemple, notification ouverte par l'utilisateur)

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
        print(response.notification.request.content.userInfo)
    }
    
9
Kyle Gillen

Swift 3.1 Mise à jour

  • Conforme à UNUserNotificationCenterDelegate

  • Inscrivez-vous en tant que délégué du centre de notification:

UNUserNotificationCenter.current().delegate = self
  • Méthodes de délégué
public func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    print(response.notification.request.content.categoryIdentifier)
}

public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    print(notification.request.content.categoryIdentifier)
}
1
Alejandro Luengo

Lorsque l'application n'est pas en cours d'exécution ou est tuée par l'utilisateur et que la notification est reçue, dans ce cas, vous devez gérer didFinishLaunchingWithOptions et vérifier si l'application est ouverte via la notification et agir de manière appropriée.

// Vérifier si lancé depuis la notification

if let notification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [String: AnyObject] {
       notificationReceived(notification)
    }
0
user1140780