web-dev-qa-db-fra.com

Apple Les notifications push peuvent-elles envoyer plus de paramètres que l'alerte et le son?

J'ai plusieurs éléments de métadonnées que je dois associer à une notification Push.

Par exemple, l'utilisateur no, id du message.

Puis-je envoyer plus de paramètres que ce qui est Apple prend en charge:

 {aps =     {
    alert = joetheman;
    sound = default;
};}

Est-ce possible?

24
Atma

Oui. Dans la section Guide de programmation des notifications push La charge utile de notification il indique

Les fournisseurs peuvent spécifier des valeurs de charge utile personnalisées en dehors de l'espace de noms aps réservé à Apple. Les valeurs personnalisées doivent utiliser les types structurés et primitifs JSON: dictionnaire (objet), tableau, chaîne, nombre et booléen. Vous ne devez pas inclure les informations client en tant que données de charge utile personnalisées. Au lieu de cela, utilisez-le à des fins telles que la définition du contexte (pour l'interface utilisateur) ou des mesures internes. Par exemple, une valeur de charge utile personnalisée peut être un identifiant de conversation à utiliser par une application cliente de messagerie instantanée ou un horodatage identifiant le moment où le fournisseur a envoyé la notification. Toute action associée à un message d'alerte ne doit pas être destructrice, par exemple la suppression de données sur l'appareil.

Ainsi, votre charge utile pourrait ressembler

{
    "aps": {
        "alert": "joetheman",
        "sound": "default"
    },
    "message": "Some custom message for your app",
    "id": 1234
}

Plus bas sur cette même page, vous trouverez plusieurs exemples qui le démontrent.

47
Lily Ballard

Bien sûr. Vous pouvez envoyer des paramètres personnalisés sous forme de charge utile avec Apple Notification push. Comme Kevin Ballard l'a dit, la charge utile ressemblera à ce qui précède. Mais rappelez-vous toujours une chose que vous traitez avec la notification Push, selon les contraintes Apple les notifications Push, la taille maximale autorisée pour une charge utile de notification est de 256 octets; Apple Push Notification Service refuse toute notification dépassant ce seuil. Veuillez donc également prendre cela en considération lorsque vous allez ajouter plus de données à la notification.

6
Mathew Varghese

Vous n'êtes pas autorisé à mettre des balises personnalisées dans la balise aps. Voici ce qu'en disent les documentations:

Providers can specify custom payload values outside the Apple-reserved aps namespace. Custom values must use the JSON structured and primitive types: dictionary (object), array, string, number, and Boolean.

Donc, dans votre cas, vous devriez faire quelque chose comme:

{
    "aps": {
        "alert": "Hello Push",
        "sound": "default"
    },
    "People": {
        "Address": "Your address here",
        "Name": "Your Name here",
        "Number": "XXXXXXXXXX"
    }
}

Par conséquent, vous pouvez lire votre charge utile personnalisée en recherchant sa clé dans le JSON principal, plutôt que dans "aps":

3
Ved Rauniyar

Voici comment j'envoie mes clés/valeurs personnalisées en fonction de ce tutoriel

func sendPushNotification(to token: String, title: String, body: String, messageId: String, fromUsername: String, fromUID: String, timeStamp: Double) {

    let urlString = "https://fcm.googleapis.com/fcm/send"
    let url = NSURL(string: urlString)!

    // Apple's k/v
    var apsDict = [String: Any]()
    apsDict.updateValue(title, forKey: "title")
    apsDict.updateValue(body, forKey: "body")
    apsDict.updateValue(1, forKey: "badge")
    apsDict.updateValue("default", forKey: "sound")

    // my custom k/v
    var myCustomDataDict = [String: Any]()
    myCustomDataDict.updateValue(messageId, forKey: "messageId")
    myCustomDataDict.updateValue(fromUsername, forKey: "username")
    myCustomDataDict.updateValue(fromUID, forKey: "uid")
    myCustomDataDict.updateValue(timeStamp, forKey: "timeStamp")

    // everything above to get posted
    var paramDict = [String: Any]()
    paramDict.updateValue(token, forKey: "to")
    paramDict.updateValue(apsDict, forKey: "notification")
    paramDict.updateValue(myCustomDataDict, forKey: "data")

    let request = NSMutableURLRequest(url: url as URL)
    request.httpMethod = "POST"
                                                     // ** add the paramDict here **
    request.httpBody = try? JSONSerialization.data(withJSONObject: paramDict, options: [.prettyPrinted])

    // send post ...
}

Voici comment je lis tout depuis la notification dans AppDelegate. La méthode ci-dessous est une méthode déléguée dans AppleDelegate. Utilisez ce tutoriel pour cela

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

    let userInfo = response.notification.request.content.userInfo

    if let userInfo = userInfo as? [String: Any] {

        readPushNotification(userInfo: userInfo)
    }

    completionHandler()
}

func readPushNotification(userInfo: [String: Any]) {

    for (k,v) in userInfo {
        print(k)
        print(v)
    }

    // my custom k/v
    if let messageId = userInfo["messageId"] as? String {
        print(messageId)
    }

    if let fromUsername = userInfo["username"] as? String {
        print(fromUsername)
    }

    if let fromUID = userInfo["uid"] as? String {
        print(fromUID)
    }

    if let timeStamp = userInfo["timeStamp"] as? String {
        print(timeStamp)
    }

    // Apple's k/v
    if let aps = userInfo["aps"] as? NSDictionary {

        if let alert = aps["alert"] as? [String: Any] {

            if let body = alert["body"] as? String {
                print(body)
            }

            if let title = alert["title"] as? String {
                print(title)
            }
        }

        if let badge = aps["badge"] as? Int {
            print(badge)
        }
    }
}
0
Lance Samaria