Mulai menggunakan Firebase Cloud Messaging


Panduan memulai ini menjelaskan cara menyiapkan Firebase Cloud Messaging di aplikasi klien seluler dan web Anda sehingga Anda dapat mengirim pesan dengan andal. Untuk lingkungan server, lihat Lingkungan server Anda dan FCM.

Mulai menggunakan Firebase Cloud Messaging dan Android

Klien FCM memerlukan perangkat yang menjalankan Android 5.0 atau versi lebih tinggi dan aplikasi Google Play Store sudah diinstal, atau emulator yang menjalankan Android 5.0 dengan Google API. Perlu diperhatikan bahwa aplikasi Android bisa di-deploy tidak hanya melalui Google Play Store.

Menyiapkan SDK

Tambahkan Firebase ke project Android jika Anda belum melakukannya.

Untuk mendapatkan pengalaman yang optimal dengan FCM, sebaiknya aktifkan Google Analytics di project Anda. Google Analytics adalah persyaratan untuk pelaporan pengiriman pesan FCM.

Mengedit manifes aplikasi

Tambahkan hal berikut ini ke manifes aplikasi Anda:

  • Layanan yang menyediakan FirebaseMessagingService. Ini diperlukan jika ingin melakukan penanganan pesan selain menerima notifikasi untuk aplikasi di latar belakang. Untuk menerima notifikasi di aplikasi latar depan, menerima payload data, dan lainnya, Anda harus menyediakan layanan ini.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (Opsional) Dalam komponen aplikasi, elemen metadata untuk menetapkan ikon dan warna default notifikasi. Android menggunakan nilai ini setiap kali pesan masuk tidak secara eksplisit menetapkan ikon atau warna.
  • <!-- 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" />
  • (Opsional) Dari Android 8.0 (API level 26) dan yang lebih tinggi, saluran notifikasi didukung dan direkomendasikan. FCM menyediakan saluran notifikasi default dengan setelan dasar. Jika Anda ingin membuat dan menggunakan saluran default Anda sendiri, tetapkan default_notification_channel_id ke ID objek saluran notifikasi seperti yang ditunjukkan di bawah ini. FCM akan menggunakan nilai ini setiap kali pesan masuk tidak menetapkan saluran notifikasi secara eksplisit. Untuk mempelajari lebih lanjut, lihat Mengelola saluran notifikasi.
  • <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

Meminta izin notifikasi runtime di Android 13+

Android 13 memperkenalkan izin runtime baru untuk menampilkan notifikasi. Hal ini memengaruhi semua aplikasi yang berjalan di Android 13 atau yang lebih baru yang menggunakan notifikasi FCM.

Secara default, FCM SDK (versi 23.0.6 atau yang lebih tinggi) menyertakan izin POST_NOTIFICATIONS yang ditentukan dalam manifes. Namun, aplikasi Anda juga harus meminta versi runtime izin ini menggunakan konstanta, android.permission.POST_NOTIFICATIONS. Aplikasi Anda tidak akan diizinkan untuk menampilkan notifikasi hingga pengguna memberikan izin ini.

Untuk meminta izin runtime baru:

Kotlin

// Declare the launcher at the top of your Activity/Fragment:
private val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission(),
) { isGranted: Boolean ->
    if (isGranted) {
        // FCM SDK (and your app) can post notifications.
    } else {
        // TODO: Inform user that that your app will not show notifications.
    }
}

private fun askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
        }
    }
}

Java

// Declare the launcher at the top of your Activity/Fragment:
private final ActivityResultLauncher<String> requestPermissionLauncher =
        registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
            if (isGranted) {
                // FCM SDK (and your app) can post notifications.
            } else {
                // TODO: Inform user that that your app will not show notifications.
            }
        });

private void askNotificationPermission() {
    // This is only necessary for API level >= 33 (TIRAMISU)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
                PackageManager.PERMISSION_GRANTED) {
            // FCM SDK (and your app) can post notifications.
        } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
            // TODO: display an educational UI explaining to the user the features that will be enabled
            //       by them granting the POST_NOTIFICATION permission. This UI should provide the user
            //       "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
            //       If the user selects "No thanks," allow the user to continue without notifications.
        } else {
            // Directly ask for the permission
            requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
        }
    }
}

