Wie senden Sie eine Firebase-Benachrichtigung über CURL an alle Geräte?

84

Ich versuche, eine Benachrichtigung an alle App-Benutzer (unter Android) zu senden. Dabei wird im Wesentlichen dupliziert, was passiert, wenn eine Benachrichtigung über die Firebase-Administratorkonsole gesendet wird. Hier ist der CURL-Befehl, mit dem ich beginne:

curl --insecure --header "Autorisierung: key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "Inhaltstyp: application / json" -d "{\" Benachrichtigung \ ": {\" title \ ": \" note -Titel "," Körper ":" Notizkörper "}}" https://fcm.googleapis.com/fcm/send

Hier ist, dass JSON analysiert wurde, um Ihre Augen zu schonen:

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

Die Antwort, die zurückkommt, besteht nur aus zwei Zeichen:

zu

Das war's, das Wort "zu". (Header melden 400) Ich vermute, dass dies damit zu tun hat, dass mein JSON kein "to" enthält. Was würde man überhaupt für ein "zu" setzen? Ich habe keine Themen definiert und die Geräte haben sich für nichts registriert. Sie können jedoch weiterhin Benachrichtigungen vom Firebase-Administrationsbereich erhalten.

Ich möchte versuchen, ein JSON-Paket "nur Daten" zu erstellen, da die Firebase-Benachrichtigungsverarbeitung erstaunlich eingeschränkt ist. Wenn Ihre App im Vordergrund steht, wird die Benachrichtigung von IHREM Handler verarbeitet, aber wenn sich Ihre App im Hintergrund befindet, wird sie angezeigt wird intern vom Firebase-Dienst verarbeitet und nie an Ihren Benachrichtigungshandler weitergeleitet. Anscheinend kann dies umgangen werden, wenn Sie Ihre Benachrichtigungsanforderung über die API senden, aber NUR, wenn Sie dies nur mit Daten tun. (Dies beeinträchtigt dann die Fähigkeit, iOS und Android mit derselben Nachricht zu verarbeiten.) Das Ersetzen von "Benachrichtigung" durch "Daten" in einem meiner JSONs hat keine Auswirkung.

Ok, dann habe ich hier die Lösung versucht: Firebase Java Server, um Push-Benachrichtigungen an alle Geräte zu senden, die mir zu sagen scheinen: "Ok, obwohl Benachrichtigungen an alle über die Admin-Konsole möglich sind ... ist dies über die API nicht wirklich möglich. "" Die Problemumgehung besteht darin, dass jeder Client ein Thema abonniert und dann die Benachrichtigung an dieses Thema sendet. Also zuerst den Code in onCreate:

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

dann sende ich den neuen JSON:

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

Jetzt bekomme ich zumindest eine echte Antwort vom Server. JSON-Antwort:

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

Und das kommt mit einem HTTP-Code 200. Ok ... laut https://firebase.google.com/docs/cloud-messaging/http-server-ref bedeutet ein 200-Code mit "InvalidRegistration" ein Problem mit dem Registrierungstoken . Könnte sein? Weil dieser Teil der Dokumentation für den Messaging-Server bestimmt ist. Ist der Benachrichtigungsserver der gleiche? Unklar. Ich sehe an anderer Stelle, dass das Thema Stunden dauern kann, bis es aktiv ist. Es scheint so, als würde es für die Erstellung neuer Chatrooms unbrauchbar werden, also scheint das auch nicht zu funktionieren.

Ich war ziemlich aufgeregt, als ich eine App von Grund auf neu codieren konnte, die innerhalb weniger Stunden Benachrichtigungen erhielt, als ich Firebase noch nie zuvor verwendet hatte. Es scheint, als ob es noch ein langer Weg ist, bis es beispielsweise das Niveau der Stripe.com-Dokumentation erreicht.

Fazit: Weiß jemand, was JSON bereitzustellen ist, um eine Nachricht an alle Geräte zu senden, auf denen die App ausgeführt wird, um die Admin-Konsolenfunktionalität widerzuspiegeln?

