Jak mogę wysłać powiadomienie Firebase Cloud Messaging bez użycia konsoli Firebase?

200

Zaczynam z nowej usługi Google dla powiadomień Firebase Cloud Messaging.

Dzięki temu kodowi https://github.com/firebase/quickstart-android/tree/master/messaging mogłem wysyłać powiadomienia z mojej konsoli użytkownika Firebase na urządzenie z Androidem.

Czy istnieje interfejs API lub sposób na wysłanie powiadomienia bez użycia konsoli Firebase? Mam na myśli na przykład interfejs API PHP lub coś takiego, aby bezpośrednio tworzyć powiadomienia z własnego serwera.

David Corral
źródło
1
Gdzie hostujesz swój serwer, aby wysyłać powiadomienia?
Rodrigo Ruiz
@David Corral, sprawdź moją odpowiedź na to samo. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare
Napisałem
Thakur
Możesz użyć modernizacji, aby wysłać wiadomość do urządzenia. stackoverflow.com/questions/37435750/…
eurosecom

Odpowiedzi:

218

Firebase Cloud Messaging ma interfejsy API po stronie serwera, które można wywoływać w celu wysyłania wiadomości. Zobacz https://firebase.google.com/docs/cloud-messaging/server .

Wysłanie wiadomości może być tak proste, jak curlwywołanie punktu końcowego HTTP. Zobacz 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
źródło
4
Jak mogę uzyskać identyfikator urządzenia na iOS? Czy jest to token urządzenia, który otrzymujemy na didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData, czy długi, który otrzymujemy za pomocą FIRInstanceID.instanceID (). Token () ?
FelipeOliveira
3
Frank Postępowałem zgodnie z instrukcjami zawartymi w dokumentach Firebase i kodelabach dotyczących dodawania powiadomień wypychanych w progresywnej aplikacji internetowej i używania POstman do publikowania żądań HTTP, ale wciąż pojawia się błąd 401. Jakieś sugestie. Kopiuję klucz serwera bezpośrednio z konsoli Firebase.
jasan
25
jak wysłać do wszystkich użytkowników, a nie do określonych użytkowników lub tematów?
vinbhai4u,
3
Otrzymałem ten komunikat o błędzie w jednej z moich pierwszych prób z fragmentem CURL: „Priorytet” pola musi być liczbą JSON: 10. Po usunięciu cudzysłowu z 10 na końcu zadziałało.
albert c braun
2
@ vinbhai4u Czy otrzymujesz odpowiedź? Utknąłem również w tym. Jak wysłać to do wszystkich użytkowników aplikacji?
Rohit,
51

Działa to przy użyciu 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 to Twoja wiadomość do wysłania na urządzenie

$idto token rejestracyjny urządzenia

YOUR_KEY_HERE jest kluczem API serwera (lub starszym kluczem API serwera)

Hamzah Malik
źródło
Konsola Firebase nie ma zapisanych danych push push na fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan
1
wysłać powiadomienie push do przeglądarki, skąd mogę uzyskać identyfikator rejestracji urządzenia?
Amit Joshi,
działa to doskonale, ale z powodu długiego tekstu, który otrzymuję {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. Co można zrobić, aby to naprawić?
Alisha Lamichhane
@AlishaLamichhane Czy Twoja wiadomość jest większa niż 4096 bajtów? Jeśli nie, możesz zakodować wiadomość w standardzie base64 (może być coś nie tak z tekstem). Jeśli jest większy niż 4096 bajtów ... to jest limit FCM.
Rik
47

Użyj interfejsu API usługi.

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

Rodzaj metody: POST

Nagłówki:

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

Nadwozie / Ładowność:

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

Dzięki temu w swojej aplikacji możesz dodać poniższy kod w swojej działalności, aby się nazywać:

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

Sprawdź również odpowiedź na Firebase onMessageReceived nie wywoływany, gdy aplikacja w tle

Ankit Adlakha
źródło
Ankit, mogę wysłać na określony identyfikator urządzenia. Nie mogę jednak wysłać do wszystkich. Co muszę podać "to" : "to_id(firebase refreshedToken)"zamiast identyfikatora urządzenia? "all"w ogóle nie działa. Używam C #, WebRequestaby wysłać powiadomienie. @AshikurRahman również mile widziane są Twoje sugestie. Walczę i szukam od 3-4 dni.
Ravimallya
3
Nieważne. Znalazłem rozwiązanie. do: „/ topics / all” wyśle ​​powiadomienia do wszystkich urządzeń lub jeśli chcesz kierować tylko na IOS, zamień wszystko na ios, a na Androida - na „android”. Są to domyślne tematy ustawione. Zgaduję.
Ravimallya
developine.com/…
Developine
Przeczytaj ten wpis na blogu, aby uzyskać więcej informacji -> developine.com/…
Developine
@Ankit, Cześć, czy możesz określić, jak uzyskać identyfikator urządzenia docelowego?
Anand Raj
40

Przykłady z użyciem curl

Wysyłaj wiadomości na określone urządzenia

Aby wysyłać wiadomości do określonych urządzeń, ustaw token rejestracyjny dla określonej instancji aplikacji

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

Wysyłaj wiadomości do tematów

tutaj temat to: / 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

Wysyłaj wiadomości do grup urządzeń

Wysyłanie wiadomości do grupy urządzeń jest bardzo podobne do wysyłania wiadomości do pojedynczego urządzenia. Ustaw parametr na unikalny klucz powiadomienia dla grupy urządzeń

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

Przykłady przy użyciu Service API

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

Nagłówki

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

Metoda zapytania: POST

Żądanie treści

Wiadomości na określone urządzenia

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

Wiadomości do tematów

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

Wiadomości do grup urządzeń

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}
JR
źródło
Gdzie znalazłeś adres końcowy adresu URL fcm.googleapis.com/fcm/send , którego nie wymieniono w dokumencie bazy danych ognia?
Utsav Gupta
1
Można to znaleźć w tym linku firebase.google.com/docs/cloud-messaging/server
JR
@JR Stworzyłem aplikację do czatowania, w której gdy użytkownik wysyła wiadomość do odbiorcy, odbiorca powinien otrzymać powiadomienie. W takim przypadku jak mogę użyć twojej odpowiedzi? Więc co powinienem podać wartość dla pola „do”?
Anand Raj
@ Anad Raj odnosi się do „Wysyłaj wiadomości do określonych urządzeń” w mojej odpowiedzi
JR
25

