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?
FirebaseInstanceIdService
Antworten:
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
condition
Schlü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
quelle
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:
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 ServerallDevices
als 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!", } }
quelle
/topics/
ist PluralDer 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,
TopicA
und entwederTopicB
oderTopicC
:{ "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
quelle
Service
, die sichFirebaseMessagingService
in der#onMessageReceived
Funktion erweitern. Damit die Benachrichtigung nicht automatisch angezeigt wird, müssen Sie sich selbst darum kümmern.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.
quelle
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",
quelle
Lassen Sie einfach alle Benutzer, die sich anmelden, ein bestimmtes Thema abonnieren und senden Sie dann eine Benachrichtigung an dieses Thema.
quelle
Überprüfen Sie Ihre Themenliste in der Firebase-Konsole.
Gehen Sie zur Firebase-Konsole
Klicken Sie wachsen von der Seite Menü
Klicken Sie auf Cloud Messaging
Klicken Sie auf Erste Nachricht senden
Geben Sie im Abschnitt "Benachrichtigung" etwas für den Benachrichtigungstitel und den Benachrichtigungstext ein
Klicken Sie auf Weiter
Klicken Sie im Zielbereich auf Thema
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.
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.
quelle
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!", } }
quelle