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.
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)")
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)
}
}
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])
}
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.