Di entri blog "Memberi tahu pengguna dengan FCM" , kami berbagi panduan tentang penggunaan FCM di Android modern terkait dengan semua fitur manajemen daya. Berikutnya, mari kita lihat alur kerja umum dari pesan FCM -- pesan notifikasi dan pesan data, dan cara menangani pesan-pesan ini dalam kode Anda.

Pesan notifikasi

Saat mengirim notifikasi push ke pengguna, pesan notifikasi adalah metode yang disarankan jika Anda ingin memanfaatkan Firebase Console dan membiarkan sistem Android menangani postingan notifikasi. Pesan notifikasi secara default berprioritas tinggi, dan pesan FCM berprioritas tinggi akan tetap dikirimkan ke pengguna dengan segera bahkan ketika perangkat sedang tidak digunakan.
Saat menggunakan pesan notifikasi FCM, sistem menangani tampilan notifikasi atas nama aplikasi Anda saat berada di latar belakang. Ketika aplikasi Anda berada di latar depan, pesan notifikasi FCM dikirim ke pengendali onMessageReceived()dan Anda bisa menanganinya dengan memposting notifikasi bila diperlukan atau mengupdate konten aplikasi dengan data payload FCM (Maks 4KB) atau mengambil konten dari server aplikasi.

Alur kerja

Server Aplikasi mengirim pesan notifikasi (atau pesan notifikasi dengan payload data) kepada pengguna:

  1. Server aplikasi mengirim pesan notifikasi
    • Pesan notifikasi secara default berprioritas tinggi, dan bisa ditutup--pesan berikut akan menggantikan pesan saat ini jika pesan belum dikirimkan.
  2. Pesan FCM dikirim ke aplikasi klien
      Saat aplikasi Anda berada di Latar Depan
      • Developer harus menangani pesan notifikasi di pengendali.
      • Memposting notifikasi atau mengupdate konten aplikasi di callback FCM.
      Saat aplikasi Anda berada di Latar Belakang
      • Notifikasi dikirim ke Baki Sistem.
  3. Jika ada notifikasi yang diposting, pengguna bisa menge-tap notifikasi dan membuka aplikasi Anda. Kemudian Anda bisa menggunakan data dalam getIntent() untuk mengupdate konten aplikasi jika diperlukan.
Catatan: jika pengguna menolak notifikasi, data tidak akan dikirimkan saat aplikasi terbuka.

Contoh kode:

class SimpleFirebaseMessagingService : FirebaseMessagingService() {

   private val TAG = "spFirebaseMsgService"

   override fun onMessageReceived(remoteMessage: RemoteMessage) {

       // when App is in foreground, notification message:
       if (remoteMessage.notification != null) {
           // post notification if needed
           updateContent(remoteMessage.notification)
       }

       // process data payload
   }

   private fun updateContent(notification: RemoteMessage.Notification) {}

}
SimpleFirebaseMessagingService.kt

Pesan data

Anda harus menggunakan pesan data jika Anda perlu menangani notifikasi di aplikasi klien, apakah untuk menyesuaikan notifikasi atau mendekripsi data payload yang diterima.
Pesan data secara default berprioritas normal, yang berarti pesan ini akan di-batch ke jendela pemeliharaan berikutnya ketika perangkat dalam mode Istirahatkan, secara default.

Menangani Pesan

Saat mengirim pesan data, Anda harus menangani pesan dalam callback onMessageReceived() di aplikasi klien. Pendekatan yang disarankan dalam pengendali adalah sebagai berikut:
  1. Saat Anda perlu memberi tahu pengguna, posting notifikasi terlebih dahulu.
  2. Update konten aplikasi dengan data payload.
  3. Jika diperlukan, jadwalkan pekerjaan untuk mengambil data tambahan dari server aplikasi.

Alur kerja

