web-dev-qa-db-fra.com

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 dupliquant essentiellement ce qui se produit lorsqu'une notification est envoyée via la console d'administration de Firebase. Voici la commande CURL par laquelle je commence:

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

Voici ce que JSON a analysé pour être plus facile à regarder:

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

La réponse qui revient est juste deux caractères:

à

C'est ça, la Parole "à". (Les en-têtes rapportent un 400) Je suppose que cela est dû au fait de ne pas avoir de "à" dans mon JSON. Que mettrait-on même pour un "to"? Je n'ai pas de sujets définis, et les appareils ne se sont inscrits pour rien. Cependant, ils peuvent toujours recevoir des notifications du panneau d’administration de Firebase.

Je souhaite essayer un package JSON "données uniquement" en raison de l'étonnante limitation du traitement des notifications Firebase. Si votre application est au premier plan, la notification est traitée par VOTRE gestionnaire, mais si votre application est en arrière-plan, traité INTERNE par le service Firebase et jamais transmis à votre gestionnaire de notifications. APPAREMMENT, cela peut être résolu 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 capacité de gérer iOS et Android avec le même message.) Remplacer "notification" par "data" dans l'un de mes JSON n'a aucun effet.

Ok, alors j’ai essayé la solution ici: Firebase Java Serveur d’envoyer une notification Push à tous les périphériques qui me semble dire: Console d'administration ... ce n'est pas vraiment possible via l'API. " La solution de contournement consiste à demander à chaque client de s'abonner à un sujet, puis d'envoyer la notification à ce sujet. Alors d'abord le code dans onCreate:

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

alors le nouveau JSON que j'envoie:

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

Alors maintenant, je reçois 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 cela 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. Peut être? 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 qu'il ne soit actif. Il semblerait que cela rendrait inutile la création de nouvelles salles de discussion, ce qui semble également inacceptable.

J'étais assez excité quand j'ai pu coder une application à partir de zéro, qui a reçu des notifications en quelques heures à peine, alors que je n'avais jamais utilisé Firebase auparavant. Il semble que le chemin à parcourir avant d'atteindre le niveau de la documentation de Stripe.com, par exemple.

En bout de ligne: quelqu'un sait-il quel JSON fournir pour envoyer un message à tous les périphériques exécutant l'application afin de refléter la fonctionnalité de la console d'administration?

58
Anders8

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

Avec les notifications Firebase et Cloud Messaging, vous pouvez envoyer de soi-disant messages en aval aux périphériques de trois manières:

  1. vers des périphériques spécifiques , si vous connaissez leur ID de périphérique
  2. aux groupes d'appareils , si vous connaissez les identifiants d'enregistrement des groupes
  3. to topics , qui ne sont que des clés auxquelles les appareils peuvent s'abonner

Vous noterez qu'il n'y a aucun moyen d'envoyer explicitement à tous les appareils. Vous pouvez cependant créer une telle fonctionnalité avec chacun d’eux.

Pour envoyer à un sujet, vous avez une erreur de syntaxe dans votre commande. Les sujets sont identifiés en commençant par /topics/. Comme vous ne l'avez pas dans votre code, le serveur interprète allDevices comme un identifiant de périphérique. Comme il s’agit d’un format non valide pour un jeton d’enregistrement de périphérique, une erreur est générée.

De la documentation sur l'envoi de messages à des 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!",
   }
}
77
Frank van Puffelen

Le moyen le plus simple que j'ai conçu pour envoyer la notification Push à tous les périphériques est de les abonner à un sujet "tous", puis d'envoyer une notification à ce sujet. Copiez ceci dans votre activité principale

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

Maintenant, envoyez la demande en tant que

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

Cela peut être inefficace ou non standard, mais comme je l’ai mentionné plus haut, c’est le plus simple. Veuillez publier si vous avez un meilleur moyen d’envoyer une notification Push à à tous les appareils.

Vous pouvez suivre ce didacticiel si vous débutez dans l’envoi de notifications Push à l’aide de Firebase Cloud Messaging Didacticiel - Notifications Push à l’aide de FCM

56
Syed Rafay

Une façon de le faire est de faire en sorte que tous les appareils de vos utilisateurs soient abonnés à un sujet. Ainsi, lorsque vous ciblez un message sur un sujet spécifique, tous les appareils l’obtiendront. Je pense que c'est comme cela que la section Notifications de la console Firebase le fait.

4
Abdalrahman Shatou

Je cherchais une solution pour ma notification push Ionic _ Cordova app.

Merci à la réponse de Syed Rafay.

dans app.component.ts

const options: PushOptions = {
  Android: {
    topics: ['all']
  },

dans fichier serveur

"to" => "/topics/all",
1
Keval Shah

Il suffit que tous les utilisateurs qui se connectent s'abonnent à un sujet spécifique, puis envoient une notification à ce sujet.

1

Au lieu de vous abonner à un sujet, vous pouvez utiliser la touche condition et envoyer des messages à des instances ne faisant pas partie d'un groupe. Vos données pourraient ressembler à ceci:

{
    "data": {
        "foo": "bar"
    },
    "condition": "!('anytopicyoudontwanttouse' in topics)"
}

Voir https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2

0
Walamana