Wie kann ich eine Firebase Cloud Messaging-Benachrichtigung senden, ohne die Firebase-Konsole zu verwenden?

200

Ich beginne mit dem neuen Google-Dienst für die Benachrichtigungen Firebase Cloud Messaging.

Dank dieses Codes https://github.com/firebase/quickstart-android/tree/master/messaging konnte ich Benachrichtigungen von meiner Firebase-Benutzerkonsole an mein Android-Gerät senden .

Gibt es eine API oder eine Möglichkeit, eine Benachrichtigung zu senden, ohne die Firebase-Konsole zu verwenden? Ich meine zum Beispiel eine PHP-API oder ähnliches, um Benachrichtigungen direkt von meinem eigenen Server zu erstellen.

David Corral
quelle
1
Wo hosten Sie Ihren Server, um Benachrichtigungen zu senden?
Rodrigo Ruiz
@ David Corral, überprüfen Sie meine Antwort für das gleiche. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare
Haben eine Frühlings-App geschrieben, um FCM-Benachrichtigungen zu senden, falls Sie sehen möchten, wie es funktioniert -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/…
Aniket Thakur
Sie können die Nachrüstung verwenden, um das Gerät auf das Gerät zu übertragen. stackoverflow.com/questions/37435750/…
eurosecom

Antworten:

218

Firebase Cloud Messaging verfügt über serverseitige APIs, die Sie zum Senden von Nachrichten aufrufen können. Siehe https://firebase.google.com/docs/cloud-messaging/server .

Das Senden einer Nachricht kann so einfach sein wie curldas Aufrufen eines HTTP-Endpunkts. Siehe https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocol

curl -X POST --header "Authorization: key=<API_ACCESS_KEY>" \
    --Header "Content-Type: application/json" \
    https://fcm.googleapis.com/fcm/send \
    -d "{\"to\":\"<YOUR_DEVICE_ID_TOKEN>\",\"notification\":{\"body\":\"Yellow\"},\"priority\":10}"
Frank van Puffelen
quelle
4
Wie kann ich die Geräte-ID unter iOS erhalten? Ist es das Geräte-Token, das wir auf didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData erhalten, oder das lange, das wir mit FIRInstanceID.instanceID (). Token () erhalten ?
FelipeOliveira
3
Frank Ich habe die Anleitung in Firebase-Dokumenten und Codelabs befolgt, um Push-Benachrichtigungen in einer progressiven Webanwendung hinzuzufügen und POstman zum Posten einer http-Anfrage zu verwenden, aber ich erhalte immer wieder 401-Fehler. Irgendwelche Vorschläge. Ich kopiere meinen Serverschlüssel direkt von meiner Firebase-Konsole.
Jason
25
Wie kann ich an alle Benutzer und nicht an bestimmte Benutzer oder Themen senden?
vinbhai4u
3
Ich habe diese Fehlermeldung in einem meiner frühen Versuche mit dem CURL-Snippet erhalten: Das Feld "Priorität" muss eine JSON-Nummer sein: 10. Nachdem ich die Anführungszeichen von den 10 am Ende entfernt hatte, funktionierte es.
Albert C Braun
2
@ vinbhai4u Hast du die Antwort? Daran stecke ich auch fest. Wie kann ich das an alle Anwendungsbenutzer senden?
Rohit
50

Dies funktioniert mit CURL

function sendGCM($message, $id) {


    $url = 'https://fcm.googleapis.com/fcm/send';

    $fields = array (
            'registration_ids' => array (
                    $id
            ),
            'data' => array (
                    "message" => $message
            )
    );
    $fields = json_encode ( $fields );

    $headers = array (
            'Authorization: key=' . "YOUR_KEY_HERE",
            'Content-Type: application/json'
    );

    $ch = curl_init ();
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_setopt ( $ch, CURLOPT_POST, true );
    curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );

    $result = curl_exec ( $ch );
    echo $result;
    curl_close ( $ch );
}

?>

$message ist Ihre Nachricht, die an das Gerät gesendet werden soll

$idist das Geräteregistrierungstoken

YOUR_KEY_HERE ist Ihr Server-API-Schlüssel (oder Legacy-Server-API-Schlüssel)

