¿Cómo puedo enviar una notificación de Firebase Cloud Messaging sin usar Firebase Console?

200

Estoy empezando con el nuevo servicio de Google para las notificaciones, Firebase Cloud Messaging.

Gracias a este código https://github.com/firebase/quickstart-android/tree/master/messaging pude enviar notificaciones desde mi Firebase User Console a mi dispositivo Android.

¿Hay alguna API o forma de enviar una notificación sin usar la consola Firebase? Me refiero, por ejemplo, a una API PHP o algo así, para crear notificaciones desde mi propio servidor directamente.

David Corral
fuente
1
¿Dónde aloja su servidor para enviar notificaciones?
Rodrigo Ruiz
@David Corral, comprueba mi respuesta por la misma. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare
Han escrito una aplicación de la primavera para enviar notificaciones FCM en caso que usted desea ver cómo funciona -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/...
Aniket Thakur
Puede usar la actualización para enviar mensajes al dispositivo. stackoverflow.com/questions/37435750/…
eurosecom

Respuestas:

218

Firebase Cloud Messaging tiene una API del lado del servidor a la que puedes llamar para enviar mensajes. Ver https://firebase.google.com/docs/cloud-messaging/server .

Enviar un mensaje puede ser tan simple como usar curlpara llamar a un punto final HTTP. Ver 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
fuente
44
¿Cómo puedo obtener la identificación del dispositivo en iOS? ¿Es el token del dispositivo que recibimos didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData o el largo que obtenemos con FIRInstanceID.instanceID (). Token () ?
FelipeOliveira
3
Frank, seguí la guía en Firebase docs y codelabs para agregar notificaciones push en una aplicación web progresiva y usar POstman para publicar una solicitud http, pero sigo recibiendo el error 401. Alguna sugerencia. Estoy copiando la clave de mi servidor directamente desde mi consola firebase.
jasan
25
¿Cómo enviar a todos los usuarios en lugar de a un usuario o tema en particular?
vinbhai4u
3
Recibí este mensaje de error en uno de mis primeros intentos con el fragmento CURL: La "prioridad" del campo debe ser un número JSON: 10. Después de eliminar las comillas del 10 al final, funcionó.
albert c braun
2
@ vinbhai4u ¿Obtiene la respuesta? También estoy atrapado en eso. ¿Cómo enviar eso a todos los usuarios de la aplicación?
Rohit
51

Esto funciona usando 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 es tu mensaje para enviar al dispositivo

$ides el token de registro de dispositivos

YOUR_KEY_HERE es la clave API del servidor (o la clave API del servidor heredado)

Hamzah Malik
fuente
Firebase Console no tiene datos de guardado de mensajes push en fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan
1
enviar notificaciones push al navegador desde donde puedo obtener la identificación de registro del dispositivo?
Amit Joshi
esto funciona perfectamente pero, debido al largo texto que recibo {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. ¿Qué se puede hacer para arreglar esto?
Alisha Lamichhane
@AlishaLamichhane ¿Su mensaje es más grande que 4096 bytes? Si no, puede codificar en base64 su mensaje (puede haber algo mal con el texto). Si es más grande que 4096 bytes ... bueno, ese es el límite de FCM.
Rik
47

Use una API de servicio.

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

Tipo de método: POST

Encabezados

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

Cuerpo / carga útil:

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

Y con esto en su aplicación, puede agregar el siguiente código en su actividad que se llamará:

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

También verifique la respuesta en Firebase onMessageReceived no llamado cuando la aplicación está en segundo plano

Ankit Adlakha
fuente
Ankit, puedo enviar a la identificación del dispositivo específico. Sin embargo, no puedo enviar a todos. ¿Qué tengo que poner en "to" : "to_id(firebase refreshedToken)"lugar de la identificación del dispositivo? "all"no funciona en absoluto Estoy usando C # WebRequestpara enviar notificaciones. @AshikurRahman su sugerencia también es bienvenida. Estoy luchando y buscando desde 3-4 días.
Ravimallya
3
No importa. Encontré la solución. a: "/ topics / all" enviará notificaciones a todos los dispositivos o si desea apuntar solo a IOS, reemplace todo con ios y para Android, reemplace con 'android'. Estos son los temas predeterminados establecidos. Supongo.
Ravimallya
developine.com/...
Developine
Leer esta entrada de blog para más detalles -> developine.com/...
Developine
@Ankit, Hola, ¿podría especificar cómo obtener la identificación del dispositivo de destino?
Anand Raj el
40

Ejemplos que usan curl

Enviar mensajes a dispositivos específicos

Para enviar mensajes a dispositivos específicos, configure el token de registro para la instancia de aplicación específica

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

Enviar mensajes a temas

aquí el tema es: / 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

Enviar mensajes a grupos de dispositivos

Enviar mensajes a un grupo de dispositivos es muy similar a enviar mensajes a un dispositivo individual. Establezca el parámetro a en la clave de notificación única para el grupo de dispositivos

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

Ejemplos de uso de API de servicio

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

Encabezados

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

Método de solicitud: POST

Cuerpo de solicitud

Mensajes a dispositivos específicos

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

Mensajes a temas

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

Mensajes a grupos de dispositivos

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}
JR
fuente
¿Dónde encontró la URL del punto final fcm.googleapis.com/fcm/send , no se menciona en el documento de Firebase?
Utsav Gupta
1
Puede encontrarlo en este enlace firebase.google.com/docs/cloud-messaging/server
JR
@JR He creado una aplicación de chat en la que cuando un usuario envía un mensaje al receptor, el receptor debe recibir un mensaje de notificación. En este caso, ¿cómo puedo usar su respuesta? Entonces, ¿qué debo tener para dar el valor para el campo "a"?
Anand Raj el
@ Anad Raj se refiere a "Enviar mensajes a dispositivos específicos" en mi respuesta
JR
25

