Firebase Cloud Messaging

**Firebase Cloud Messaging** biasa disebut FCM, sebelumnya dikenal sebagai Google Cloud Messaging (GCM), merupakan solusi dari cloud lintas platform untuk pesan dan layanan pemberitahuan untuk Android, iOS, dan aplikasi web, yang saat ini dapat digunakan tanpa biaya.
Layanan Firebase Cloud Messaging ini disediakan oleh Firebase, yang merupakan anak perusahaan dari Google. Pada tanggal 21 Oktober 2014, Firebase mengumumkan telah diakuisisi oleh Google untuk jumlah yang tidak diungkapkan. Situs web Google Cloud Messaging resmi menunjuk ke Firebase Cloud Messaging (Firebase Cloud Messaging) sebagai versi baru Google Cloud Messaging (GCM).
Pihak Google menyarankan untuk aplikasi yang masih menggunakan Google Cloud Messaging untuk segera migrasi ke Firebase Cloud Messaging. Fitur-fitur yang diberikan oleh Firebase Cloud Messaging sebenarnya tidak terlalu jauh berbeda dengan Google Cloud Messaging. Dengan Firebase Cloud Messaging kita bisa memberikan pemberitahuan dan membuat komunikasi dua arah antara perangkat. Teknologi yang digunakan terbagi menjadi dua yaitu:

* XMPP (Extensible Messaging and Presence Protocol)
* HTTP (Hypertext Transfer Protocol).
Untuk XMPP harus membangun server XMPP terlebih dahulu, sedangkan untuk HTTP bisa menggunakan console yang disediakan oleh Firebase.

## Kemampuan Utama Firebase Cloud Messaging

* Mengirim pesan notification atau pesan data: Mengirim pesan notification yang ditampilkan kepada pengguna. Atau mengirim pesan data dan menentukan sepenuhnya apa yang terjadi dalam kode aplikasi.
* Penargetan pesan serbaguna: Mendistribusikan pesan ke aplikasi klien dengan salah satu dari 3 cara — ke satu perangkat, ke grup perangkat, atau ke perangkat yang berlangganan topik.
* Mengirim pesan dari aplikasi klien: Mengirim notification, chat, dan pesan lain dari perangkat ke server melalui saluran koneksi FCM yang andal dan hemat baterai.

## Pesan Firebase Cloud Messaging
Firebase Cloud Messaging (FCM) menawarkan beragam kemampuan dan opsi pengiriman pesan. Informasi ini dimaksudkan untuk membantu dalam memahami berbagai jenis pesan dari Firebase Cloud Messaging, serta apa yang dapat dilakukan dengan jenis pesan tersebut.

### Jenis Pesan Firebase Cloud Messaging

#### Pesan notifikasi
Pesan notifikasi, terkadang dianggap sebagai "pesan tampilan". Pesan ini ditangani oleh Firebase Cloud Messaging SDK secara otomatis. Pesan notifikasi memiliki serangkaian kunci bawaan yang terlihat oleh pengguna. Pesan notifikasi bisa berisi data payload opsional untuk pasangan kunci-nilai kustom. Skenario penggunaan dalam pesan notifikasi yaitu Firebase Cloud Messaging secara otomatis menampilkan pesan ke perangkat pengguna akhir atas nama aplikasi klien.
Cara mengirim pesan notifikasi
* Dalam lingkungan tepercaya, seperti Cloud Functions atau server aplikasi, gunakan Admin SDK atau Protokol Server Firebase Cloud Messaging
* Gunakan Notifications composer

#### Pesan data
Pesan data, yang ditangani oleh aplikasi klien. pesan data hanya memuat key-value pair kustom buatan pengguna. Skenario penggunaan dalam pesan data, aplikasi klien bertanggung jawab memproses pesan data.
Cara mengirim pesan notifikasi:
Dalam lingkungan tepercaya, seperti Cloud Functions atau server aplikasi pengguna, gunakan Admin SDK atau Protokol Server Firebase Cloud Messaging: Setel kunci data saja.

### Opsi pengiriman pesan
Firebase Cloud Messaging menyediakan sekumpulan opsi pengiriman khusus untuk pesan yang dikirim ke perangkat Android, dan memungkinkan opsi serupa di iOS dan web. Perilaku pesan yang "dapat diperkecil" didukung di perangkat Android melalui collapse_key Firebase Cloud Messaging, di iOS melalui apns-collapse-id, dan di JavaScript/Web melalui Topic.

