Como posso enviar uma notificação do Firebase Cloud Messaging sem usar o Firebase Console?

200

Estou começando com o novo serviço do Google para as notificações Firebase Cloud Messaging.

Graças a este código https://github.com/firebase/quickstart-android/tree/master/messaging , consegui enviar notificações do meu Firebase User Console para o meu dispositivo Android.

Existe alguma API ou maneira de enviar uma notificação sem usar o console do Firebase? Quero dizer, por exemplo, uma API PHP ou algo parecido, criar notificações diretamente do meu próprio servidor.

David Corral
fonte
1
Onde você está hospedando seu servidor para enviar notificações?
Rodrigo Ruiz
@ David Corral, verifique minha resposta para o mesmo. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare
Ter escrito um aplicativo Primavera para enviar notificações FCM caso você deseja ver como ele funciona -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/...
Aniket Thakur
Você pode usar o retrofit para mesage avis ao dispositivo. stackoverflow.com/questions/37435750/…
eurosecom

Respostas:

218

O Firebase Cloud Messaging possui APIs do lado do servidor que você pode chamar para enviar mensagens. Consulte https://firebase.google.com/docs/cloud-messaging/server .

O envio de uma mensagem pode ser tão simples quanto usar curlpara chamar um ponto de extremidade HTTP. Consulte 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
fonte
4
Como posso obter a ID do dispositivo no iOS? É o token de dispositivo que obtemos no didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData ou o mais longo obtido com FIRInstanceID.instanceID (). Token () ?
FelipeOliveira
3
Frank Eu segui o guia na documentação do firebase e codelabs para adicionar notificações push em um webapp progressivo e usar o POstman para postar uma solicitação http, mas continuo recebendo erro 401. Alguma sugestão. Estou copiando minha chave do servidor diretamente do meu console do firebase.
Jasan
25
como enviar para todos os usuários em vez de para usuários ou tópicos específicos?
Vinbhai4u #
3
Recebi essa mensagem de erro novamente em uma das minhas primeiras tentativas com o snippet CURL: O campo "priority" deve ser um número JSON: 10. Depois que removi as aspas dos 10 no final, ele funcionou.
albert c braun
2
@ vinbhai4u Você conseguiu a resposta? Eu também estou preso nisso. Como enviar isso para todos os usuários do aplicativo?
Rohit
51

Isso 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 é a sua mensagem para enviar para o dispositivo

$idé o token de registro de dispositivos

YOUR_KEY_HERE é sua chave da API do servidor (ou chave da API do servidor herdado)