Server Aplikasi mengirimkan pesan data untuk memberi tahu pengguna dengan pesan FCM yang dienkripsi menyeluruh:

  1. Server aplikasi mengirim pesan data ke server FCM
    • Pesan data harus mencakup semua data yang diperlukan untuk notifikasi di payload
  2. Saat pesan diterima di klien aplikasi FCM, Anda memiliki jendela* singkat untuk menangani pesan dan memposting notifikasi
    1. Tangani dekripsi payload dan notifikasi yang disesuaikan di callback onMessageReceived() , kemudian segera posting notifikasi kepada pengguna
      • Perhatikan bahwa FCM TIDAK menjamin urutan penyampaian. Developer harus menanganinya ketika pesan dikirim tidak berurutan; ketika Anda mengirim pesan yang tidak bisa ditutup, Anda dapat terus melacak urutannya dengan ID urutan pesan, dan menunda memberi tahu pengguna sampai semua pesan diterima atau Anda berhenti menunggu bila TTL pesan sebelumnya telah kedaluwarsa.
    2. Gunakan data payload untuk mengupdate konten klien dan menyimpan data secara lokal
    3. Jika Anda membutuhkan data tambahan yang melebihi batas payload FCM 4KB, jadwalkan tugas atau gunakan WorkManager untuk mengambil data tetapi jangan blokir tampilan notifikasi awal mengenai hal ini.
      • WorkManager disarankan bila stabil
      • Gunakan JobScheduler
    4. Jika Anda perlu mengupdate notifikasi dengan data yang diambil, update notifikasi bila ia masih aktif
  3. Pengguna membuka aplikasi
    • Jika konten aplikasi bukan yang terbaru, periksa apakah pekerjaan yang dijadwalkan di 2.3 sudah selesai, dan update konten aplikasi Anda dengan sesuai.
Catatan: Perlu diingat bahwa pengendali FCM hanya memiliki waktu sekitar 20 detik setelah pesan diterima, karena ia dirancang untuk menyelesaikan tugas singkat seperti memposting notifikasi. Jika Anda perlu memproses lebih lama dari jendela ini, kami sarankan penjadwalan tugas atau gunakan WorkManager API.

Contoh kode:

class SimpleFirebaseMessagingService : FirebaseMessagingService() {

   private val TAG = "spFirebaseMsgService"

   override fun onMessageReceived(remoteMessage: RemoteMessage) {

       // Use data payload to create a notification
       if (remoteMessage.data.isNotEmpty()) {

           // step 2.1: decrypt payload
           val notificationMessage = decryptPayload(remoteMessage.data)
           // step 2.1: display notification immediately
           sendNotification(notificationMessage)
           // step 2.2: update app content with payload data
           updateContent(remoteMessage.data)

           // Optional step 2.3: if needed, fetch data from app server
           /* if additional data is needed or payload is bigger than 4KB, App server can send a flag to notify client*/
           if (remoteMessage.data["url"] != null) {
               scheduleJob()
               // use WorkManager when it's stable
           }
       }
       // process notification payload when app in foreground...
   }

   private fun decryptPayload(dataPayload: Map<String, String>): String {
       return "decrypted message"
   }

   private fun sendNotification(notificationMessage: String) {}
   private fun updateContent(dataPayload: Map<String, String>) {}
   private fun scheduleWork() {
       // it's recommended to use WorkManager when it's stable, use JobScheduler
       // on background work complete, update the notification if still active
   }
}
SimpleFirebaseMessagingService.kt

FCM di Android modern

Android memperkenalkan banyak fitur penyempurnaan daya dalam versi terbaru, jadi pastikan Anda meninjau dan menguji kasus penggunaan FCM Anda terhadap fitur-fitur ini. Anda bisa mempelajari lebih lanjut tentang fitur manajemen Daya Android dan cara kerjanya dengan FCM dari entri blog ini.
Jika Anda belum menggunakan FCM, saatnya untuk melakukan upgrade. Library C2DM secara resmi tidak digunakan lagi pada tahun 2012 dan ditutup sepenuhnya pada tahun 2015, membuatnya tidak lagi kompatibel dengan Android modern. Kami juga mengumumkan pada bulan April 2018 bahwa server Google Cloud Messaging (GCM) dan API klien sudah tidak digunakan lagi dan akan dihapus segera setelah 11 April 2019. Anda bisa mengetahui selengkapnya tentang pengumuman dan panduan migrasi dalam entri blog ini.
Untuk memanfaatkan semua fitur dan fungsionalitas baru yang disediakan FCM dan Android, kami merekomendasikan penggunaan FCM hari ini. Untuk memulai, kunjungi dokumentasi Firebase Cloud Messaging.