#### Pesan yang tidak dapat diperkecil
Pesan yang tidak dapat diperkecil menunjukkan bahwa setiap pesan dikirimkan ke perangkat. Pesan yang tidak dapat diperkecil mengirimkan beberapa konten berguna, bukan pesan yang dapat diperkecil seperti "ping" konten bebas, ke aplikasi seluler untuk menghubungi server agar mengambil data. Untuk Android, ada batas 100 pesan yang bisa disimpan tanpa diperkecil. Jika batas ini tercapai, semua pesan yang disimpan akan dihapus. Saat kembali daring, perangkat akan menerima pesan khusus yang memberitahukan bahwa batas telah tercapai. Selanjutnya, aplikasi bisa menangani situasi ini dengan tepat, umumnya dengan meminta sinkronisasi penuh dari server aplikasi. Skenario penggunaan dalam pesan yang tidak dapat diperkecil yaitu setiap pesan penting bagi aplikasi klien dan harus dikirimkan. Kecuali untuk pesan notifikasi, semua pesan tidak dapat diperkecil secara default.

#### Pesan yang dapat diperkecil
Pesan yang dapat diperkecil adalah pesan yang dapat diganti dengan pesan baru jika pesan tersebut belum dikirimkan ke perangkat. Kasus penggunaan umum dalam pesan yang dapat diperkeciladalah pesan digunakan untuk memberi tahu aplikasi seluler untuk menyinkronkan data dari server karena hanya pesan terbaru yang dianggap relevan.

Untuk menandai pesan sebagai pesan yang dapat diperkecil di Android, pengguna dapat menyertakan parameter collapse_key dalam payload pesan. Firebase Cloud Messaging mendukung maksimal 4 kunci perkecil berbeda dari beberapa perangkat Android yang akan digunakan oleh server aplikasi pada waktu yang ditentukan. Dengan kata lain, server Firebase Cloud Messaging dapat menyimpan 4 pesan berbeda yang bisa diperkecil per perangkat secara bersamaan, masing-masing dengan kunci perkecil yang berbeda. Jika melampaui angka ini, Firebase Cloud Messaging hanya akan menyimpan 4 kunci perkecil, tanpa jaminan kunci mana yang akan disimpan.

### Prioritas Pesan Firebase Cloud Messaging
Prioritas Pesan Firebase Cloud Messaging memiliki 2 opsi untuk menetapkan prioritas pengiriman ke pesan downstream di Android: prioritas normal dan tinggi. Pengiriman pesan berprioritas normal dan tinggi berfungsi sebagai berikut 

* **Prioritas normal** Ini adalah prioritas awal untuk pesan data. Pesan berprioritas normal segera dikirim saat aplikasi berjalan di depan latar . Saat perangkat sedang dalam kondisi istirahat atau aplikasi dalam kondisi aplikasi siaga, pengiriman mungkin ditunda untuk menghemat baterai. Untuk pesan yang tidak mendesak dari segi waktu, misalnya pemberitahuan email baru, selalu menyinkronkan antarmuka pengguna, atau menyinkronkan data aplikasi di latar belakang, pilihlah prioritas pengiriman normal.
Saat menerima pesan berprioritas normal di Android yang meminta sinkronisasi latar belakang data untuk aplikasi, pengguna harus menjadwalkan tugas FJD atau JobIntentService untuk menanganinya saat jaringan tersedia.

* **Prioritas tinggi** Firebase Cloud Messaging berusaha segera mungkin untuk mengirimkan pesan berprioritas tinggi, yang membuat layanan Firebase Cloud Messaging dapat membangunkan perangkat yang sedang tertidur jika diperlukan, dan menjalankan beberapa pemrosesan terbatas (termasuk akses jaringan yang sangat terbatas). Pesan berprioritas tinggi umumnya menimbulkan interaksi pengguna dengan aplikasi. Jika Firebase Cloud Messaging mendeteksi pola yang tidak ada, pesan mungkin tidak diprioritaskan.
Karena sebagian kecil populasi seluler Android menggunakan jaringan latensi tinggi, jangan buka koneksi ke server sebelum menampilkan pemberitahuan. Memanggil kembali server sebelum waktu akhir pemrosesan yang diizinkan dapat berisiko bagi pengguna pada jaringan latensi tinggi. Atau, sertakan konten pemberitahuan dalam pesan Firebase Cloud Messaging yang segera tampilkan. Jika harus menyinkronkan tambahan konten dalam aplikasi di Android, pengguna dapat menjadwalkan tugas FJD atau JobIntentService untuk menanganinya di latar belakang.

