Bagaimana saya dapat mengirim pemberitahuan Firebase Cloud Messaging tanpa menggunakan Firebase Console?

200

Saya mulai dengan layanan Google baru untuk notifikasi Firebase Cloud Messaging,.

Berkat kode ini https://github.com/firebase/quickstart-android/tree/master/messaging, saya dapat mengirim pemberitahuan dari Firebase User Console ke perangkat Android saya.

Apakah ada API atau cara untuk mengirim pemberitahuan tanpa menggunakan Firebase console? Maksud saya, misalnya, API PHP atau semacamnya, untuk membuat pemberitahuan dari server saya sendiri secara langsung.

David Corral
sumber
1
Di mana Anda hosting server Anda untuk mengirim notifikasi?
Rodrigo Ruiz
@ David Corral, Periksa jawaban saya untuk hal yang sama. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare
Telah menulis aplikasi musim semi untuk mengirim notifikasi FCM jika Anda ingin melihat cara kerjanya -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/…
Aniket Thakur
Anda dapat menggunakan retrofit ke mesage davice ke perangkat. stackoverflow.com/questions/37435750/…
eurosecom

Jawaban:

218

Firebase Cloud Messaging memiliki API sisi server yang dapat Anda panggil untuk mengirim pesan. Lihat https://firebase.google.com/docs/cloud-messaging/server .

Mengirim pesan bisa sesederhana menggunakan curluntuk memanggil titik akhir HTTP. Lihat 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
sumber
4
Bagaimana saya bisa mendapatkan id perangkat di iOS? Apakah itu token perangkat yang kita peroleh didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData atau yang lama kita dapatkan dengan FIRInstanceID.instanceID (). Token () ?
FelipeOliveira
3
Frank I mengikuti panduan di firebase docs dan codelab untuk menambahkan pemberitahuan push pada webapp progresif dan menggunakan POstman untuk mengirim permintaan http, namun saya terus mendapatkan 401 kesalahan. Saran saya. Saya menyalin kunci server saya langsung dari konsol firebase saya.
jasan
25
cara mengirim ke semua pengguna daripada pengguna atau topik tertentu?
vinbhai4u
3
Saya mendapatkan pesan kesalahan ini kembali di salah satu percobaan awal saya dengan cuplikan CURL: Field "priority" harus berupa nomor JSON: 10. Setelah saya menghapus tanda kutip dari 10 di bagian akhir, ternyata berhasil.
albert c braun
2
@ vinbhai4u Apakah Anda mendapatkan jawabannya? Saya juga terjebak pada hal itu. Bagaimana cara mengirimkannya ke semua pengguna aplikasi?
Rohit
51

Ini berfungsi menggunakan 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 adalah pesan Anda untuk dikirim ke perangkat

$idadalah token pendaftaran perangkat

YOUR_KEY_HERE adalah Kunci API Server Anda (atau Kunci API Server Legacy)

