106 votes

Comment envoyer une notification Firebase à tous les appareils via CURL ?

J'essaie d'envoyer une notification à tous les utilisateurs de l'application (sur Android), en reproduisant essentiellement ce qui se passe lorsqu'une notification est envoyée via la console d'administration Firebase. Voici la commande CURL avec laquelle je commence :

curl --insecure --header "Authorization : key=AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "Content-Type:application/json" -d "{\"notification":{\"title\":\"note-Title\",\"body\":\"note-Body\"}" https://fcm.googleapis.com/fcm/send

Voici le JSON analysé pour que ce soit plus facile pour vos yeux :

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    }
}

La réponse qui revient ne comporte que deux caractères :

à

C'est tout, le mot "to". (Les en-têtes signalent un 400) Je pense que cela a à voir avec le fait que je n'ai pas de "to" dans mon JSON. Mais qu'est-ce qu'on pourrait bien mettre à la place de "to" ? Je n'ai pas de sujets définis, et les appareils ne se sont pas enregistrés pour quoi que ce soit. Pourtant, ils sont toujours en mesure de recevoir des notifications à partir du panneau d'administration de Firebase.

Je veux essayer un paquet JSON "data only" en raison de l'étonnante limitation du traitement des notifications Firebase qui fait que si votre application est au premier plan, la notification est traitée par VOTRE gestionnaire, mais si votre application est en arrière-plan, elle est traitée EN INTERNE par le service Firebase et n'est jamais transmise à votre gestionnaire de notification. Apparemment, cela peut être contourné si vous soumettez votre demande de notification via l'API, mais UNIQUEMENT si vous le faites avec des données uniquement. (Ce qui casse alors la possibilité de gérer iOS et Android avec le même message). Remplacer "notification" par "données" dans mon JSON n'a aucun effet.

Ok, alors j'ai essayé la solution ici : Firebase Java Server pour envoyer des notifications push à tous les appareils. ce qui me semble dire "Ok, même si les notifications à tout le monde sont possibles via la console d'administration... ce n'est pas vraiment possible via l'API". La solution consiste à faire en sorte que chaque client s'abonne à un sujet, puis à envoyer la notification à ce sujet. Donc d'abord le code dans onCreate :

FirebaseMessaging.getInstance().subscribeToTopic("allDevices");

puis le nouveau JSON que j'envoie :

{
"notification":{
    "title":"note-Title",
    "body":"note-Body"
    },
"to":"allDevices"
}

Maintenant, j'obtiens au moins une vraie réponse du serveur. Réponse JSON :

{
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
    [
    {
    "error":"InvalidRegistration"
    }
    ]
}

Et ça vient avec un code HTTP 200. Ok... selon https://firebase.google.com/docs/cloud-messaging/http-server-ref un code 200 avec "InvalidRegistration" signifie un problème avec le jeton d'enregistrement. Pourquoi ? Parce que cette partie de la documentation concerne le serveur de messagerie. Le serveur de notification est-il le même ? Pas clair. Je vois ailleurs que le sujet peut prendre des heures avant d'être actif. Il semble que cela le rendrait inutile pour la création de nouveaux salons de discussion, donc cela semble également hors service.

J'étais assez enthousiaste lorsque j'ai pu coder une application à partir de rien qui recevait des notifications en quelques heures seulement, alors que je n'avais jamais utilisé Firebase auparavant. Il semble qu'il y ait un long chemin à parcourir avant d'atteindre le niveau de, disons, la documentation de Stripe.com.

En résumé : quelqu'un sait-il quel JSON fournir pour envoyer un message à tous les appareils utilisant l'application afin de refléter la fonctionnalité de la console d'administration ?

0 votes

Vérifiez que le jeton d'api que vous utilisez est correct. Essayez également d'envoyer le message GCM à un seul appareil et voyez si cela fonctionne. Vous pouvez obtenir l'ID d'instance en lançant l'application en mode de débogage et en plaçant un point d'arrêt sur la fonction FirebaseInstanceIdService

0 votes

Je ne vois pas le terme "jeton api" apparaître dans une recherche rapide sur firebase.google.com/docs. Voulez-vous dire "ID token" ? ou "Auth token" ? Ou bien parlez-vous de ma clé d'autorisation telle que fournie dans l'en-tête ? Cette clé est Bien : si je le modifie, la réponse du serveur devient "non autorisé" au lieu du message d'erreur que je reçois actuellement.

0 votes

Ce blog semble concerner l'envoi d'un message à un appareil particulier, et non, comme la discussion initiale, l'envoi d'un message à tous les utilisateurs de l'application.

116voto

Frank van Puffelen Points 16029

Firebase Notifications ne dispose pas d'une API pour envoyer des messages. Heureusement, il est construit au-dessus de Firebase Cloud Messaging, qui dispose précisément d'une telle API.

