Comment envoyer une notification Firebase Cloud Messaging sans utiliser la console Firebase?

200

Je commence avec le nouveau service Google pour les notifications, Firebase Cloud Messaging.

Grâce à ce code https://github.com/firebase/quickstart-android/tree/master/messaging j'ai pu envoyer des notifications de ma console utilisateur Firebase à mon appareil Android.

Existe-t-il une API ou un moyen d'envoyer une notification sans utiliser la console Firebase? Je veux dire, par exemple, une API PHP ou quelque chose comme ça, pour créer des notifications directement depuis mon propre serveur.

David Corral
la source
1
Où hébergez-vous votre serveur pour envoyer des notifications?
Rodrigo Ruiz
@David Corral, vérifiez ma réponse pour la même chose. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare
J'ai écrit une application printanière pour envoyer des notifications FCM au cas où vous souhaiteriez voir comment cela fonctionne -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/…
Thakur
Vous pouvez utiliser la mise à niveau pour mesurer davice à l'appareil. stackoverflow.com/questions/37435750/…
eurosecom

Réponses:

218

Firebase Cloud Messaging dispose d'une API côté serveur que vous pouvez appeler pour envoyer des messages. Voir https://firebase.google.com/docs/cloud-messaging/server .

L'envoi d'un message peut être aussi simple que d'utiliser curlpour appeler un point de terminaison HTTP. Voir 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
la source
4
Comment puis-je obtenir l'identifiant de l'appareil sur iOS? Est-ce le jeton d'appareil que nous obtenons sur didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData ou le long que nous obtenons avec FIRInstanceID.instanceID (). Token () ?
FelipeOliveira
3
Frank, j'ai suivi le guide des documents Firebase et des codelabs pour ajouter des notifications push sur une webapp progressive et utiliser POstman pour publier une demande http, mais je reçois toujours une erreur 401. Aucune suggestion. Je copie ma clé de serveur directement depuis ma console Firebase.
jasan
25
comment envoyer à tous les utilisateurs plutôt qu'à des utilisateurs ou des sujets particuliers?
vinbhai4u
3
J'ai reçu ce message d'erreur dans l'un de mes premiers essais avec l'extrait CURL: Le champ "priorité" doit être un nombre JSON: 10. Après avoir supprimé les guillemets du 10 à la fin, cela a fonctionné.
albert c braun
2
@ vinbhai4u Avez-vous la réponse? Je suis également coincé à cela. Comment envoyer cela à tous les utilisateurs de l'application?
Rohit
51

Cela fonctionne en utilisant 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 est votre message à envoyer à l'appareil

$idest le jeton d'enregistrement des appareils

YOUR_KEY_HERE est votre clé API serveur (ou clé API serveur héritée)

Hamzah Malik
la source
La console Firebase n'a aucune sauvegarde de données de messagerie push dans fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan
1
envoyer une notification push au navigateur d'où je peux obtenir l'identifiant d'enregistrement de l'appareil?
Amit Joshi
cela fonctionne parfaitement mais, à cause du long texte que je reçois {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. Qu'est-ce qui peut être fait pour régler ceci?
Alisha Lamichhane
@AlishaLamichhane Votre message est-il plus grand que 4096 octets? Sinon, vous pouvez coder en base64 votre message (il peut y avoir un problème avec le texte). S'il est supérieur à 4096 octets ... eh bien, c'est la limite FCM.
Rik
47

Utilisez une API de service.

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

Type de méthode: POST

En-têtes:

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

Corps / Charge utile:

{ "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)"
} 

Et avec cela dans votre application, vous pouvez ajouter le code ci-dessous dans votre activité pour être appelé:

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

Vérifiez également la réponse sur Firebase onMessageReceived non appelé lorsque l'application en arrière-plan

Ankit Adlakha
la source
Ankit, je peux envoyer à un identifiant de périphérique spécifique. Cependant, je ne peux pas envoyer à tous. Que dois-je mettre à la "to" : "to_id(firebase refreshedToken)"place de l'ID de l'appareil? "all"ne fonctionne pas du tout. J'utilise C # WebRequestpour envoyer une notification. @AshikurRahman votre suggestion est également la bienvenue. Je me bats et cherche depuis 3-4 jours.
Ravimallya
3
Ça ne fait rien. J'ai trouvé la solution. à: "/ topics / all" enverra des notifications à tous les appareils ou si vous souhaitez cibler uniquement IOS, remplacez tout par ios et pour android, remplacez par `android '. Ce sont les sujets par défaut définis. J'imagine.
Ravimallya
developine.com/…
Developine
Lisez cet article de blog pour plus de détails -> developine.com/…
Developine
@Ankit, salut, pourriez-vous s'il vous plaît spécifier comment obtenir l'ID de l'appareil cible?
Anand Raj
40

Exemples utilisant curl

Envoyer des messages à des appareils spécifiques

Pour envoyer des messages à des appareils spécifiques, définissez le sur le jeton d'enregistrement pour l'instance d'application spécifique

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

Envoyer des messages aux sujets

ici le sujet est: / topics / 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

Envoyer des messages aux groupes d'appareils

L'envoi de messages à un groupe d'appareils est très similaire à l'envoi de messages à un appareil individuel. Définissez le paramètre to sur la clé de notification unique pour le groupe de périphériques

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

Exemples d'utilisation de l'API de service

URL de l'API: https://fcm.googleapis.com/fcm/send

En-têtes

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

Méthode de demande: POST

Organe de demande

Messages vers des appareils spécifiques

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

Messages aux sujets

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

Messages aux groupes d'appareils

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}
JR
la source
Où avez-vous trouvé l'URL du point de terminaison fcm.googleapis.com/fcm/send , ce n'est pas mentionné dans la doc Firebase?
Utsav Gupta
1
Vous pouvez trouver cela dans ce lien firebase.google.com/docs/cloud-messaging/server
JR
@JR J'ai créé une application de chat dans laquelle lorsqu'un utilisateur envoie un message au destinataire, le destinataire doit recevoir un message de notification. Dans ce cas, comment puis-je utiliser votre réponse? Alors, que dois-je avoir pour donner la valeur du champ "à"?
Anand Raj
@ Anad Raj réfère "Envoyer des messages à des appareils spécifiques" dans ma réponse
JR
25