Anders8
quelle
Überprüfen Sie, ob Ihr verwendetes API-Token korrekt ist. Versuchen Sie auch, die GCM-Nachricht an ein einzelnes Gerät zu senden, und prüfen Sie, ob dies funktioniert. Sie können die InstanceId erhalten, indem Sie die App im Debug starten und einen Haltepunkt auf denFirebaseInstanceIdService
Justin Slade
Ich sehe kein "API-Token" in einer schnellen Google-Suche von firebase.google.com/docs. Meinst du "ID Token"? oder "Auth Token"? Oder sprechen Sie über meinen Autorisierungsschlüssel, wie er in der Kopfzeile angegeben ist? Das ist in Ordnung: Wenn ich es von dem, was es ist, ändere, wechselt die Serverantwort zu "nicht autorisiert" anstelle der Fehlermeldung, die ich gerade erhalte.
Anders8
In diesem Blog geht es anscheinend darum, eine Nachricht an ein bestimmtes Gerät zu senden, und nicht wie in der ursprünglichen Diskussion darum, sie nur an alle Benutzer der App zu senden.
Anders8
Lesen Sie diesen Blogpost für weitere Details -> Developine.com/…
Developine

Antworten:

56

EDIT: Es scheint, dass diese Methode nicht mehr unterstützt wird (danke an @FernandoZamperin). Bitte schauen Sie sich die anderen Antworten an!

Anstatt ein Thema zu abonnieren, können Sie stattdessen den conditionSchlüssel verwenden und Nachrichten an Instanzen senden, die nicht zu einer Gruppe gehören. Ihre Daten könnten ungefähr so ​​aussehen:

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

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

Walamana
quelle
3
Es ist die beste Antwort. Es kann sofort ausgeführt werden, ohne dass App-Updates erforderlich sind. großartig!
Tom Marvolo Riddle
fand schließlich heraus, dass man - sie sollten es wirklich offensichtlicher machen, das zu benutzen
cwiesner
Das sieht vielversprechend aus, aber funktioniert es wirklich? Es sieht aus wie ein Hack. Ich habe es an einem Beispielprojekt versucht und es funktioniert. Ich bin mir jedoch nicht sicher, ob es mit meiner Produkt-App funktioniert, die Tausende von aktiven Benutzern hat. Hat es jemand mit einer Prod App versucht?
Sahil Patel
4
Ich habe diesen Ansatz eine ganze Weile verwendet und habe einwandfrei funktioniert. Heute sende ich aus irgendeinem Grund die Benachrichtigung an die Legacy-API. Sie gibt mir die message_id ohne Fehler zurück, aber die Geräte erhalten keine Push-Benachrichtigungen Problem? Getestetes Senden an ein einzelnes Token und es funktionierte normal.
Fernando Zamperin
1
@VitVeres Ich habe ein Problem an das Firebase-Supportteam gesendet und sie antworteten mir wie folgt: "Ihre derzeitige Verwendung von Ausdrücken zum Fanout von Push-Benachrichtigungen wird nicht unterstützt. Stellen Sie sicher, dass die im Ausdruck aufgeführten Themen für Ihr App-Projekt vorhanden sind." Ich denke, ich muss Themen in meine Apps implementieren.
Fernando Zamperin
98

Firebase-Benachrichtigungen verfügen nicht über eine API zum Senden von Nachrichten. Glücklicherweise basiert es auf Firebase Cloud Messaging, das genau über eine solche API verfügt.

Mit Firebase Notifications und Cloud Messaging können Sie auf drei Arten sogenannte Downstream-Nachrichten an Geräte senden:

  1. auf bestimmte Geräte , wenn Sie deren Geräte-IDs kennen
  2. zu Gerätegruppen , wenn Sie die Registrierungs-IDs der Gruppen kennen
  3. zu Themen , die nur Schlüssel sind, die Geräte abonnieren können