Hamzah Malik
quelle
Firebase Console hat keine gespeicherten Push-Messaging-Daten in fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan
1
Push-Benachrichtigung an den Browser senden, von wo aus ich die Geräteregistrierungs-ID erhalten kann?
Amit Joshi
Das funktioniert perfekt, aber aufgrund des langen Textes, den ich bekomme {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. Was kann getan werden, um dies zu beheben?
Alisha Lamichhane
@AlishaLamichhane Ist Ihre Nachricht größer als 4096 Bytes? Wenn nicht, können Sie Ihre Nachricht mit base64 verschlüsseln (möglicherweise stimmt etwas mit dem Text nicht). Wenn es größer als 4096 Bytes ist ... nun, das ist das FCM-Limit.
Rik
47

Verwenden Sie eine Service-API.

URL: https://fcm.googleapis.com/fcm/send

Methodentyp: POST

Überschriften:

Content-Type: application/json
Authorization: key=your api key

Körper / Nutzlast:

{ "notification": {
    "title": "Your Title",
    "text": "Your Text",
     "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
  },
    "data": {
    "keyname": "any value " //you can get this data as extras in your activity and this data is optional
    },
  "to" : "to_id(firebase refreshedToken)"
} 

Und damit können Sie in Ihrer App den folgenden Code in Ihre aufzurufende Aktivität einfügen:

<intent-filter>
    <action android:name="OPEN_ACTIVITY_1" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Überprüfen Sie auch die Antwort auf Firebase onMessageReceived, die nicht aufgerufen wird, wenn die App im Hintergrund angezeigt wird

Ankit Adlakha
quelle
Ankit, ich kann an bestimmte Geräte-ID senden. Ich kann jedoch nicht an alle senden. Was muss ich "to" : "to_id(firebase refreshedToken)"anstelle der Geräte-ID eingeben? "all"funktioniert überhaupt nicht. Ich verwende C # WebRequest, um eine Benachrichtigung zu senden. @AshikurRahman Ihr Vorschlag auch willkommen. Ich kämpfe und suche seit 3-4 Tagen.
Ravimallya
3
Keine Ursache. Ich habe die Lösung gefunden. to: "/ topic / all" sendet Benachrichtigungen an alle Geräte oder wenn Sie nur auf IOS abzielen möchten, ersetzen Sie alle durch ios und für Android durch "android". Dies sind die festgelegten Standardthemen. Ich vermute.
Ravimallya
Developine.com/…
Developine
Lesen Sie diesen Blogpost für weitere Details -> Developine.com/…
Developine
@Ankit, Hallo, können Sie bitte angeben, wie die ID des Zielgeräts abgerufen werden soll?
Anand Raj
40

Beispiele mit Curl

Senden Sie Nachrichten an bestimmte Geräte

Um Nachrichten an bestimmte Geräte zu senden, setzen Sie das Registrierungstoken für die jeweilige App-Instanz

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "data": { "score": "5x1","time": "15:10"},"to" : "<registration token>"}' https://fcm.googleapis.com/fcm/send

Senden Sie Nachrichten an Themen

hier ist das thema: / themen / foo-bar

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "to": "/topics/foo-bar","data": { "message": "This is a Firebase Cloud Messaging Topic Message!"}}' https://fcm.googleapis.com/fcm/send

Senden Sie Nachrichten an Gerätegruppen

Das Senden von Nachrichten an eine Gerätegruppe ist dem Senden von Nachrichten an ein einzelnes Gerät sehr ähnlich. Setzen Sie den Parameter to auf den eindeutigen Benachrichtigungsschlüssel für die Gerätegruppe

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{"to": "<aUniqueKey>","data": {"hello": "This is a Firebase Cloud Messaging Device Group Message!"}}' https://fcm.googleapis.com/fcm/send

Beispiele für die Verwendung der Service-API

API-URL: https://fcm.googleapis.com/fcm/send

Überschriften

Content-type: application/json
Authorization:key=<Your Api key>

Anforderungsmethode: POST

Text anfordern

Nachrichten an bestimmte Geräte

{
  "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to": "<registration token>"
}

Nachrichten zu Themen

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

Nachrichten an Gerätegruppen

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}
JR
quelle
Wo haben Sie die Endpunkt-URL fcm.googleapis.com/fcm/send gefunden , die im Firebase-Dokument nicht erwähnt wird?
Utsav Gupta
1
Sie finden das in diesem Link firebase.google.com/docs/cloud-messaging/server
JR
@JR Ich habe eine Chat-Anwendung erstellt, in der der Empfänger eine Benachrichtigung erhalten soll, wenn ein Benutzer eine Nachricht an den Empfänger sendet. Wie kann ich in diesem Fall Ihre Antwort verwenden? Was muss ich also tun, um den Wert für das Feld "to" anzugeben?
Anand Raj
@ Anad Raj beziehen sich auf "Nachrichten an bestimmte Geräte senden" in meiner Antwort
JR
25