Hamzah Malik
fonte
O Firebase Console não possui dados de mensagens push salvos em fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan
1
enviar notificação por push para o navegador de onde posso obter o ID de registro do dispositivo?
Amit Joshi
isso funciona perfeitamente, mas, devido ao texto longo que estou recebendo {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. O que pode ser feito para corrigir isso?
Alisha Lamichhane 22/10/19
@AlishaLamichhane A sua mensagem tem mais de 4096 bytes? Caso contrário, você pode codificar a base64 sua mensagem (pode haver algo errado com o texto). Se for maior que 4096 bytes ... bem, esse é o limite do FCM.
Rik
47

Use uma API de serviço.

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

Tipo de método: POST

Cabeçalhos:

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

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

E com isso no seu aplicativo, você pode adicionar o código abaixo na sua atividade a ser chamado:

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

Verifique também a resposta no Firebase onMessageReceived não chamado quando o aplicativo em segundo plano

Ankit Adlakha
fonte
Ankit, eu posso enviar para um ID de dispositivo específico. No entanto, não posso enviar para todos. O que eu tenho que colocar em "to" : "to_id(firebase refreshedToken)"vez da identificação do dispositivo? "all"não está funcionando. Estou usando c # WebRequestpara enviar notificação. @AshikurRahman sua sugestão também é bem-vinda. Estou lutando e pesquisando desde 3-4 dias.
Ravimallya
3
Deixa pra lá. Eu encontrei a solução. para: "/ topics / all" enviará notificações para todos os dispositivos ou se você desejar segmentar apenas IOS, substitua todos por ios e, para android, substitua por `android '. Estes são os tópicos padrão definidos. Eu acho.
Ravimallya
developine.com/…
Developine
Leia este post do blog para obter mais detalhes -> developine.com/…
Developine
@ Ankit, Oi, você poderia especificar como obter o ID do dispositivo de destino?
Anand Raj
40

Exemplos usando curl

Envie mensagens para dispositivos específicos

Para enviar mensagens para dispositivos específicos, defina o token de registro para a instância específica do aplicativo

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 mensagens para tópicos

aqui o tópico é: / 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 mensagens para grupos de dispositivos

O envio de mensagens para um grupo de dispositivos é muito semelhante ao envio de mensagens para um dispositivo individual. Defina o parâmetro to como a chave de notificação exclusiva para o 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

Exemplos usando a API de serviço

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

Cabeçalhos

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

Método de solicitação: POST

Organismo de solicitação

Mensagens para dispositivos específicos

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

Mensagens para tópicos

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

Mensagens para grupos de dispositivos

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}
JR
fonte
Onde você encontrou o URL do ponto de extremidade fcm.googleapis.com/fcm/send , não é mencionado em nenhum documento do firebase?
Utsav Gupta
1
Você pode achar que neste link firebase.google.com/docs/cloud-messaging/server
JR
@JR Criei um aplicativo de bate-papo no qual, quando um usuário envia uma mensagem para o destinatário, o destinatário deve receber uma mensagem de notificação. Nesse caso, como posso usar sua resposta? Então, o que devo ter para atribuir o valor do campo "a"?
Anand Raj
@ Anad Raj refere "Enviar mensagens para dispositivos específicos" na minha resposta
JR
25

Conforme mencionado por Frank, você pode usar a API HTTP do Firebase Cloud Messaging (FCM) para acionar a notificação por push do seu próprio back-end. Mas você não será capaz de

  1. envie notificações para um UID (Firebase User Identifier) ​​e
  2. envie notificações para segmentos de usuários (segmentando propriedades e eventos como você pode no console do usuário).

Significado: você precisará armazenar os IDs de registro do FCM / GCM (tokens de envio) ou usar os tópicos do FCM para inscrever usuários. Lembre-se de que o FCM não é uma API para notificações do Firebase , é uma API de nível inferior sem agendamento ou análise de taxa aberta. As Notificações do Firebase são construídas no topo do FCM.

Antoine Guénard
fonte
6

Primeiro, você precisa obter um token do Android e, em seguida, você pode chamar esse código php e até enviar dados para outras ações em seu aplicativo.

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

Uma notificação ou mensagem de dados pode ser enviada ao servidor de mensagens na nuvem base do firebase usando o terminal da API FCM HTTP v1. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Você precisa gerar e fazer o download da conta de chave privada de serviço usando o console do Firebase e gerar a chave de acesso usando a biblioteca do cliente API do Google. Use qualquer biblioteca http para postar a mensagem no ponto final acima; o código abaixo mostra a postagem da mensagem usando o OkHTTP. Você pode encontrar o código completo do lado do servidor e do cliente em mensagens nuvem do firebase e no envio de mensagens para vários clientes usando o exemplo de tópico fcm

Se uma mensagem específica do cliente precisar ser enviada, você precisará obter a chave de registro do firebase, consulte o exemplo de envio de mensagens específicas do cliente ou do dispositivo ao 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
fonte
Meu amigo, fcm.googleapis.com/v1/projects/zoftino-stores/messages:envie este link parece ter expirado!
Naser Nikzad
1
Você precisa usar o seu url google projeto, não aquele, substituir "zotino-lojas" com o nome do projeto
Arnav Rao
2

essa solução desse link me ajudou muito. você pode conferir.

O arquivo curl.php com essas linhas de instrução pode 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;

Lembrar 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 Paciência
fonte
0

Se você deseja enviar notificações push do Android, confira minha postagem no blog

Envie notificações push de um telefone Android para outro sem servidor.

enviar notificação por push não passa de uma solicitação de postagem para https://fcm.googleapis.com/fcm/send

snippet de código usando vôlei:

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

Sugiro a todos que consultem minha postagem no blog para obter detalhes completos.

Manohar Reddy
fonte
developine.com/…
Developine
0

Usando o Firebase Console, você pode enviar mensagens para todos os usuários com base no pacote de aplicativos, mas não é possível com a API CURL ou PHP.

Por meio da API Você pode enviar uma notificação para um ID de dispositivo específico ou usuários inscritos para o tópico selecionado ou usuários do tópico inscrito.

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

Ou você pode usar as funções de nuvem do Firebase, que é para mim a maneira mais fácil de implementar suas notificações por push. firebase / funções-amostras

Laurent Maquet
fonte
0

Se você estiver usando PHP, recomendo usar o SDK do PHP para Firebase: Firebase Admin SDK . Para uma configuração fácil, você pode seguir estas etapas:

Obtenha o arquivo json das credenciais do projeto no Firebase ( Inicialize o sdk ) e inclua-o no seu projeto.

Instale o SDK no seu projeto. Eu uso o compositor:

composer require kreait/firebase-php ^4.35

Tente qualquer exemplo da sessão do Cloud Messaging na documentação do 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
fonte