Jak wspomniał Frank, możesz użyć interfejsu API HTTP Firebase Cloud Messaging (FCM), aby uruchomić powiadomienie wypychane z własnego zaplecza. Ale nie będziesz w stanie

  1. wysyłać powiadomienia do identyfikatora użytkownika Firebase (UID) i
  2. wysyłać powiadomienia do segmentów użytkowników (kierowanie na właściwości i zdarzenia, tak jak w konsoli użytkownika).

Czyli: musisz sam przechowywać identyfikatory rejestracji FCM / GCM (tokeny push) lub używać tematów FCM do subskrybowania użytkowników. Należy również pamiętać, że FCM nie jest interfejsem API dla powiadomień Firebase , jest interfejsem API niższego poziomu bez harmonogramu lub analiz otwartych. Powiadomienia Firebase są oparte na FCM.

Antoine Guénard
źródło
6

Najpierw musisz zdobyć token od Androida, a następnie możesz wywołać ten kod php, a nawet wysłać dane do dalszych działań w swojej aplikacji.

 <?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
źródło
2

Powiadomienie lub komunikat danych można wysłać do bazowego serwera przesyłania komunikatów w chmurze bazowej Firebase przy użyciu punktu końcowego interfejsu API FCM HTTP v1. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Musisz wygenerować i pobrać prywatny klucz konta usługi za pomocą konsoli Firebase i wygenerować klucz dostępu za pomocą biblioteki klienta Google API. Użyj dowolnej biblioteki http, aby opublikować wiadomość powyżej punktu końcowego, poniższy kod pokazuje wiadomość wysyłającą przy użyciu OkHTTP. Kompletny kod po stronie serwera i klienta można znaleźć w komunikatach chmurowych Firebase i wysyłaniu wiadomości do wielu klientów na przykładowym temacie fcm

Jeśli konkretna wiadomość klienta musi zostać wysłana, musisz uzyskać klucz rejestracyjny firebase klienta, zobacz wysyłanie wiadomości klienta lub konkretnego urządzenia na serwer 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
źródło
Mój przyjacielu, fcm.googleapis.com/v1/projects/zoftino-stores/messages:send wydaje się , że ten link wygasł!
Naser Nikzad
1
Musisz użyć adresu URL projektu Google, a nie tego, zastąpić „zotino-stores” nazwą swojego projektu
Arnav Rao
2

to rozwiązanie z tego linku bardzo mi pomogło. możesz to sprawdzić.

Plik curl.php z tą linią instrukcji może działać.

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

Zapamiętaj 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 Cierpliwość
źródło
0

Jeśli chcesz wysyłać powiadomienia push z Androida, sprawdź mój post na blogu

Wysyłaj powiadomienia push z 1 telefonu z Androidem na inny bez serwera.

wysyłanie powiadomienia wypychanego to nic innego jak prośba o wpis na https://fcm.googleapis.com/fcm/send

fragment kodu za pomocą siatkówki:

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

Sugeruję, abyście sprawdzili mój post na blogu, aby uzyskać szczegółowe informacje.

Manohar Reddy
źródło
developine.com/…
Developine
0

Za pomocą Firebase Console możesz wysyłać wiadomości do wszystkich użytkowników na podstawie pakietu aplikacji, ale z CURL lub PHP API nie jest to możliwe.

Poprzez interfejs API Możesz wysyłać powiadomienia do określonego identyfikatora urządzenia lub subskrybowanych użytkowników do wybranego tematu lub subskrybowanych użytkowników tematu.

Get a view on following link. It will help you.
https://firebase.google.com/docs/cloud-messaging/send-message
PRATEEK BHARDWAJ
źródło
0

Lub możesz użyć funkcji chmury Firebase, co jest dla mnie łatwiejszym sposobem na wdrożenie powiadomień push. baza ogniowa / funkcje-próbki

Laurent Maquet
źródło
0

Jeśli używasz PHP, polecam użycie zestawu SDK PHP dla Firebase: Firebase Admin SDK . Aby ułatwić konfigurację, możesz wykonać następujące kroki:

Pobierz plik json poświadczeń projektu z Firebase (zainicjuj sdk ) i dołącz go do swojego projektu.

Zainstaluj SDK w swoim projekcie. Używam kompozytora:

composer require kreait/firebase-php ^4.35

Wypróbuj dowolny przykład z sesji Cloud Messaging w dokumentacji 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
źródło