Wie von Frank erwähnt, können Sie die HTTP-API von Firebase Cloud Messaging (FCM) verwenden, um eine Push-Benachrichtigung von Ihrem eigenen Back-End aus auszulösen. Aber du wirst es nicht können

  1. Senden Sie Benachrichtigungen an eine Firebase User Identifier (UID) und
  2. Senden Sie Benachrichtigungen an Benutzersegmente (Targeting von Eigenschaften und Ereignissen wie auf der Benutzerkonsole).

Das heißt: Sie müssen die FCM / GCM-Registrierungs-IDs (Push-Token) selbst speichern oder FCM-Themen verwenden, um Benutzer zu abonnieren. Beachten Sie auch, dass FCM keine API für Firebase-Benachrichtigungen ist , sondern eine untergeordnete API ohne Zeitplanung oder Open-Rate-Analyse. Firebase-Benachrichtigungen bauen auf FCM auf.

Antoine Guénard
quelle
6

Zuerst müssen Sie ein Token von Android erhalten und dann können Sie diesen PHP-Code aufrufen und sogar Daten für weitere Aktionen in Ihrer App senden.

 <?php

// Call .php?Action=M&t=title&m=message&r=token
$action=$_GET["Action"];


switch ($action) {
    Case "M":
         $r=$_GET["r"];
        $t=$_GET["t"];
        $m=$_GET["m"];

        $j=json_decode(notify($r, $t, $m));

        $succ=0;
        $fail=0;

        $succ=$j->{'success'};
        $fail=$j->{'failure'};

        print "Success: " . $succ . "<br>";
        print "Fail   : " . $fail . "<br>";

        break;


default:
        print json_encode ("Error: Function not defined ->" . $action);
}

function notify ($r, $t, $m)
    {
    // API access key from Google API's Console
        if (!defined('API_ACCESS_KEY')) define( 'API_ACCESS_KEY', 'Insert here' );
        $tokenarray = array($r);
        // prep the bundle
        $msg = array
        (
            'title'     => $t,
            'message'     => $m,
           'MyKey1'       => 'MyData1',
            'MyKey2'       => 'MyData2', 

        );
        $fields = array
        (
            'registration_ids'     => $tokenarray,
            'data'            => $msg
        );

        $headers = array
        (
            'Authorization: key=' . API_ACCESS_KEY,
            'Content-Type: application/json'
        );

        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, 'fcm.googleapis.com/fcm/send' );
        curl_setopt( $ch,CURLOPT_POST, true );
        curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
        $result = curl_exec($ch );
        curl_close( $ch );
        return $result;
    }


?>
Sandi Horvat
quelle
2

Benachrichtigungen oder Datennachrichten können mithilfe des FCM HTTP v1-API-Endpunkts an den Firebase-Basis-Cloud-Messaging-Server gesendet werden. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Sie müssen den privaten Schlüssel des Dienstkontos mithilfe der Firebase-Konsole generieren und herunterladen und den Zugriffsschlüssel mithilfe der Google API-Clientbibliothek generieren. Verwenden Sie eine beliebige http-Bibliothek, um Nachrichten über dem Endpunkt zu veröffentlichen. Der folgende Code zeigt die Nachricht über OkHTTP. Den vollständigen serverseitigen und clientseitigen Code finden Sie unter Firebase Cloud Messaging und beim Senden von Nachrichten an mehrere Clients anhand des Beispielbeispiels fcm

Wenn eine bestimmte Clientnachricht gesendet werden muss, müssen Sie den Firebase-Registrierungsschlüssel des Clients abrufen. Weitere Informationen finden Sie unter Senden von Client- oder gerätespezifischen Nachrichten an den FCM-Server

String SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
String FCM_ENDPOINT
     = "https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send";

GoogleCredential googleCredential = GoogleCredential
    .fromStream(new FileInputStream("firebase-private-key.json"))
    .createScoped(Arrays.asList(SCOPE));
googleCredential.refreshToken();
String token = googleCredential.getAccessToken();



final MediaType mediaType = MediaType.parse("application/json");

OkHttpClient httpClient = new OkHttpClient();

Request request = new Request.Builder()
    .url(FCM_ENDPOINT)
    .addHeader("Content-Type", "application/json; UTF-8")
    .addHeader("Authorization", "Bearer " + token)
    .post(RequestBody.create(mediaType, jsonMessage))
    .build();