Sie werden feststellen, dass es keine Möglichkeit gibt, explizit an alle Geräte zu senden. Sie können solche Funktionen jedoch mit jeder dieser Funktionen erstellen, z. B. indem Sie die App beim Start abonnieren (z. B. /topics/all) oder eine Liste aller Geräte-IDs führen und die Nachricht dann an alle senden.

Beim Senden an ein Thema hat Ihr Befehl einen Syntaxfehler. Themen werden beginnend mit identifiziert/topics/ . Da Sie das nicht in Ihrem Code haben, interpretiert der Server allDevicesals Geräte-ID. Da es sich um ein ungültiges Format für ein Geräteregistrierungstoken handelt, wird ein Fehler ausgegeben.

Aus der Dokumentation zum Senden von Nachrichten an Themen:

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!",
   }
}
Frank van Puffelen
quelle
Ich habe versucht, {"to": "/ topic / allDevices", "data": {"message": "Dies ist eine Firebase Cloud Messaging-Themennachricht!"}} Zu senden und habe dieselbe InvalidRegistration-Antwort erhalten. Ich würde annehmen, dass das Thema nicht gültig ist. Ich sehe in der Konsole keine Möglichkeit, eine Datenbank mit Themen anzuzeigen.
Anders8
7
/topics/ist Plural
Frank van Puffelen
grinsen Oh, Tippfehler, Fluch des Programmierers. ;) Neue Antwort ist: {"message_id": 5115052numbers95180}, was sicherlich viel erfolgreicher aussieht. Das Fazit klingt also so, dass die Admin-Konsole zwar über eine Power-Funktion verfügt, mit der Benachrichtigungen über "Benachrichtigungen" übermittelt werden können, dies jedoch auf keinen Fall durch API-Übermittlungen ausgelöst werden kann. (Verlust der in den Benachrichtigungen integrierten Planungs- und Conversion-Nachverfolgung) Ich suche nach Messaging-Code für den Empfang. Danke Frank. :)
Anders8
1
Ähm ... nicht wirklich. Die Benachrichtigungskonsole sendet nur Benachrichtigungsnachrichten (siehe Dokumentation zu Nachrichtentypen ). Das einzige, wofür wir noch keine API haben, ist das Senden an das Publikum .
Frank van Puffelen
1
ist es auch für iOS so? Ich habe das gleiche versucht und ich
erhalte
72

Der einfachste Weg, die Push-Benachrichtigung an alle Geräte zu senden, besteht darin, sie für ein Thema "Alle" zu abonnieren und dann eine Benachrichtigung für dieses Thema zu senden. Kopieren Sie dies in Ihre Hauptaktivität

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

Senden Sie nun die Anfrage als

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

Dies mag ineffizient oder nicht standardisiert sein, aber wie ich oben erwähnt habe, ist es der einfachste. Bitte posten Sie, wenn Sie eine bessere Möglichkeit haben, eine Push-Benachrichtigung an alle Geräte zu senden .

Sie können diesem Tutorial folgen, wenn Sie noch keine Erfahrung mit dem Senden von Push-Benachrichtigungen mit Firebase Cloud Messaging haben. Tutorial - Push-Benachrichtigungen mit FCM


Geben Sie zum Senden einer Nachricht an eine Kombination von Themen eine Bedingung an . Hierbei handelt es sich um einen booleschen Ausdruck, der die Zielthemen angibt. Die folgende Bedingung sendet beispielsweise Nachrichten an Geräte, die abonniert sind, TopicAund entweder TopicBoder TopicC:

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

Weitere Informationen zu Bedingungen und Themen finden Sie hier in der FCM-Dokumentation

Syed Rafay
quelle
Das macht für mich Sinn. Aber wie Sie bin ich mir nicht sicher, ob es ineffizient ist. Kann bitte jemand das klären?
JCarlosR
2
Ich denke nicht, dass es ineffizient ist, das könnte die einzig mögliche Möglichkeit sein, Push-Benachrichtigungen an alle Geräte zu senden (ich konnte zumindest keinen anderen Weg finden)
Syed Rafay
1
Beste Antwort! :)
Wonsuc
2
Gute Antwort. Da es nirgendwo erwähnt wurde, ist es wichtig zu wissen, dass Sie diese Art von Nachrichten in Ihrem erhalten Service, die sich FirebaseMessagingServicein der #onMessageReceivedFunktion erweitern. Damit die Benachrichtigung nicht automatisch angezeigt wird, müssen Sie sich selbst darum kümmern.
reVerse
4

