Come posso inviare una notifica di Firebase Cloud Messaging senza utilizzare Firebase Console?


200

Sto iniziando con il nuovo servizio di Google per le notifiche, Firebase Cloud Messaging.

Grazie a questo codice https://github.com/firebase/quickstart-android/tree/master/messaging sono stato in grado di inviare notifiche dalla mia console utente Firebase al mio dispositivo Android.

Esiste un'API o un modo per inviare una notifica senza utilizzare la console di Firebase? Intendo, ad esempio, un'API PHP o qualcosa del genere, per creare direttamente notifiche dal mio server.


1
Dove stai ospitando il tuo server per inviare notifiche?
Rodrigo Ruiz,


@David Corral, Controlla la mia risposta per lo stesso. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare

Ho scritto un'app di primavera per inviare le notifiche FCM nel caso in cui desideri vedere come funziona -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/…
Aniket Thakur

È possibile utilizzare retrofit per eseguire il messaging di Davice sul dispositivo. stackoverflow.com/questions/37435750/...
eurosecom

Risposte:


218

Firebase Cloud Messaging ha API lato server che puoi chiamare per inviare messaggi. Vedi https://firebase.google.com/docs/cloud-messaging/server .

L'invio di un messaggio può essere semplice come utilizzare curlper chiamare un end-point HTTP. Vedi 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}"

4
Come posso ottenere l'ID del dispositivo su iOS? È il token del dispositivo che otteniamo su didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData o quello lungo che otteniamo con FIRInstanceID.instanceID (). Token () ?
Felipe Oliveira,

3
Frank Ho seguito la guida su documenti e codelab di firebase per l'aggiunta di notifiche push su una webapp progressiva e l'utilizzo di POstman per pubblicare una richiesta http, ma continuo a ricevere l'errore 401. Eventuali suggerimenti. Sto copiando la mia chiave del server direttamente dalla mia console firebase.
jasan,

25
come inviare a tutti gli utenti anziché a determinati utenti o argomenti?
Vinbhai4u,

3
Ho ricevuto questo messaggio di errore in uno dei miei primi tentativi con lo snippet CURL: il campo "priorità" deve essere un numero JSON: 10. Dopo aver rimosso le virgolette dalle 10 alla fine, ha funzionato.
albert c braun,

2
@ vinbhai4u Hai la risposta? Sono anche bloccato a questo. Come inviarlo a tutti gli utenti dell'applicazione?
Rohit,

51

Funziona con 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 è il tuo messaggio da inviare al dispositivo

$idè il token di registrazione dei dispositivi

YOUR_KEY_HERE è la chiave API del server (o chiave API del server legacy)


Firebase Console non ha alcun salvataggio dei dati di messaggistica push in fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan,

1
inviare una notifica push al browser da dove posso ottenere l'ID di registrazione del dispositivo?
Amit Joshi,

funziona perfettamente ma, a causa del lungo testo che sto ricevendo {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. Cosa si può fare per risolvere questo problema?
Alisha Lamichhane,

@AlishaLamichhane Il tuo messaggio è più grande di 4096 byte? Altrimenti puoi base64 codificare il tuo messaggio (potrebbe esserci qualcosa di sbagliato nel testo). Se è maggiore di 4096 byte ... beh, questo è il limite FCM.
Rik,

47

Utilizzare un API di servizio.

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

Tipo di metodo: POST

Foraggio:

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

Corpo / Carico 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)"
} 

E con questo nella tua app puoi aggiungere il codice qui sotto nella tua attività da chiamare:

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

Controlla anche la risposta su Firebase onMessageReceived non chiamato quando l'app in background


Cavolo, posso inviare a un dispositivo specifico. Tuttavia, non posso inviare a tutti. Cosa devo mettere "to" : "to_id(firebase refreshedToken)"invece di ID dispositivo? "all"non funziona affatto. Sto usando C # WebRequestper inviare la notifica. @AshikurRahman anche il tuo suggerimento è gradito. Faccio fatica e cerco da 3-4 giorni.
Ravimallya,