### Menetapkan Masa Aktif Pesan Firebase Cloud Messaging
Firebase Cloud Messaging biasanya segera mengirimkan pesan setelah pesan dikirim. Namun, hal tersebut terkadang tidak memungkinkan untuk dilakukan. Jika platformnya adalah Android, perangkat akan dimatikan, luring, atau tidak tersedia. Firebase Cloud Messaging sengaja menunda pesan agar aplikasi tidak menggunakan sumber secara berlebihan dan berpengaruh negatif pada masa pakai baterai.
Jika ini terjadi, Firebase Cloud Messaging akan menyimpan pesan dan mengirimkannya segera setelah kondisinya memungkinkan. Meskipun dalam kebanyakan kasus hal ini tidak apa-apa, karena ada beberapa aplikasi yang tidak mengizinkan keterlambatan pengiriman pesan. Misalnya, untuk pemberitahuan panggilan masuk atau video obrolan, pesan hanya berguna untuk periode waktu yang singkat sebelum panggilan tersebut diakhiri.
Di Android dan Web/JavaScript, dapat menentukan masa aktif maksimum suatu pesan. Nilainya harus berupa durasi dari 0 hingga 2.419.200 detik (28 hari), dan sama dengan periode waktu maksimum bagi Firebase Cloud Messaging untuk menyimpan dan mencoba mengirimkan pesan.

Berikut adalah beberapa kemungkinan penggunaan fitur ini:
* Panggilan masuk video obrolan
* Acara undangan yang akan segera berakhir waktunya
* Acara kalender

Keuntungan lain dari penetapan masa aktif pesan adalah Firebase Cloud Messaging tidak akan pernah menahan pesan yang memiliki nilai waktu aktif selama 0 detik. Dengan kata lain, Firebase Cloud Messaging menjamin upaya terbaik untuk pesan yang harus dikirimkan "sekarang atau tidak sama sekali". Perlu diingat bahwa nilai waktu untuk hidup 0 berarti pesan yang tidak dapat segera dikirimkan akan dihapus. Namun, karena pesan seperti itu tidak pernah disimpan, hal ini memberikan latensi terbaik untuk mengirim pesan notifikasi.

### Port Firebase Cloud Messaging dan Firewall
Jika pengguna memiliki tembok api untuk membatasi lalu lintas dari Internet, pengguna harus mengkonfigurasinya agar perangkat seluler dapat terhubung dengan Firebase Cloud Messaging dan perangkat di jaringan dapat menerima pesan. Firebase Cloud Messaging biasanya menggunakan port 5228, tetapi terkadang menggunakan 5229 dan 5230.
Untuk koneksi keluar, Firebase Cloud Messaging tidak memberikan IP khusus karena rentang IP terlalu sering berubah dan aturan firewall mungkin sudah tidak berlaku, sehingga memengaruhi pengalaman pengguna. Idealnya, pengguna akan memberikan akses ke port 5228-5230 tanpa pembatasan IP. Namun, jika pengguna harus memiliki pembatasan Protokol Internet, pengguna harus memberikan akses ke semua alamat IP dalam blok IPv4 dan IPv6 yang tercantum di ASN 15169 Google. Pengguna harus memperbarui aturan setiap bulan. Masalah yang disebabkan karena pembatasan IP firewall biasanya menghilang dan timbul lagi serta sulit didiagnosis.

**Port yang harus dibuka untuk pesan masuk:**
* 5228
* 5229
* 5230

**Port untuk mengizinkan koneksi keluar:**
* Tidak ada pembatasan Protokol Internet
* Semua alamat Protokol Internet yang ada dalam blok Protokol Internet yang tercantum di ASN 15169 Google. Jangan lupa untuk memperbaruinya paling rendah sebulan sekali.

**Firewall Network Address Translation dan/atau Stateful Packet Inspection:**
Jika jaringan pengguna menerapkan Network Address Translation (NAT) atau Stateful Packet Inspection (SPI), waktu penerapan tunggu 30 menit atau lebih untuk koneksi melalui port 5228-5230. Dengan begitu, pengembang dapat menyediakan konektivitas yang andal sekaligus mengurangi konsumsi baterai perangkat seluler pengguna.

## Referensi

## Pranala luar
* Firebase Cloud Messaging - official website 
* Google Cloud Messaging - official website 
* GCM and FIREBASE CLOUD MESSAGING Frequently Asked Questions 
* How to Configure a Firebase/Google Cloud Messaging Key & Why You Should Use Firebase Cloud Messaging Key