Menerima pesan menggunakan Firebase Cloud Messaging

Panduan ini menjelaskan cara menyiapkan Firebase Cloud Messaging di aplikasi klien seluler dan web Anda sehingga Anda dapat menerima pesan dengan andal.

Untuk menerima pesan, Anda dapat menggunakan layanan yang menyediakan FirebaseMessagingService. Layanan Anda harus mengganti callback onMessageReceived dan onDeletedMessages. Untuk mengetahui contoh lengkapnya, lihat contoh panduan memulai Firebase Cloud Messaging.

onMessageReceived disediakan untuk sebagian besar jenis pesan, dengan pengecualian berikut:

  • Pesan notifikasi yang dikirim saat aplikasi berada di latar belakang. Dalam hal ini, notifikasi dikirimkan ke area notifikasi perangkat. Ketika pengguna mengetuk notifikasi, peluncur aplikasi akan terbuka secara default.

  • Pesan dengan notifikasi dan payload data, saat diterima di latar belakang. Dalam hal ini, notifikasi dikirim ke area notifikasi perangkat, dan payload data dikirim di bagian tambahan dari intent Aktivitas peluncur.

Rangkuman:

Status aplikasi Notifikasi Data Keduanya
Latar depan onMessageReceived onMessageReceived onMessageReceived
Latar belakang Baki sistem onMessageReceived Notifikasi: area notifikasi Data: di bagian tambahan intent.

Untuk mengetahui informasi lebih lanjut tentang jenis pesan, lihat Notifikasi dan pesan data.

Callback onMessageReceived memiliki jangka waktu eksekusi yang singkat. Banyak faktor yang dapat memengaruhi lamanya jangka waktu ini, termasuk penundaan OS, waktu startup aplikasi, pemblokiran thread utama oleh operasi lain, atau panggilan onMessageReceived sebelumnya yang memerlukan waktu terlalu lama.

Oleh karena itu, sebaiknya hindari tugas yang berjalan lama (seperti mengambil gambar dari server untuk ditampilkan dalam notifikasi) di onMessageReceived. Sebagai gantinya, jadwalkan tugas menggunakan WorkManager untuk menangani tugas apa pun yang waktu penyelesaiannya mungkin memerlukan lebih dari beberapa detik. Untuk mengetahui informasi selengkapnya tentang prioritas pesan serta pengaruhnya terhadap pemrosesan, lihat Pemrosesan pesan untuk pesan berprioritas tinggi dan normal.

Mengedit manifes aplikasi

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

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

Sebaiknya tetapkan nilai default untuk menyesuaikan tampilan notifikasi. Anda dapat menentukan ikon dan warna default kustom yang diterapkan setiap kali nilai yang setara tidak ditetapkan dalam payload notifikasi.

Tambahkan baris berikut di dalam tag application untuk menetapkan ikon default kustom dan warna kustom:

<!-- 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 dan menggunakan ikon default kustom untuk

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

Jika ikon default kustom tidak ditetapkan dan ikon tidak ditetapkan dalam payload notifikasi, 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:

Kotlin

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.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        // Check if data needs to be processed by long running job
        if (needsToBeScheduled()) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            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.
}

Java

@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 WorkManager.
            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.
}

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 tidak terhubung ke FCM selama lebih dari satu bulan. Dalam kasus 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 notifikasi dalam aplikasi di latar belakang

Ketika aplikasi Anda berada di latar belakang, Android akan mengarahkan pesan notifikasi ke area notifikasi. Ketika pengguna mengetuk notifikasi, peluncur aplikasi akan terbuka secara default.

Hal ini termasuk pesan yang berisi notifikasi dan payload data (dan semua pesan yang dikirim dari konsol Notifications). Dalam hal ini, notifikasi dikirim ke area notifikasi perangkat dan payload data dikirim di bagian tambahan dari intent Aktivitas peluncur.

Untuk mengetahui informasi selengkapnya tentang pengiriman pesan ke aplikasi Anda, lihat dasbor pelaporan FCM, yang mencatat jumlah pesan yang terkirim dan dibuka di perangkat Android dan Apple, beserta data terkait "tayangan" (notifikasi yang dilihat oleh pengguna) untuk aplikasi Android.