Cette question faisait à l'origine référence à Google Cloud Messaging (GCM), mais maintenant elle s'applique également à la nouvelle Firebase Cloud Messaging (FCM) qui remplace GCM.
Je voudrais savoir comment calculer la taille d'une charge utile GCM lorsqu'elle contient un dictionnaire de "notification".
J'ai essayé le service Google Cloud Messaging pour Android. Certaines parties de la documentation disent que vous pouvez envoyer jusqu'à 4 Ko de données, et ici il est dit "Un message de notification peut avoir une charge utile maximale de 2 Ko".
En faisant quelques tests, j'ai pu envoyer des messages avec la charge utile "data" remplie de 4 Ko de données et le serveur les a acceptés sans erreur comme prévu.
Cependant, en utilisant la charge utile "notification", j'ai trouvé que je pouvais envoyer des messages avec plus de 2 Ko de données et le serveur n'a pas renvoyé d'erreur. Je m'attendais à ce que ces messages soient trop gros.
J'ai trouvé que la charge utile de "notification" partage la 4KB autorisée avec la charge utile de "données", mais pas de la même manière. Dans la charge utile "données", vous pouvez calculer la taille en ajoutant la taille des clés et des valeurs. La charge utile "notification" prend plus d'espace que la taille des clés et des valeurs qu'elle contient.
Comment calculer à l'avance la taille d'une charge utile lorsqu'elle contient le dictionnaire "notification"?
J'ai expérimenté des tailles de charge utile pour le nouveau service FCM.
Pour les messages qui contiennent un dictionnaire "données" et aucun dictionnaire "notification", j'ai réussi à envoyer exactement jusqu'à 4096 caractères (en comptant les longueurs de toutes les clés et valeurs).
Pour les messages qui contiennent un dictionnaire "notification" et aucun dictionnaire "données", ainsi que pour les messages qui contiennent à la fois un dictionnaire "notification" et un dictionnaire "données", j'ai réussi à envoyer jusqu'à 4062 caractères. Je n'ai pas pu comprendre comment les 34 caractères restants sont comptés.
Cela signifie que la documentation qui limite la charge utile de "notification" à 2 Ko est incorrecte. Vous pouvez envoyer près de 4K.
Maintenant, en lisant la documentation à jour de FCM, j'ai trouvé que la documentation des types de messages dit:
Les messages de notification contiennent un ensemble prédéfini de clés visibles par l'utilisateur. Les messages de données, en revanche, ne contiennent que vos paires de valeurs-clés personnalisées définies par l'utilisateur. Les messages de notification peuvent contenir une charge utile de données facultative. La charge utile maximale pour les deux types de message est de 4 Ko , sauf lors de l'envoi de messages à partir de la console Firebase, qui applique une limite de 1024 caractères.
D'autre part, la description de l'erreur "MessageTooBig" dit:
Vérifiez que la taille totale des données utiles incluses dans un message ne dépasse pas les limites FCM: 4096 octets pour la plupart des messages, ou 2048 octets dans le cas des messages aux sujets . Cela inclut à la fois les clés et les valeurs.
Les messages que j'ai testés n'étaient pas des messages sur des sujets, donc selon les deux citations, ils ne devraient pas être limités à 2K.
Par conséquent, la limite de charge utile selon la documentation actuelle est de 4K (à l'exception possible des messages aux sujets, que je n'ai pas testés).
Pour la messagerie en aval, GCM fournit deux types de charge utile: la notification et les données. La notification est l'option la plus légère, avec une limite de 2 Ko et un ensemble prédéfini de clés visibles par l'utilisateur. La charge utile des données permet aux développeurs d'envoyer jusqu'à 4 Ko de paires clé/valeur personnalisées. Les messages de notification peuvent contenir une charge utile de données facultative qui est délivrée lorsque les utilisateurs cliquent sur la notification.
Notification - GCM affiche automatiquement le message aux appareils des utilisateurs finaux au nom de l'application cliente. Les notifications ont un ensemble prédéfini de clés visibles par l'utilisateur. Définissez la charge utile de notification. Peut avoir une charge utile de données en option. Toujours pliable.
Données - L'application client est responsable du traitement des messages de données. Les messages de données n'ont que des paires clé/valeur personnalisées. Définissez uniquement la charge utile des données. Peut être pliable ou non pliable.
FCM ajoute le préfixe gcm.notification. pour chaque clé de la charge utile de notification.
Exemple de calcul pour la charge utile ci-dessous:
"to":"cgOtBDOGIEc:APA91bGrjdPtrnGr0sIl4c66Z3Xp-JTzUasIN5TzWy7DtNUf-BlGvF64iNOXFN68zFC6oTYHJbP6eQgzIZICcsmIUG-NP5cIXf8EyPNiIAvOFU27XDKFbI2vowMjsNmZQdmh",
"notification":{
"title":"Testing title from postman!",
"body":"Testing body from postman!",
"sound":"default",
"tickerText":"This is ticker text"
},
"data" : {
"Nick" : "Mario Test",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
pour une charge utile supérieure,
Longueur totale = longueur de (Charge utile de notification + Charge utile de données)
Longueur de la charge utile des données = [longueur des clés + longueur des valeurs] = longueur des octets de [Nick + corps + salle] + longueur des octets de [Mario Test + grande correspondance + PortugalVSDenmark] = 12 + 39 = 51
Pour calculer la charge utile de notification, chaque clé doit être préfixée avec gcm.notification.
pour chaque clé de charge utile de notification, firebase ajoute en interne gcm.notification. comme préfixe, et calcule la longueur en considérant également ce préfixe.
Length of Notification Payload = [ no.of keys * length of (gcm.notification.) + length of keys + length of values ]
= 4*17 + length of bytes of [ title + body + sound + tickerText ] + length of bytes of [ Testing title from postman! + Testing body from postman! + default + This is ticker text ]
= 68 + 24 +79
= 171 bytes
Total length of the payload = 51 + 171 = 222 bytes.
J'espère que ça répond à ta question.
Ce n'est peut-être pas pour ce que vous avez explicitement demandé, mais mieux vaut ne pas utiliser cette grande quantité de données utiles dans votre message GCM.
Stockez votre charge utile dans une base de données et rendez-la disponible via une API Web. Envoyez maintenant un GCM-Message qui ne contient que l'ID de cette entrée de base de données. Maintenant, votre application peut demander la charge utile indépendamment de GCM et vous n'êtes pas limité à la taille.
Il y a un autre avantage: Google ne saura pas ce que vous envoyez via GCM.
Si vous n'avez pas besoin de stocker la charge utile pendant longtemps, vous pouvez également utiliser Redis ou quelque chose de similaire pour stocker cette charge utile pendant une durée limitée.
J'ai également expérimenté avec la taille de la charge utile, elle est proche de 4 ko seulement.
Lorsque j'ai essayé d'envoyer une charge utile de 7 ko, iy m'a montré une réponse qui dit que le message est trop gros.
Vous pouvez donc analyser le code de réponse et vérifier que la charge utile a été acceptée par les serveurs Google ou non.
Vous pouvez utiliser la méthode conventionnelle de conversion des données String en octets. La notification que vous obtenez sous forme de JSON qui contient une paire clé/valeur comme:
{
"to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
"notification" : {
"body" : "great match!",
"title" : "Portugal vs. Denmark"
}
}
Selon la documentation de Google:
Calculez maintenant la taille des données en utilisant:
String mydata = "value from JSON";
byte[] mybyte = mydata.getBytes("UTF-8");
int bytes = mybyte.length;
Assurez-vous de spécifier l'encodage de la chaîne, car différents encodages peuvent prendre un nombre différent d'octets pour la même chaîne. Dans l'exemple ci-dessus, UTF-8 est utilisé comme codage.
Pour convertir les octets en Ko, il suffit de diviser par 1024. Pour plus de détails, vous pouvez vous référer à this .