Como lo mencionó Frank, puede usar la API HTTP de Firebase Cloud Messaging (FCM) para activar notificaciones push desde su propio back-end. Pero no podrás

  1. enviar notificaciones a un identificador de usuario (UID) de Firebase y
  2. enviar notificaciones a segmentos de usuarios (propiedades y eventos de orientación como puede hacerlo en la consola de usuario).

Significado: tendrá que almacenar los identificadores de registro de FCM / GCM (tokens de inserción) usted mismo o usar temas de FCM para suscribirse a los usuarios. Tenga en cuenta también que FCM no es una API para notificaciones de Firebase , es una API de nivel inferior sin programación o análisis de tasa de apertura. Las notificaciones de Firebase se basan en FCM.

Antoine Guénard
fuente
6

Primero debe obtener un token de Android y luego puede llamar a este código php e incluso puede enviar datos para acciones adicionales en su aplicación.

 <?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
fuente
2

Se pueden enviar notificaciones o mensajes de datos al servidor de mensajería en la nube base de Firebase utilizando el punto final FCM HTTP v1 API. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Debe generar y descargar la clave privada de la cuenta de servicio con la consola Firebase y generar la clave de acceso con la biblioteca de cliente de la API de Google. Use cualquier biblioteca http para publicar el mensaje en el punto final anterior, el código siguiente muestra la publicación del mensaje usando OkHTTP. Puede encontrar el código completo del lado del servidor y del lado del cliente en la mensajería en la nube de Firebase y enviar mensajes a varios clientes utilizando el ejemplo de tema fcm

Si necesita enviar un mensaje específico del cliente, debe obtener la clave de registro de Firebase del cliente, consulte el envío de mensajes específicos del cliente o dispositivo al servidor 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");
}
Arnav Rao
fuente
Mi amigo, fcm.googleapis.com/v1/projects/zoftino-stores/messages: ¡ este enlace parece haber caducado!
Naser Nikzad
1
Debe usar la URL de su proyecto de Google, no esa, reemplace "zotino-stores" con el nombre de su proyecto
Arnav Rao
2

Esta solución de este enlace me ayudó mucho. Puedes echarle un vistazo.

El archivo curl.php con esas líneas de instrucción puede funcionar.

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

Recuerda 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 Paciencia
fuente
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
fuente
0

Si desea enviar notificaciones push desde Android, consulte mi publicación de blog

Enviar notificaciones push de 1 teléfono Android a otro sin servidor.

enviar notificaciones push no es más que una solicitud de publicación a https://fcm.googleapis.com/fcm/send

fragmento de código con 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);

Les sugiero a todos que revisen mi publicación de blog para obtener detalles completos.

Manohar Reddy
fuente
developine.com/...
Developine
0

Con Firebase Console puede enviar mensajes a todos los usuarios según el paquete de la aplicación, pero con CURL o PHP API no es posible.

A través de la API Puede enviar notificaciones a ID de dispositivo específico o usuarios suscritos a los temas seleccionados o usuarios de temas suscritos.

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

O puede usar las funciones en la nube de Firebase, que es para mí la forma más fácil de implementar sus notificaciones push. firebase / samples-funciones

Laurent Maquet
fuente
0

Si usa PHP, le recomiendo usar PHP SDK para Firebase: Firebase Admin SDK . Para una configuración fácil, puede seguir estos pasos:

Obtenga el archivo json de credenciales del proyecto de Firebase ( Inicialice el sdk ) e en su proyecto.

Instale el SDK en su proyecto. Yo uso compositor:

composer require kreait/firebase-php ^4.35

Pruebe cualquier ejemplo de la sesión de Cloud Messaging en la documentación del 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
fuente