web-dev-qa-db-fra.com

Notifications FCM et collapse_key

J'envoie des notifications aux utilisateurs Android appareils via la console de notification Firebase et je remarque que même si j'envoie 10 notifications différentes alors que l'appareil utilisateur est hors ligne, une fois que l'utilisateur se connecte, il/elle le fera recevoir les 10.

Cependant, dans la documentation de Firebase, il est indiqué que:

FCM permet à un maximum de quatre clés de réduction différentes par appareil d'être utilisées par le serveur d'application à tout moment. En d'autres termes, le serveur de connexion FCM peut stocker simultanément quatre messages d'envoi à la synchronisation différents par périphérique, chacun avec une clé de réduction différente. Si vous dépassez ce nombre, FCM ne conserve que quatre clés de réduction, sans aucune garantie quant à celles qui sont conservées.

L'utilisateur ne devrait-il donc pas recevoir seulement 4 notifications? Suis-je en train de manquer quelque chose? (Je n'étend pas le FirebaseMessagingService, je laisse le traitement des notifications au SDK)

UPDATE : Si vous ne spécifiez pas de clé de réduction dans la console de notifications Firebase, il semble qu'une clé de réduction implicite soit affectée à la notification et c'est la nom du package de l'application. J'ai testé cela en vérifiant toutes les paires clé/valeur de l'ensemble de clés getIntent().getExtras(), une fois que je lance l'application en appuyant sur la notification. Et en effet, j'obtiens une clé collapse_key Avec la valeur du nom du package, même si je n'en ai pas spécifié.

PDATE 2: J'ai essayé de gérer les notifications en étendant le FirebaseMessagingService, afin de recevoir les messages de la console des notifications, lorsque l'application est au premier plan. Je reçois le message de notification et j'affiche manuellement une notification à l'utilisateur. Et devine quoi. Les clés de réduction fonctionnent très bien! Je reçois une seule notification même si j'envoie plusieurs notifications avec la même clé de réduction. MAIS cela ne se produit évidemment que lorsque l'application est au premier plan, car le SDK Firebase n'appelle pas la onMessageReceived() lorsque l'application est en arrière-plan, mais à la place, il gère la notification elle-même. Est-ce à dire qu'il s'agit d'un bogue du SDK Firebase? (car le problème ne se produit que lorsque la notification est affichée par le SDK)

Donc, la question demeure, pourquoi est-ce que je reçois les 10 notifications puisque chaque notification a la même clé de réduction? Peut-être un bug FCM?

10
steliosf

Après avoir lu le post et les commentaires, je ne suis pas complètement clair sur tout ce qui a été essayé, quels efforts ont été couronnés de succès et qui ont échoué. Je couvrirai un certain nombre d'articles et j'espère que quelque chose vous sera utile.

Votre message indique que pour certains tests, vous avez spécifié une clé de réduction lorsque vous avez composé le message dans la console Firebase. Ce n'est pas possible. Si vous avez ouvert Options avancées et entré une paire clé/valeur sous Données personnalisées, cela ne fonctionnera pas. Ces valeurs sont stockées dans le message sous la clé data, pas au niveau supérieur du message où collapse_key Doit apparaître. En outre, Tableau 1 dans la documentation inclut un avertissement indiquant que les touches data ne doivent pas être des mots réservés dans le tableau, citant spécifiquement collapse_key:

La clé ne doit pas être un mot réservé ("de" ou tout mot commençant par "google" ou "gcm"). N'utilisez aucun des mots définis dans ce tableau (tels que collapse_key ).

Comme indiqué dans les commentaires de votre message, la console attribue automatiquement une clé de réduction qui est le nom du package, de sorte que l'entrée utilisateur d'une clé de réduction n'est pas nécessaire.

Cela dit, mes expériences avec la console correspondent aux vôtres. Je crée des messages en entrant uniquement Texte du message et le jeton d'appareil. Je ne vois aucun traitement d'effondrement; chaque message est reçu par l'appareil. D'après mon expérience avec les tests décrits ci-dessous, cela semble être un problème avec la console et non avec le traitement d'effondrement en général. C'est étrange, car si j'envoie les messages lorsque l'application est au premier plan et que onMessageReceived() est invoquée, j'ai une journalisation de débogage qui génère la clé de réduction dans le message à l'aide de getCollapseKey () . Cette sortie confirme que la clé est présente et est le nom de mon package d'application.

Vous indiquez que vous avez effectué des tests en envoyant des notifications à partir d'une fonction cloud. J'ai fait mes propres tests avec cette fonction cloud et j'ai observé l'effondrement attendu du message:

exports.test = functions.database.ref('/test').onWrite(event => {
  const token = 'dK1FjGbNr6k:APA91bH7Vz3x...icGO56sJ7rAqOXRI';

  console.log('Sending notification...');

  const payload = {
    notification: {
      title: 'Message',
      body: 'Just one please!'
    }
  };

  const options = {
    collapseKey: 'green'
  };

  return admin.messaging().sendToDevice(token, payload, options).then(response => {
    console.log('Done');
  });
});

J'ai également envoyé ce message à l'aide de l'application de navigateur Advanced Rest Client, et j'ai également vu le message s'effondrer correctement:

{
  "to": "dK1FjGbNr6k:APA91bH7Vz3x...O56sJ7rAqOXRI",
  "collapse_key": "green",
  "notification": {
    "title": "Message",
    "body": "Just one please!"
  }
}

Je partagerai également que Firebase émet un message de journal d'analyse lorsqu'un message de notification est reçu. Ceci est utile pour les tests, lorsque vous souhaitez obtenir un nombre de messages reçus:

D/FA: Logging event (FE): notification_receive(_nr), Bundle[{firebase_event_Origin(_o)=fcm, message_device_time(_ndt)=0, message_time(_nmt)=1498227476, message_id(_nmid)=6447126672094369335}]
5
Bob Snyder