Avec Firebase Notifications et Cloud Messaging, vous pouvez envoyer des messages dits en aval aux appareils de trois façons :

  1. à des dispositifs spécifiques si vous connaissez le numéro de leur appareil
  2. à des groupes de dispositifs si vous connaissez les ID d'enregistrement des groupes.
  3. aux sujets qui ne sont que des clés auxquelles les dispositifs peuvent s'abonner.

Vous noterez qu'il n'y a pas de moyen d'envoyer à tous les appareils de manière explicite. Vous pouvez cependant construire une telle fonctionnalité avec chacun d'entre eux, par exemple : en abonnant l'application à un sujet lorsqu'elle démarre (par ex. /topics/all ) ou en conservant une liste de tous les identifiants de dispositifs, puis en envoyant le message à chacun d'entre eux.

Pour l'envoi à un sujet, vous avez une erreur de syntaxe dans votre commande. Les sujets sont identifiés en commençant par /topics/ . Puisque vous ne l'avez pas dans votre code, le serveur interprète allDevices comme identifiant de périphérique. Étant donné qu'il s'agit d'un format non valide pour un jeton d'enregistrement de périphérique, cela entraîne une erreur.

Extrait de la documentation sur l'envoi de messages aux sujets :

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

0 votes

J'ai essayé de soumettre {"to" :"/topic/allDevices", "data":{"message" : "This is a Firebase Cloud Messaging Topic Message !"}} et j'ai reçu la même réponse InvalidRegistration. Je suppose que cela signifie que le sujet n'est pas valide. Je ne vois aucun moyen dans la console de consulter une base de données de sujets.

7 votes

/topics/ est pluriel

0 votes

sourire en coin Oh, une faute de frappe, le fléau du programmeur ;) La nouvelle réponse est : {"message_id":5115052numbers95180} qui semble certainement beaucoup plus réussie. Donc, il semble que la ligne de fond est que, bien qu'il y ait une fonctionnalité de puissance à partir de la console d'administration pour délivrer des notifications via "Notifications", il n'y a AUCUN moyen de déclencher cela à partir de soumissions API, et il faut simplement se convertir à l'utilisation de messages. (En perdant la programmation et le suivi des conversions intégrés dans les notifications) Je vais chercher du code de messagerie pour gérer la réception. Merci Frank :)

89voto

Syed Rafay Points 538

Le moyen le plus simple que j'ai trouvé pour envoyer la notification push à tous les appareils est de les abonner à un sujet "tous" et d'envoyer la notification à ce sujet. Copiez ceci dans votre activité principale

FirebaseMessaging.getInstance().subscribeToTopic("all");

Maintenant, envoyez la demande comme

{
   "to":"/topics/all",
   "data":
   {
      "title":"Your title",
      "message":"Your message"
      "image-url":"your_image_url"
   }
}

Cette méthode est peut-être inefficace ou non standard, mais comme je l'ai mentionné ci-dessus, c'est la plus simple. S'il vous plaît, postez si vous avez une meilleure façon d'envoyer une notification push à tous les appareils.

Vous pouvez suivre ce tutoriel si vous n'avez jamais envoyé de notifications push à l'aide de Firebase Cloud Messaging. <a href="https://www.pluralsight.com/guides/push-notifications-with-firebase-cloud-messaging" rel="noreferrer" title="Tutorial - Push Notifications using FCM">Tutoriel - Notifications push à l'aide de FCM</a>


Pour envoyer un message à un combinaison de sujets, spécifiez un condition qui est une expression booléenne qui spécifie les sujets cibles. Par exemple, la condition suivante enverra des messages aux dispositifs qui sont abonnés à TopicA et soit TopicB o TopicC :

{
   "data":
   {
      "title": "Your title",
      "message": "Your message"
      "image-url": "your_image_url"
   },
   "condition": "'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)"
}

Pour en savoir plus sur les conditions et les sujets, consultez le site Documentation du FCM

0 votes

Cela me semble logique. Mais comme vous, je ne suis pas sûr que ce soit inefficace. S'il vous plaît, quelqu'un peut-il le clarifier ?

2 votes

Je ne pense pas que ce soit inefficace, c'est peut-être la seule façon possible d'envoyer une notification push à tous les appareils (je n'ai pas trouvé d'autre moyen, du moins).

1 votes

Meilleure réponse ! :)

4voto

Une façon d'y parvenir est de faire en sorte que tous les appareils de vos utilisateurs s'abonnent à un sujet. De cette façon, lorsque vous ciblez un message sur un sujet spécifique, tous les appareils le recevront. Je pense que c'est ainsi que fonctionne la section Notifications de la console Firebase.

0 votes

Lisez cet article de blog pour plus de détails - > developine.com/

1voto

Il suffit de faire en sorte que tous les utilisateurs qui se connectent s'abonnent à un sujet spécifique, puis d'envoyer une notification à ce sujet.

-3voto

test Points 1

Vous pouvez utiliser /topics/all mais vous devez aller dans votre panneau Firebase et modifier

Anonyme >>>>> Activé

Entrez la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X