Comme mentionné par Frank, vous pouvez utiliser l'API HTTP Firebase Cloud Messaging (FCM) pour déclencher une notification push à partir de votre propre back-end. Mais vous ne pourrez pas

  1. envoyer des notifications à un identifiant utilisateur Firebase (UID) et
  2. envoyer des notifications aux segments d'utilisateurs (ciblage des propriétés et des événements comme vous pouvez sur la console utilisateur).

Signification: vous devrez stocker vous-même les identifiants d'enregistrement FCM / GCM (jetons push) ou utiliser les rubriques FCM pour abonner les utilisateurs. Gardez également à l'esprit que FCM n'est pas une API pour les notifications Firebase , c'est une API de niveau inférieur sans planification ni analyse à taux ouvert. Les notifications Firebase sont basées sur FCM.

Antoine Guénard
la source
6

Vous devez d'abord obtenir un jeton d'Android, puis vous pouvez appeler ce code php et vous pouvez même envoyer des données pour d'autres actions dans votre application.

 <?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
la source
2

Une notification ou un message de données peut être envoyé au serveur de messagerie cloud de base Firebase à l'aide du point de terminaison FCM HTTP v1 API. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Vous devez générer et télécharger la clé privée du compte de service à l'aide de la console Firebase et générer la clé d'accès à l'aide de la bibliothèque cliente Google api. Utilisez n'importe quelle bibliothèque http pour publier un message au point final ci-dessus, le code ci-dessous montre la publication du message à l'aide d'OkHTTP. Vous pouvez trouver le code côté serveur et côté client complet dans la messagerie cloud Firebase et l'envoi de messages à plusieurs clients à l'aide de l'exemple de rubrique fcm

Si un message client spécifique doit être envoyé, vous devez obtenir la clé d'enregistrement Firebase du client, voir l' envoi de messages spécifiques client ou périphérique au serveur FCM, exemple

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
la source
Mon ami, fcm.googleapis.com/v1/projects/zoftino-stores/messages : envoyer ce lien semble expiré!
Naser Nikzad
1
Vous devez utiliser l'URL de votre projet Google, pas celle-ci, remplacer "zotino-stores" par le nom de votre projet
Arnav Rao
2

cette solution à partir de ce lien m'a beaucoup aidé. vous pouvez le vérifier.

Le fichier curl.php avec ces instructions peut fonctionner.

<?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;

Rappelles toi 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 Patience
la source
1
Go to cloud Messaging select:  Server key



function sendGCM($message, $deviceToken) {

    $url = 'https://fcm.googleapis.com/fcm/send';
    $fields = array (
            'registration_ids' => array (
                $id
            ),
            'data' => array (
                "title" =>  "Notification title",
                "body" =>  $message,
            )
    );
    $fields = json_encode ( $fields );
    $headers = array (
        'Authorization: key=' . "YOUR_SERVER_KEY",
        '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);
}
Julio fils
la source
0

Si vous souhaitez envoyer des notifications push depuis Android, consultez mon blog

Envoyez des notifications push d'un téléphone Android à un autre sans serveur.

envoyer une notification push n'est rien d'autre qu'une demande de publication à https://fcm.googleapis.com/fcm/send

extrait de code utilisant 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);

Je vous suggère à tous de consulter mon article de blog pour plus de détails.

Manohar Reddy
la source
developine.com/…
Developine
0

En utilisant Firebase Console, vous pouvez envoyer un message à tous les utilisateurs en fonction du package d'application, mais avec CURL ou PHP API, ce n'est pas possible.

Via l'API Vous pouvez envoyer une notification à un ID d'appareil spécifique ou à des utilisateurs abonnés à un sujet sélectionné ou à des utilisateurs de sujets abonnés.

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

Si vous utilisez PHP, je vous recommande d'utiliser le SDK PHP pour Firebase: Firebase Admin SDK . Pour une configuration facile, vous pouvez suivre ces étapes:

Obtenez le fichier json des informations d'identification du projet à partir de Firebase ( initialisez le sdk ) et incluez-le dans votre projet.

Installez le SDK dans votre projet. J'utilise le compositeur:

composer require kreait/firebase-php ^4.35

Essayez n'importe quel exemple de la session Cloud Messaging dans la documentation du SDK:

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
la source