web-dev-qa-db-fra.com

Comment obtenir des données de la réponse à une notification Push Swift 3/iOS

J'utilise la bibliothèque suivante pour générer des notifications Push.

https://github.com/edamov/pushok

Les notifications Push fonctionnent, mais je ne sais pas comment extraire la réponse dans Swift 3.

Voici ce que j'ai.

// Push notification received
    func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {
        // Print notification payload data
        print("Push notification received: \(data)")

        let aps = data[AnyHashable("aps")]!

        print(aps)
    }

Je peux créer les notifications Push et le message de la console fonctionne mais affiche ceci ...

Push notification received: [AnyHashable("samplekey"): samplevalue, AnyHashable("aps"): {
    alert =     {
        body = hey;
        title = "Hello!";
    };
    sound = default;
}]
{
    alert =     {
        body = hey;
        title = "Hello!";
    };
    sound = default;
}

Ma question est donc la suivante: comment accéder aux données à l'intérieur de alert pour le "corps" et le "titre"?

J'ai essayé d'accéder aux variables mais je continue à avoir des erreurs car je ne sais pas comment je suis censé y accéder et je ne trouve aucune documentation à ce sujet dans les tutoriels.

3
Joseph Astrahan

Je pense que c'est une façon plus sûre de faire comme Joseph l'a trouvé.

guard
    let aps = data[AnyHashable("aps")] as? NSDictionary,
    let alert = aps["alert"] as? NSDictionary,
    let body = alert["body"] as? String,
    let title = alert["title"] as? String
    else {
        // handle any error here
        return
    }

print("Title: \(title) \nBody:\(body)")
14
ffabri

Je vous inciterais à essayer de trouver un moyen d'éviter d'utiliser le déroulage forcé. Quand vous faites à ce qui suit: 

 let alert = aps["alert"]! as! NSDictionary
 let body = alert["body"] as! String
 let title = alert["title"] as! String

l'application se bloquera si l'une des valeurs ci-dessus est manquante. 

Au lieu de cela, commençons par introduire un modèle de notification.

class MTNotification {
    let alert: [String: AnyHashable]
    var title: String?
    var body: String?

    init(alert: [String: AnyHashable]) {
        self.alert = alert
    }
}

Utilisez quelque chose pour suivre les erreurs qui pourraient se produire lors du traitement des données de notification brutes. Mieux, si vous le rendez conforme au protocole Error

enum MTError: Error {
    // Observe your transformation and extend error cases
    case missingProperty(id: String)
}

Utilisez une classe auxiliaire pour ne pas polluer le délégué de l'application, où vous pouvez gérer la transformation des données en notifications.

class MTNotificationBuilder {

     /// Build a notification from raw data
     ///
     /// - Parameter data: Classic notification payload, received from app delegate
     /// - Returns: customized MTNotification
     /// - Throws: error while building a valid MTNotification object
    static func build(from data: [AnyHashable : Any]) throws -> MTNotification {
        guard let aps = data["aps"] as? [String: AnyHashable] else {
            // Do some error handlig
            throw MTError.missingProperty(id: "aps")
        }

        guard let alert = aps["alert"] as? [String: AnyHashable] else {
            // Do some error handlig
            throw MTError.missingProperty(id: "aps")
        }

        let notification = MTNotification(alert: alert)
        // Assign values read as optionals from alert dictionary
        notification.title = alert["title"] as? String
        notification.body = alert["body"] as? String

        return notification
    } 
}

Et tout ce que vous devez faire à la fin est d’appeler la fonction constructeur et voir le résultat. Vous pouvez être strict et introduire des erreurs pour n’importe lequel des cas. Vous pourrez également utiliser la facilité de maintenance ultérieurement. 

func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) {

    do {
        let notification = try MTNotificationBuilder.build(from: data)
        print(notification.alert)
    } catch let error {
        print(error)
    }
}
2
dirtydanee

Assurez-vous d'avoir activé les modes d'arrière-plan dans les «capacités» du projet et coché la case «Notifications à distance». Ajoutez la méthode suivante dans la classe AppDelegate. Cette méthode appellera au moment de la présentation de la notification.

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

}
1
Pranit

Ok j'ai trouvé la réponse. Vous le faites comme ci-dessous.

let aps = data[AnyHashable("aps")]! as! NSDictionary

        let alert = aps["alert"]! as! NSDictionary

        let body = alert["body"] as! String
        let title = alert["title"] as! String

Si quelqu'un a une réponse plus sûre, j'apprécierais qu'il le modifie ou l'affiche.

1
Joseph Astrahan