Response response = httpClient.newCall(request).execute();
if (response.isSuccessful()) {
    log.info("Message sent to FCM server");
}
Arnav Rao
quelle
Mein Freund, fcm.googleapis.com/v1/projects/zoftino-stores/messages:send, dieser Link scheint abgelaufen zu sein!
Naser Nikzad
1
Sie müssen Ihre Google-Projekt-URL verwenden, nicht diese. Ersetzen Sie "Zotino-Stores" durch Ihren Projektnamen
Arnav Rao
2

Diese Lösung von diesem Link hat mir sehr geholfen. Sie können es überprüfen.

Die Datei curl.php mit diesen Anweisungen kann funktionieren.

<?php 
// Server key from Firebase Console define( 'API_ACCESS_KEY', 'AAAA----FE6F' );
$data = array("to" => "cNf2---6Vs9", "notification" => array( "title" => "Shareurcodes.com", "body" => "A Code Sharing Blog!","icon" => "icon.png", "click_action" => "http://shareurcodes.com"));
$data_string = json_encode($data);
echo "The Json Data : ".$data_string;
$headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' );
$ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_POSTFIELDS, $data_string);
$result = curl_exec($ch);
curl_close ($ch);
echo "<p>&nbsp;</p>";
echo "The Result : ".$result;

Merken you need to execute curl.php file using another browser ie not from the browser that is used to get the user token. You can see notification only if you are browsing another website.

Ruberandinda Geduld
quelle
0

Wenn Sie Push-Benachrichtigungen von Android senden möchten, lesen Sie meinen Blog-Beitrag

Senden Sie Push-Benachrichtigungen von einem Android-Telefon an ein anderes ohne Server.

Das Senden einer Push-Benachrichtigung ist nichts anderes als eine Post-Anfrage an https://fcm.googleapis.com/fcm/send

Code-Snippet mit Volley:

    JSONObject json = new JSONObject();
 try {
 JSONObject userData=new JSONObject();
 userData.put("title","your title");
 userData.put("body","your body");

json.put("data",userData);
json.put("to", receiverFirebaseToken);
 }
 catch (JSONException e) {
 e.printStackTrace();
 }

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://fcm.googleapis.com/fcm/send", json, new Response.Listener<JSONObject>() {
 @Override
 public void onResponse(JSONObject response) {

Log.i("onResponse", "" + response.toString());
 }
 }, new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {

}
 }) {
 @Override
 public Map<String, String> getHeaders() throws AuthFailureError {

Map<String, String> params = new HashMap<String, String>();
 params.put("Authorizationey=" + SERVER_API_KEY);
 params.put("Content-Typepplication/json");
 return params;
 }
 };
 MySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);

Ich empfehle Ihnen allen, meinen Blog-Beitrag für vollständige Details zu lesen.

Manohar Reddy
quelle
Developine.com/…
Developine
0

Mit der Firebase-Konsole können Sie basierend auf dem Anwendungspaket eine Nachricht an alle Benutzer senden. Mit der CURL- oder PHP-API ist dies jedoch nicht möglich.

Über die API Sie können Benachrichtigungen an bestimmte Geräte-IDs oder abonnierte Benutzer an ausgewählte Themen- oder abonnierte Themenbenutzer senden.

Get a view on following link. It will help you.
https://firebase.google.com/docs/cloud-messaging/send-message
PRATEEK BHARDWAJ
quelle
0

Oder Sie können Firebase-Cloud-Funktionen verwenden, was für mich die einfachere Möglichkeit ist, Ihre Push-Benachrichtigungen zu implementieren. Firebase / Funktionsbeispiele

Laurent Maquet
quelle
0

Wenn Sie PHP verwenden, empfehle ich die Verwendung des PHP SDK für Firebase: Firebase Admin SDK . Für eine einfache Konfiguration können Sie die folgenden Schritte ausführen:

Holen Sie sich die JSON- Datei mit den Projektanmeldeinformationen von Firebase ( initialisieren Sie das SDK ) und fügen Sie sie in Ihr Projekt ein.

Installieren Sie das SDK in Ihrem Projekt. Ich benutze Komponisten:

composer require kreait/firebase-php ^4.35

Probieren Sie ein Beispiel aus der Cloud Messaging-Sitzung in der SDK-Dokumentation aus:

use Kreait\Firebase;
use Kreait\Firebase\Messaging\CloudMessage;

$messaging = (new Firebase\Factory())
->withServiceAccount('/path/to/firebase_credentials.json')
->createMessaging();

$message = CloudMessage::withTarget(/* see sections below */)
    ->withNotification(Notification::create('Title', 'Body'))
    ->withData(['key' => 'value']);

$messaging->send($message);
JC Gras
quelle