Hamzah Malik
sumber
Firebase Console tidak menyimpan data dorongan pesan ke fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan
1
untuk mengirim pemberitahuan push ke browser dari mana saya bisa mendapatkan id pendaftaran perangkat?
Amit Joshi
ini berfungsi dengan baik tetapi, karena teks yang panjang saya dapatkan {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. Apa yang bisa dilakukan untuk memperbaikinya?
Alisha Lamichhane
@AlishaLamichhane Apakah pesan Anda lebih besar dari 4096 byte? Jika tidak, Anda dapat base64 menyandikan pesan Anda (mungkin ada yang salah dengan teks). Jika lebih besar dari 4096 byte ... yah, itu batas FCM.
Rik
47

Gunakan api layanan.

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

Jenis metode: POST

Tajuk:

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

Tubuh / Muatan:

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

Dan dengan ini di aplikasi Anda, Anda dapat menambahkan kode di bawah ini dalam aktivitas Anda untuk dipanggil:

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

Juga periksa jawabannya di Firebase onMessageReceived tidak dipanggil saat aplikasi di latar belakang

Ankit Adlakha
sumber
Baiklah, saya dapat mengirim ke id perangkat tertentu. Namun, saya tidak dapat mengirim ke semua. Apa yang harus saya letakkan "to" : "to_id(firebase refreshedToken)"sebagai ganti id perangkat? "all"tidak bekerja sama sekali. Saya menggunakan C # WebRequestuntuk mengirim notifikasi. @AshikurRahman saran Anda juga diterima. Saya berjuang dan mencari sejak 3-4 hari.
Ravimallya
3
Lupakan. Saya menemukan solusinya. ke: "/ topik / semua" akan mengirim pemberitahuan ke semua perangkat atau jika Anda ingin menargetkan hanya iOS ganti semua dengan ios dan untuk android, ganti dengan `android '. Ini adalah topik standar yang ditetapkan. Saya kira.
Ravimallya
developine.com/…
Developine
Baca blogpost ini untuk lebih jelasnya -> developine.com/...
Developine
@Ankit, Hai, bisakah Anda menentukan cara mendapatkan id perangkat target?
Anand Raj
40

Contohnya menggunakan curl

Kirim pesan ke perangkat tertentu

Untuk mengirim pesan ke perangkat tertentu, atur token registrasi untuk instance aplikasi tertentu

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

Kirim pesan ke topik

di sini topiknya adalah: / topik / 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

Kirim pesan ke grup perangkat

Mengirim pesan ke grup perangkat sangat mirip dengan mengirim pesan ke perangkat individual. Setel parameter to ke kunci notifikasi unik untuk grup perangkat

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

Contoh menggunakan API Layanan

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

Tajuk

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

Metode Permintaan: POST

Minta Badan

Pesan ke perangkat tertentu

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

Pesan ke topik

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

Pesan ke grup perangkat

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}
JR
sumber
Di mana Anda menemukan url titik akhir fcm.googleapis.com/fcm/send , tidak ada yang disebutkan di firebase doc?
Utsav Gupta
1
Anda dapat menemukannya di tautan ini firebase.google.com/docs/cloud-messaging/server
JR
@ JR Saya telah membuat aplikasi obrolan di mana ketika pengguna mengirim pesan ke penerima, penerima harus mendapatkan pesan pemberitahuan. Dalam hal ini, bagaimana saya bisa menggunakan jawaban Anda? Jadi apa yang harus saya berikan nilai untuk bidang "to"?
Anand Raj
@ Anad Raj merujuk "Kirim pesan ke perangkat tertentu" dalam jawaban saya
JR
25

Seperti disebutkan oleh Frank, Anda dapat menggunakan Firebase Cloud Messaging (FCM) HTTP API untuk memicu notifikasi push dari back-end Anda sendiri. Tapi kamu tidak akan bisa

  1. mengirim pemberitahuan ke Firebase User Identifier (UID) dan
  2. mengirim pemberitahuan ke segmen pengguna (menargetkan properti & acara seperti yang Anda bisa di konsol pengguna).

Artinya: Anda harus menyimpan sendiri id pendaftaran (push token) FCM / GCM atau menggunakan topik FCM untuk berlangganan pengguna. Perlu diingat juga bahwa FCM bukan API untuk Firebase Notification , ini adalah API tingkat rendah tanpa penjadwalan atau analitik tarif terbuka. Firebase Notification dibuat di atas FCM.

Antoine Guénard
sumber
6

Pertama, Anda perlu mendapatkan token dari Android dan kemudian Anda dapat memanggil kode php ini dan Anda bahkan dapat mengirim data untuk tindakan lebih lanjut di aplikasi Anda.

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

Pemberitahuan atau pesan data dapat dikirim ke server perpesanan cloud berbasis firebase menggunakan titik akhir API FCM HTTP v1. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Anda perlu membuat dan mengunduh kunci pribadi akun layanan menggunakan Firebase console dan menghasilkan kunci akses menggunakan pustaka klien google api. Gunakan pustaka http apa pun untuk mengirim pesan ke titik akhir di atas, kode di bawah ini menunjukkan pengiriman pesan menggunakan OkHTTP. Anda dapat menemukan kode sisi server dan sisi klien yang lengkap di firebase cloud messaging dan mengirim pesan ke banyak klien menggunakan contoh topik fcm

Jika pesan klien tertentu perlu dikirim, Anda perlu mendapatkan kunci registrasi firebase klien, lihat mengirim pesan khusus klien atau perangkat ke server FCM contoh

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
sumber
Teman saya, fcm.googleapis.com/v1/projects/zoftino-stores/messages:send tautan ini sepertinya sudah kadaluwarsa!
Naser Nikzad
1
Anda perlu menggunakan url proyek google Anda, bukan yang itu, ganti "zotino-stores" dengan nama proyek Anda
Arnav Rao
2

solusi dari tautan ini sangat membantu saya. Anda bisa memeriksanya.

File curl.php dengan baris instruksi tersebut dapat berfungsi.

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

Ingat 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 Sabar
sumber
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
sumber
0

Jika Anda ingin mengirim pemberitahuan push dari android, periksa posting blog saya

Kirim Notifikasi Dorong dari 1 ponsel android ke yang lain tanpa server.

mengirimkan pemberitahuan push tidak lain adalah permintaan pos ke https://fcm.googleapis.com/fcm/send

cuplikan kode menggunakan 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);

Saya sarankan Anda semua untuk melihat posting blog saya untuk rincian lengkap.

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

Menggunakan Firebase Console Anda dapat mengirim pesan ke semua pengguna berdasarkan paket aplikasi. Tetapi dengan CURL atau PHP API itu tidak mungkin.

Melalui API Anda dapat mengirim pemberitahuan ke ID perangkat tertentu atau pengguna yang berlangganan ke topik yang dipilih atau pengguna topik yang berlangganan.

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

Atau Anda dapat menggunakan fungsi cloud Firebase, yang bagi saya cara yang lebih mudah untuk mengimplementasikan pemberitahuan push Anda. firebase / fungsi-sampel

Laurent Maquet
sumber
0

Jika Anda menggunakan PHP, saya sarankan menggunakan PHP SDK untuk Firebase: Firebase Admin SDK . Untuk konfigurasi yang mudah, Anda dapat mengikuti langkah-langkah ini:

Dapatkan file json kredensial proyek dari Firebase ( Inisialisasi sdk ) dan sertakan dalam proyek Anda.

Instal SDK di proyek Anda. Saya menggunakan komposer:

composer require kreait/firebase-php ^4.35

Coba contoh apa saja dari sesi Perpesanan Awan dalam dokumentasi 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
sumber