Biasanya, Anda harus menampilkan UI yang menjelaskan kepada pengguna fitur yang akan diaktifkan jika fitur tersebut memberikan izin bagi aplikasi untuk memposting notifikasi. UI ini akan memberikan opsi kepada pengguna untuk menyetujui atau menolak, seperti tombol Oke dan Tidak. Jika pengguna memilih Oke, minta izin secara langsung. Jika pengguna memilih Tidak, izinkan pengguna melanjutkan tanpa notifikasi.

Lihat Izin runtime notifikasi untuk mengetahui praktik terbaik lainnya terkait kapan aplikasi Anda harus meminta izin POST_NOTIFICATIONS dari pengguna.

Izin notifikasi untuk aplikasi yang menargetkan Android 12L (API level 32) atau yang lebih rendah

Android secara otomatis meminta izin kepada pengguna saat pertama kali aplikasi membuat saluran notifikasi, asalkan aplikasi tersebut ada di latar depan. Namun, ada beberapa catatan penting mengenai waktu pembuatan channel dan permintaan izin:

  • Jika aplikasi Anda membuat saluran notifikasi pertamanya saat berjalan di latar belakang, yang dilakukan SDK FCM saat menerima notifikasi FCM, Android tidak akan mengizinkan notifikasi ditampilkan dan tidak akan meminta izin notifikasi kepada pengguna hingga aplikasi Anda dibuka lagi. Artinya, semua notifikasi yang diterima sebelum aplikasi Anda dibuka dan pengguna menyetujui izin tersebut akan hilang.
  • Sebaiknya Anda mengupdate aplikasi untuk menargetkan Android 13+ agar dapat memanfaatkan API platform untuk meminta izin. Jika tidak memungkinkan, aplikasi Anda harus membuat saluran notifikasi sebelum mengirim notifikasi apa pun ke aplikasi untuk memicu dialog izin notifikasi dan memastikan tidak ada notifikasi yang hilang. Lihat praktik terbaik izin notifikasi untuk informasi selengkapnya.

Opsional: hapus izin POST_NOTIFICATIONS

Secara default, FCM SDK menyertakan izin POST_NOTIFICATIONS. Jika aplikasi Anda tidak menggunakan pesan notifikasi (baik melalui notifikasi FCM, SDK lain, atau diposting langsung oleh aplikasi Anda) dan Anda tidak ingin aplikasi menyertakan izin tersebut, Anda dapat menghapusnya menggunakan penanda penggabung manifes remove. Perlu diingat bahwa penghapusan izin ini akan mencegah semua tampilan notifikasi, bukan hanya notifikasi FCM. Tambahkan yang berikut ini ke file manifes aplikasi Anda:

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" tools:node="remove"/>

Mengakses token pendaftaran perangkat

Saat aplikasi dijalankan untuk pertama kalinya, FCM SDK akan menghasilkan token pendaftaran untuk instance aplikasi klien. Jika ingin menarget satu perangkat atau membuat grup perangkat, Anda harus mengakses token ini dengan menyediakan FirebaseMessagingService dan mengganti onNewToken. Karena token dapat dirotasi setelah aplikasi dijalankan untuk pertama kalinya, sebaiknya ambil token pendaftaran terbaru.

Token pendaftaran dapat berubah jika:

  • Aplikasi dipulihkan di perangkat baru
  • Pengguna melakukan uninstal/instal ulang aplikasi
  • Pengguna menghapus data aplikasi.

Mengambil token pendaftaran saat ini

Jika perlu mengambil token saat ini, panggil FirebaseMessaging.getInstance().getToken():

Kotlin

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Memantau pembuatan token

Callback onNewToken diaktifkan setiap kali token baru dibuat.

Kotlin

/**
 * Called if the FCM registration token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the
 * FCM registration token is initially generated so this is where you would retrieve the token.
 */
override fun onNewToken(token: String) {
    Log.d(TAG, "Refreshed token: $token")

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token)
}