3
Non importa. Ho trovato la soluzione a: "/ argomenti / tutti" invierà notifiche a tutti i dispositivi o se vuoi scegliere come target solo IOS sostituisci tutto con iOS e per Android, sostituisci con `Android '. Questi sono gli argomenti predefiniti impostati. Suppongo.
Ravimallya,


Leggi questo post sul blog per maggiori dettagli -> developine.com/…
Developine

@Ankit, Ciao, potresti specificare come ottenere l'ID del dispositivo di destinazione?
Anand Raj,

40

Esempi usando l'arricciatura

Invia messaggi a dispositivi specifici

Per inviare messaggi a dispositivi specifici, impostare il token di registrazione per l'istanza dell'app specifica

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

Invia messaggi agli argomenti

qui l'argomento è: / argomenti / 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

Invia messaggi a gruppi di dispositivi

L'invio di messaggi a un gruppo di dispositivi è molto simile all'invio di messaggi a un singolo dispositivo. Impostare il parametro to sulla chiave di notifica univoca per il gruppo di dispositivi

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

Esempi che utilizzano l'API di servizio

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

intestazioni

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

Metodo di richiesta: POST

Corpo della richiesta

Messaggi a dispositivi specifici

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

Messaggi agli argomenti

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

Messaggi ai gruppi di dispositivi

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}

Dove hai trovato l'URL dell'endpoint fcm.googleapis.com/fcm/send , non è indicato da nessuna parte nel documento Firebase?
Utsav Gupta,

1
JR

@JR Ho creato un'applicazione di chat in cui quando un utente invia un messaggio al destinatario, il destinatario dovrebbe ricevere un messaggio di notifica. In questo caso come posso usare la tua risposta? Quindi cosa dovrei dare il valore per il campo "to"?
Anand Raj,

@ Anad Raj riferisci "Invia messaggi a dispositivi specifici" nella mia risposta
JR

25

Come accennato da Frank, puoi utilizzare l'API HTTP Firebase Cloud Messaging (FCM) per attivare la notifica push dal tuo back-end. Ma non sarai in grado di farlo

  1. inviare notifiche a un identificatore utente Firebase (UID) e
  2. inviare notifiche ai segmenti di utenti (indirizzando proprietà ed eventi come è possibile sulla console utente).

Significato: dovrai archiviare tu stesso gli ID di registrazione FCM / GCM (token push) o utilizzare gli argomenti FCM per abbonare gli utenti. Tieni inoltre presente che FCM non è un'API per le notifiche Firebase , è un'API di livello inferiore senza pianificazione o analisi a tasso aperto. Le notifiche di Firebase si basano su FCM.


6

Per prima cosa devi ottenere un token da Android e quindi puoi chiamare questo codice php e puoi persino inviare dati per ulteriori azioni nella tua app.

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


?>


2

È possibile inviare un messaggio di notifica o dati al server di messaggistica cloud di base Firebase utilizzando l'endpoint API FCM HTTP v1. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

È necessario generare e scaricare l'account della chiave privata del servizio utilizzando la console di Firebase e generare la chiave di accesso utilizzando la libreria client di google api. Utilizzare qualsiasi libreria http per inviare un messaggio al punto finale sopra, sotto il codice mostra la pubblicazione del messaggio utilizzando OkHTTP. Puoi trovare il codice lato server e lato client completo nella messaggistica cloud firebase e inviare messaggi a più client usando l'esempio dell'argomento fcm

Se è necessario inviare un messaggio client specifico, è necessario ottenere la chiave di registrazione firebase del client, vedere esempio di invio di messaggi specifici del client o del dispositivo al server FCM

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


1
Devi utilizzare l'URL del tuo progetto Google, non quello, sostituisci "negozi zotino" con il nome del tuo progetto
Arnav Rao,

2

questa soluzione da questo link mi ha aiutato molto. puoi dare un'occhiata.

Il file curl.php con quelle righe di istruzione può funzionare.

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

Ricorda 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.


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);
}

0

Se vuoi inviare notifiche push da Android controlla il mio post sul blog

Invia notifiche push da 1 telefono Android a un altro senza server.

l'invio di notifiche push non è altro che una richiesta di posta a https://fcm.googleapis.com/fcm/send

snippet di codice usando 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);

Consiglio a tutti di dare un'occhiata al mio post sul blog per i dettagli completi.



0

Utilizzando Firebase Console è possibile inviare messaggi a tutti gli utenti in base al pacchetto dell'applicazione, ma con l'API CURL o PHP non è possibile.

Tramite l'API È possibile inviare una notifica a un ID dispositivo specifico o utenti abbonati a utenti di argomenti o argomenti selezionati.

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


0

Se stai usando PHP, ti consiglio di usare PHP SDK per Firebase: Firebase Admin SDK . Per una facile configurazione è possibile seguire questi passaggi:

Ottieni il file json delle credenziali del progetto da Firebase ( inizializza sdk ) e includilo nel tuo progetto.

Installa l'SDK nel tuo progetto. Uso il compositore:

composer require kreait/firebase-php ^4.35

Prova qualsiasi esempio dalla sessione di Cloud Messaging nella documentazione dell'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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.