Eine Möglichkeit, dies zu tun, besteht darin, alle Geräte Ihrer Benutzer dazu zu bringen, ein Thema zu abonnieren. Auf diese Weise erhalten alle Geräte eine Nachricht, wenn Sie sie auf ein bestimmtes Thema ausrichten. Ich denke, so macht es der Abschnitt Benachrichtigungen in der Firebase-Konsole.

Abdalrahman Shatou
quelle
Lesen Sie diesen Blogpost für weitere Details -> Developine.com/…
Developine
2

Ich suchte nach einer Lösung für meine Push-Benachrichtigung für die Ionic Cordova-App.

Dank der Antwort von Syed Rafay.

in app.component.ts

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

in der Serverdatei

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

Lassen Sie einfach alle Benutzer, die sich anmelden, ein bestimmtes Thema abonnieren und senden Sie dann eine Benachrichtigung an dieses Thema.

Ashwin Gopi Krishna
quelle
0

Überprüfen Sie Ihre Themenliste in der Firebase-Konsole.

  1. Gehen Sie zur Firebase-Konsole

  2. Klicken Sie wachsen von der Seite Menü

  3. Klicken Sie auf Cloud Messaging

  4. Klicken Sie auf Erste Nachricht senden

  5. Geben Sie im Abschnitt "Benachrichtigung" etwas für den Benachrichtigungstitel und den Benachrichtigungstext ein

  6. Klicken Sie auf Weiter

  7. Klicken Sie im Zielbereich auf Thema

  8. Klicken Sie auf das Textfeld Nachrichtenthema , um Ihre Themen anzuzeigen (ich habe kein Thema mit dem Namen Android oder iOS erstellt, aber ich kann diese beiden Themen anzeigen.

  9. Wenn Sie eine Push-Benachrichtigung senden, fügen Sie diese als Ihre Bedingung hinzu.

    "bedingung" => "'alle' in themen || 'android' in themen || 'ios' in themen",

Ganzkörper

array(
    "notification"=>array(
        "title"=>"Test",
        "body"=>"Test Body",
    ),
    "condition"=> "'all' in topics || 'android' in topics || 'ios' in topics",
);

Wenn Sie mehr Themen haben, können Sie diese mit || hinzufügen (oder) Bedingung, Dann erhalten alle Benutzer Ihre Benachrichtigung. Getestet und für mich gearbeitet.

Minze
quelle
-4

Sie können eine Benachrichtigung an alle Geräte senden, indem Sie "/ topic / all" verwenden.

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

{
  "to": "/topics/all",
  "notification":{ "title":"Notification title", "body":"Notification body", "sound":"default", "click_action":"FCM_PLUGIN_ACTIVITY", "icon":"fcm_push_icon" },
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}
Siva Karuppiah
quelle
Ist das neue Funktionalität? Oder erfordert dies, dass die App "alle" abonniert?
Anders8
Es ist die Standardfunktionalität. Ich abonniere kein Thema. Es funktioniert für mich. Aber ich habe eine Token-Registrierung durchgeführt. "getToken"
Siva Karuppiah
1
Sie würden eine Nachrichten-ID erhalten, ja, aber es wird nichts an ein Gerät gesendet, es sei denn, Sie haben ein Thema mit dem Namen "alle".
Abdalrahman Shatou
Nein, ich habe die Benachrichtigung in meinen Android-Geräten (zwei) erhalten. Soll ich meinen Screenshot anhängen? Ich baue meine App auf ioinc.
Siva Karuppiah
Das funktioniert bei mir. Ich weiß nicht, warum dies abgelehnt wird.
m1crdy