Java

/**
 * There are two scenarios when onNewToken is called:
 * 1) When a new token is generated on initial app startup
 * 2) Whenever an existing token is changed
 * Under #2, there are three scenarios when the existing token is changed:
 * A) App is restored to a new device
 * B) User uninstalls/reinstalls the app
 * C) User clears app data
 */
@Override
public void onNewToken(@NonNull String token) {
    Log.d(TAG, "Refreshed token: " + token);

    // If you want to send messages to this application instance or
    // manage this apps subscriptions on the server side, send the
    // FCM registration token to your app server.
    sendRegistrationToServer(token);
}

Setelah memperoleh token, Anda bisa mengirimkannya ke server aplikasi dan menyimpannya menggunakan metode yang Anda pilih.

Memeriksa layanan Google Play

Aplikasi yang mengandalkan SDK Layanan Play harus selalu memeriksa perangkat untuk memastikan adanya APK layanan Google Play yang kompatibel sebelum mengakses fitur layanan Google Play. Sebaiknya lakukan hal ini di dua tempat: di metode onCreate() dan di metode onResume() dari aktivitas utama. Pemeriksaan di onCreate() memastikan bahwa aplikasi tidak dapat digunakan jika pemeriksaan tidak berhasil. Pemeriksaan di onResume() memastikan bahwa jika pengguna kembali ke aplikasi yang sedang berjalan melalui cara lain, misalnya dengan tombol kembali, maka pemeriksaan tetap dilakukan.

Jika perangkat tidak memiliki versi layanan Google Play yang kompatibel, aplikasi Anda dapat memanggil GoogleApiAvailability.makeGooglePlayServicesAvailable() agar pengguna dapat mendownload layanan Google Play dari Play Store.

Mencegah inisialisasi otomatis

Saat token pendaftaran FCM dibuat, library mengupload data konfigurasi dan ID ke Firebase. Jika Anda lebih memilih untuk mencegah pembuatan token secara otomatis, nonaktifkan pengumpulan Analytics dan inisialisasi otomatis FCM (keduanya harus dinonaktifkan) dengan menambahkan nilai metadata ini ke AndroidManifest.xml Anda:

<meta-data
    android:name="firebase_messaging_auto_init_enabled"
    android:value="false" />
<meta-data
    android:name="firebase_analytics_collection_enabled"
    android:value="false" />

Untuk mengaktifkan kembali inisialisasi otomatis FCM, lakukan panggilan runtime:

Kotlin

Firebase.messaging.isAutoInitEnabled = true

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Untuk mengaktifkan kembali pengumpulan data Analytics, panggil metode setAnalyticsCollectionEnabled() dari class FirebaseAnalytics. Contoh:

setAnalyticsCollectionEnabled(true);

Nilai ini akan tetap ada setiap kali aplikasi dimulai ulang.

Mengirim pesan notifikasi

Untuk memastikan bahwa klien Android Anda telah disiapkan dengan benar, Anda dapat mengirim pesan notifikasi pengujian menggunakan petunjuk berikut:

  1. Instal dan jalankan aplikasi pada perangkat target.
  2. Pastikan aplikasi berjalan di latar belakang pada perangkat.
  3. Di Firebase console, buka halaman Messaging.
  4. Jika ini adalah pesan pertama Anda, pilih Buat kampanye pertama Anda, Firebase Notification messages, lalu Buat.
  5. Atau, di tab Campaigns, pilih New campaign, lalu Notifications.
  6. Masukkan teks pesan. Semua kolom lainnya bersifat opsional.
  7. Pilih Send test message dari panel kanan.
  8. Dalam kolom yang berlabel Add an FCM registration token, masukkan token pendaftaran yang diperoleh di bagian sebelumnya pada panduan ini.
  9. Pilih Test.

Perangkat klien yang ditargetkan, dengan aplikasi berada di latar belakang, akan menerima notifikasi.

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

Langkah berikutnya

Setelah aplikasi klien disiapkan, Anda dapat mulai menerima atau mengirim pesan kepada pengguna: