Mengirim pesan ke beberapa perangkat

Firebase Cloud Messaging menyediakan 2 cara untuk menargetkan pesan ke beberapa perangkat:

  • Messaging topik dapat digunakan untuk mengirim pesan ke beberapa perangkat yang mengikuti topik tertentu.
  • Messaging grup perangkat memungkinkan Anda mengirim pesan ke beberapa perangkat yang merupakan bagian dari grup yang Anda tetapkan.

Tutorial ini berfokus pada pengiriman pesan topik dari server aplikasi Anda yang menggunakan protokol HTTP atau XMPP untuk FCM, dan menerima serta menanganinya dalam aplikasi Android. Kita akan membahas penanganan pesan untuk aplikasi yang dijalankan di latar belakang dan latar depan. Kita akan membahas semua langkah untuk mencapai hal ini, mulai dari penyiapan sampai verifikasi.

Menyiapkan SDK

Bagian ini membahas langkah-langkah yang mungkin sudah diselesaikan jika Anda telah menyiapkan aplikasi klien Android untuk FCM, atau telah menyelesaikan langkah-langkah untuk Mengirim Pesan Pertama.

Prasyarat

  • Perangkat yang menjalankan:
    • Android 4.1 (API level 16, Jelly Bean) atau yang lebih baru
    • Layanan Google Play 15.0.0 atau yang lebih baru
  • Android Studio versi terbaru

Jika belum memiliki project Android Studio, Anda bisa mendownload salah satu contoh quickstart, jika hanya ingin mencoba fitur Firebase. Jika Anda menggunakan panduan mulai cepat, ingatlah untuk mendapatkan ID aplikasi dari file build.gradle dalam folder modul project (biasanya app/), karena nama paket tersebut akan diperlukan dalam langkah berikutnya.

Menambahkan Firebase ke aplikasi

Waktunya menambahkan Firebase ke aplikasi Anda. Untuk melakukannya, Anda memerlukan project Firebase dan file konfigurasi Firebase untuk aplikasi Anda.

Untuk membuat project Firebase:

  1. Buka Firebase console.

  2. Klik Tambahkan project, lalu pilih atau masukkan Nama project.

    • Jika Anda memiliki project Google yang terkait dengan aplikasi Anda, pilih project tersebut dari menu dropdown Nama project.
    • Jika Anda belum memiliki project Google, masukkan Nama project baru.
  3. (Opsional) Edit Project ID.

    Firebase menetapkan ID unik ke project Firebase Anda secara otomatis. ID ini ditampilkan di layanan Firebase yang tersedia untuk publik, misalnya:

    • URL Realtime Database default — your-project-id.firebaseio.com
    • Nama bucket Cloud Storage default — your-project-id.appspot.com
    • Subdomain Hosting default — your-project-id.firebaseapp.com
  4. Ikuti langkah-langkah penyiapan yang tersisa di Firebase console, lalu klik Buat project (atau Tambahkan Firebase, jika Anda menggunakan project Google yang sudah ada).

Firebase menyediakan resource untuk project Firebase Anda secara otomatis. Proses ini biasanya perlu waktu beberapa menit. Setelah selesai, Anda akan dibawa ke halaman ringkasan untuk project Firebase Anda di Firebase console.

Setelah memiliki project, Anda dapat menambahkan aplikasi Android ke dalamnya:

  1. Klik Tambahkan Firebase ke aplikasi Android dan ikuti langkah-langkah penyiapannya. Jika Anda mengimpor project Google yang sudah ada, prosesnya dapat terjadi secara otomatis dan Anda dapat langsung mendownload file konfigurasi.

  2. Saat diminta, masukkan nama paket aplikasi Anda. Anda harus memasukkan nama paket yang digunakan oleh aplikasi Anda, yang hanya dapat dilakukan jika aplikasi tersebut ditambahkan ke project Firebase Anda.

  3. Tambahkan file konfigurasi Android Firebase ke aplikasi Anda:

    1. Klik Download google-services.json untuk mendapatkan file konfigurasi Android Firebase Anda (google-services.json).

      Anda dapat mendownload file konfigurasi Android Firebase lagi kapan saja.

    2. Pindahkan file konfigurasi Anda ke direktori yang sama dengan file build.gradle tingkat root Anda.

  4. Setelah Anda menambahkan kode inisialisasi, jalankan aplikasi untuk mengirimkan verifikasi ke Firebase console bahwa Anda telah berhasil menginstal Firebase.

Menambahkan SDK

Jika ingin mengintegrasikan pustaka Firebase ke dalam salah satu project, Anda perlu melakukan beberapa tugas dasar untuk menyiapkan project Android Studio. Anda mungkin sudah melakukan ini saat menambahkan Firebase ke aplikasi Anda.

Pertama, tambahkan aturan ke file build.gradle tingkat root Anda untuk menyertakan plugin layanan google dan repositori Maven Google:

buildscript {
    // ...
    dependencies {
        // ...
        classpath 'com.google.gms:google-services:4.2.0' // google-services plugin
    }
}

allprojects {
    // ...
    repositories {
        google() // Google's Maven repository
        // ...
    }
}

Kemudian, di file Gradle modul Anda (biasanya app/build.gradle), tambahkan baris apply plugin di bagian bawah file untuk mengaktifkan plugin Gradle:

apply plugin: 'com.android.application'

android {
  // ...
}

dependencies {
  // ...
  implementation 'com.google.firebase:firebase-core:16.0.7'
  implementation 'com.google.firebase:firebase-messaging:17.3.4'
  // Getting a "Could not find" error? Make sure you have
  // added the Google maven respository to your root build.gradle
}

// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

Anda juga harus menambahkan dependensi untuk Firebase SDK yang ingin digunakan. Sebaiknya mulai dengan com.google.firebase:firebase-core, yang menyediakan fungsionalitas Google Analytics for Firebase. Lihat daftar library yang tersedia.

Membuat aplikasi klien berlangganan topik

Aplikasi klien dapat berlangganan ke topik yang ada atau membuat topik baru. Apabila aplikasi klien berlangganan nama topik baru (yang belum ada untuk project Firebase Anda), topik baru untuk nama tersebut dibuat di FCM dan setelahnya klien dapat berlangganan.

Untuk berlangganan topik, aplikasi klien memanggil subscribeToTopic() Firebase Cloud Messaging dengan nama topik FCM. Metode ini menampilkan Task, yang dapat digunakan oleh listener penyelesaian untuk menentukan apakah langganan berhasil atau tidak:

Java
Android

FirebaseMessaging.getInstance().subscribeToTopic("weather")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                String msg = getString(R.string.msg_subscribed);
                if (!task.isSuccessful()) {
                    msg = getString(R.string.msg_subscribe_failed);
                }
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Kotlin
Android

FirebaseMessaging.getInstance().subscribeToTopic("weather")
        .addOnCompleteListener { task ->
            var msg = getString(R.string.msg_subscribed)
            if (!task.isSuccessful) {
                msg = getString(R.string.msg_subscribe_failed)
            }
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        }

Untuk berhenti berlangganan, aplikasi klien akan memanggil unsubscribeFromTopic() Firebase Cloud Messaging dengan nama topik.

Menerima dan menangani pesan topik

FCM mengirim pesan topik dengan cara yang sama seperti pesan downstream lainnya.

Untuk menerima pesan, gunakan layanan yang menyediakan FirebaseMessagingService. Layanan Anda harus mengganti callback onMessageReceived dan onDeletedMessages. Layanan Anda harus memproses pesan dalam waktu 20 detik sejak penerimaan (10 detik di Android Marshmallow). Rentang waktu mungkin lebih singkat bergantung pada penundaan OS yang terjadi sebelum panggilan onMessageReceived. Setelah itu, berbagai perilaku OS seperti batas eksekusi latar belakang Android O dapat mengganggu kemampuan Anda untuk menyelesaikan pekerjaan Anda. Untuk mengetahui informasi lebih lanjut, lihat ringkasan kami tentang prioritas pesan.

onMessageReceived disediakan untuk sebagian besar tipe pesan dengan pengecualian berikut:

  • Pesan notification dikirim saat aplikasi berada di latar belakang. Dalam hal ini, notification dikirimkan ke baki sistem perangkat. Tap notification oleh pengguna akan membuka peluncur aplikasi secara default.

  • Pesan dengan notification dan payload data, saat diterima di latar belakang. Dalam hal ini, notification dikirimkan ke baki sistem perangkat, dan payload data dikirimkan di bagian tambahan dari intent Activity peluncur.

Rangkuman:

Status Aplikasi Notification Data Keduanya
Latar depan onMessageReceived onMessageReceived onMessageReceived
Latar Belakang Baki sistem onMessageReceived Notifikasi: baki sistem
Data: di bagian tambahan dari intent.
Untuk informasi lebih lanjut tentang jenis pesan, lihat Notification dan pesan data.

Mengedit manifes aplikasi

Untuk menggunakan FirebaseMessagingService, Anda perlu menambahkan hal berikut dalam manifes aplikasi Anda:

<service android:name=".java.MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Anda sebaiknya juga mengatur nilai default untuk menyesuaikan tampilan notification. Anda dapat menentukan ikon dan warna default kustom yang diterapkan setiap kali nilai setara tidak ditetapkan dalam payload notification.

Tambahkan baris ini ke dalam tag application untuk menetapkan ikon default khusus dan warna khusus.

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android menampilkan ikon default kustom untuk

  • Semua pesan notification yang dikirim dari penulis Notifications.
  • Pesan notification yang tidak secara eksplisit menetapkan ikon dalam payload notification.

Android menggunakan warna default kustom untuk

  • Semua pesan notification dikirim dari penulis Notifications.
  • Pesan notification yang tidak secara eksplisit menetapkan warna dalam payload notification.

Jika tidak ada ikon default kustom yang ditetapkan dan tidak ada ikon yang ditetapkan dalam payload notification, Android akan menampilkan ikon aplikasi dengan warna putih.

Mengganti onMessageReceived

Dengan mengganti metode FirebaseMessagingService.onMessageReceived, Anda dapat melakukan tindakan berdasarkan objek RemoteMessage yang diterima dan mendapatkan data pesan:

Java
Android

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Kotlin
Android

override fun onMessageReceived(remoteMessage: RemoteMessage?) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage?.from}")

    // Check if message contains a data payload.
    remoteMessage?.data?.isNotEmpty()?.let {
        Log.d(TAG, "Message data payload: " + remoteMessage.data)

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage?.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Mengganti onDeletedMessages

Dalam beberapa situasi, FCM mungkin tidak mengirimkan pesan. Hal ini terjadi jika ada terlalu banyak pesan (> 100) yang tertunda untuk aplikasi Anda pada perangkat tertentu saat terhubung atau jika perangkat belum terhubung ke FCM lebih dari 1 bulan. Dalam hal ini, Anda mungkin akan menerima callback ke FirebaseMessagingService.onDeletedMessages() Saat menerima callback ini, instance aplikasi harus melakukan sinkronisasi penuh dengan server aplikasi. Jika Anda belum mengirim pesan ke aplikasi pada perangkat tersebut dalam 4 minggu terakhir, FCM tidak akan memanggil onDeletedMessages().

Menangani pesan notification dalam aplikasi latar belakang

Ketika aplikasi Anda berada di latar belakang, Android akan mengarahkan pesan notification ke baki sistem. Tap notification oleh pengguna akan membuka peluncur aplikasi secara default.

Pesan ini termasuk pesan yang berisi payload notification dan payload data (dan semua pesan yang dikirim dari Notifications console). Dalam hal ini, notifikasi dikirim ke baki sistem perangkat dan payload data dikirim di bagian tambahan dari intent Aktivitas peluncur.

Untuk insight tentang pengiriman pesan ke aplikasi Anda, lihat dasbor pelaporan FCM, yang mencatat jumlah pesan yang dikirim dan dibuka di perangkat iOS dan Android, beserta data untuk "tayangan" (notifikasi yang dilihat oleh pengguna) untuk aplikasi Android.

Aplikasi yang Dibatasi Latar Belakang (Android P atau yang lebih baru)

Mulai Januari 2019, FCM tidak akan mengirim pesan ke aplikasi yang dimasukkan ke pembatasan latar belakang oleh pengguna (seperti melalui: Setelan -> Aplikasi dan Notifikasi -> [appname] -> Baterai). Setelah aplikasi Anda dihapus dari pembatasan latar belakang, pesan baru ke aplikasi akan dikirimkan seperti sebelumnya. Untuk mencegah pesan yang hilang dan dampak pembatasan latar belakang lainnya, pastikan untuk menghindari perilaku buruk yang dicantumkan oleh upaya Android vitals. Perilaku ini dapat menyebabkan perangkat Android merekomendasikan kepada pengguna untuk menerapkan pembatasan latar belakang pada aplikasi. Aplikasi Anda dapat memeriksa apakah ia dibatasi latar belakang atau tidak menggunakan: isBackgroundRestricted()

Membuat permintaan kirim

Mengirim pesan ke topik Firebase Cloud Messaging serupa dengan mengirim pesan ke perangkat individual atau ke grup pengguna. Server aplikasi menetapkan kunci to dengan nilai seperti /topics/yourTopic. Developer bisa memilih nama topik apa pun yang cocok dengan ekspresi reguler: "/topics/[a-zA-Z0-9-_.~%]+".

Untuk mengirim ke kombinasi beberapa topik, server aplikasi harus menetapkan kunci condition (bukan kunci to) ke condition boolean yang menentukan topik target. Misalnya, untuk mengirimkan pesan ke perangkat yang berlangganan TopicA dan salah satu dari TopicB atau TopicC:

'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)

FCM mengevaluasi terlebih dahulu setiap kondisi di dalam tanda kurung, lalu mengevaluasi ekspresi tersebut dari kiri ke kanan. Pada ekspresi di atas, pengguna yang berlangganan satu topik apa pun tidak akan menerima pesan. Demikian pula, pengguna yang tidak berlangganan TopicA tidak akan menerima pesan. Namun, kombinasi berikut akan menerima pesan:

  • TopicA dan TopicB
  • TopicA dan TopicC

Anda dapat menyertakan hingga lima topik dalam ekspresi bersyarat. Penggunaan tanda kurung didukung. Operator yang didukung: &&, ||, !. Perhatikan penggunaan untuk !:

!('TopicA' in topics)

Dengan menggunakan ekspresi ini, setiap instance aplikasi yang tidak berlangganan TopicA, termasuk instance aplikasi yang tidak berlangganan topik mana pun, akan menerima pesan.

Untuk mengetahui detail lebih lanjut mengenai kunci server aplikasi, lihat informasi referensi untuk protokol server koneksi pilihan Anda, HTTP atau XMPP. Contoh di halaman ini menunjukkan cara mengirim pesan ke topik, baik pada HTTP maupun XMPP.

Permintaan HTTP POST topik

Mengirim ke satu topik:

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

Mengirim ke perangkat yang berlangganan topik "dogs" atau "cats":

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{
  "condition": "'dogs' in topics || 'cats' in topics",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

Respons HTTP topik

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

Pesan XMPP topik

Mengirim ke satu topik:

<message id="">
  <gcm xmlns="google:mobile:data">
{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

  </gcm>
</message>

Mengirim ke perangkat yang berlangganan topik "dogs" atau "cats":

<message id="">
  <gcm xmlns="google:mobile:data">
{
  "condition": "'dogs' in topics || 'cats' in topics",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

  </gcm>
</message>

Respons XMPP topik

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

Perkirakan penundaan hingga 30 detik sebelum Server FCM menampilkan respons berhasil atau gagal untuk permintaan pengiriman topik. Karena itu, pastikan menyetel nilai waktu tunggu server aplikasi pada permintaan.

Untuk mengetahui daftar lengkap opsi pesan, baca informasi referensi untuk protokol server koneksi pilihan Anda, HTTP atau XMPP.

Langkah berikutnya

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.