Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Siapkan aplikasi klien Firebase Cloud Messaging di Android

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Klien FCM memerlukan perangkat yang menjalankan Android 4.4 atau lebih tinggi yang juga telah menginstal aplikasi Google Play Store, atau emulator yang menjalankan Android 4.4 dengan Google API. Perhatikan bahwa Anda tidak terbatas pada penerapan aplikasi Android Anda melalui Google Play Store.

Siapkan SDK

Bagian ini mencakup tugas yang mungkin telah Anda selesaikan jika Anda telah mengaktifkan fitur Firebase lainnya untuk aplikasi Anda. Jika Anda belum melakukannya, tambahkan Firebase ke proyek Android Anda

Edit manifes aplikasi Anda

Tambahkan yang berikut ini ke manifes aplikasi Anda:

  • Layanan yang memperluas FirebaseMessagingService . Ini diperlukan jika Anda ingin melakukan penanganan pesan apa pun selain menerima pemberitahuan pada aplikasi di latar belakang. Untuk menerima notifikasi di aplikasi latar depan, menerima payload data, mengirim pesan upstream, dan sebagainya, Anda harus memperluas layanan ini.
  • <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
  • (Opsional) Di dalam komponen aplikasi, elemen metadata untuk menyetel ikon dan warna notifikasi default. Android menggunakan nilai-nilai ini setiap kali pesan masuk tidak secara eksplisit mengatur 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 pengaturan dasar. Jika Anda lebih suka membuat dan menggunakan saluran default Anda sendiri, setel default_notification_channel_id ke ID objek saluran notifikasi Anda seperti yang ditunjukkan; FCM akan menggunakan nilai ini setiap kali pesan masuk tidak secara eksplisit menyetel saluran notifikasi. 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" />

Minta izin pemberitahuan waktu proses di Android 13+

Android 13 memperkenalkan izin waktu proses baru untuk menampilkan pemberitahuan. Ini memengaruhi semua aplikasi yang berjalan di Android 13 atau lebih tinggi yang menggunakan notifikasi FCM.

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

Untuk meminta izin waktu proses baru:

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);
        }
    }
}

Kotlin+KTX

// 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)
        }
    }
}

Umumnya, Anda harus menampilkan UI yang menjelaskan kepada pengguna fitur yang akan diaktifkan jika mereka memberikan izin kepada aplikasi untuk memposting pemberitahuan. UI ini harus menyediakan opsi pengguna untuk menyetujui atau menolak, seperti tombol OK dan Tidak, terima kasih . Jika pengguna memilih OK , langsung minta izin. Jika pengguna memilih Tidak, terima kasih , izinkan pengguna melanjutkan tanpa pemberitahuan.

Lihat Izin waktu proses notifikasi untuk praktik terbaik lainnya tentang kapan aplikasi Anda harus meminta izin POST_NOTIFICATIONS dari pengguna.

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

Android secara otomatis meminta izin kepada pengguna saat pertama kali aplikasi Anda membuat saluran notifikasi, selama aplikasi berada di latar depan. Namun, ada peringatan penting terkait waktu pembuatan saluran dan permintaan izin:

  • Jika aplikasi Anda membuat saluran notifikasi pertamanya saat berjalan di latar belakang (yang dilakukan FCM SDK saat menerima notifikasi FCM), Android tidak akan mengizinkan notifikasi ditampilkan dan tidak akan meminta izin notifikasi kepada pengguna hingga aplikasi berikutnya waktu aplikasi Anda dibuka. Ini berarti bahwa setiap pemberitahuan yang diterima sebelum aplikasi Anda dibuka dan pengguna menerima izin akan hilang .
  • Kami sangat menyarankan Anda memperbarui aplikasi untuk menargetkan Android 13+ guna memanfaatkan API platform untuk meminta izin. Jika itu tidak memungkinkan, aplikasi Anda harus membuat saluran notifikasi sebelum Anda mengirim notifikasi apa pun ke aplikasi untuk memicu dialog izin notifikasi dan memastikan tidak ada notifikasi yang hilang. Lihat praktik terbaik izin pemberitahuan 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, melalui SDK lain, atau langsung diposting oleh aplikasi Anda) dan Anda tidak ingin aplikasi Anda menyertakan izin, Anda dapat menghapusnya menggunakan penanda remove merger manifes . Perlu diingat bahwa menghapus izin ini akan mencegah tampilan semua 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"/>

Akses token pendaftaran perangkat

Saat memulai awal aplikasi Anda, FCM SDK membuat token pendaftaran untuk instance aplikasi klien. Jika Anda ingin menargetkan satu perangkat atau membuat grup perangkat, Anda harus mengakses token ini dengan memperluas FirebaseMessagingService dan onNewToken .

Bagian ini menjelaskan cara mengambil token dan cara memantau perubahan pada token. Karena token dapat diputar setelah startup awal, Anda sangat disarankan untuk mengambil token pendaftaran terbaru yang diperbarui.

Token pendaftaran dapat berubah ketika:

  • Aplikasi dipulihkan di perangkat baru
  • Pengguna mencopot/menginstal ulang aplikasi
  • Pengguna menghapus data aplikasi.

Ambil token pendaftaran saat ini

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

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();
        }
    });

Kotlin+KTX

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()
})

Pantau pembuatan token

Callback onNewToken diaktifkan setiap kali token baru dibuat.

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);
}

Kotlin+KTX

/**
 * 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)
}

Setelah mendapatkan token, Anda dapat mengirimkannya ke server aplikasi dan menyimpannya menggunakan metode pilihan Anda.

Periksa layanan Google Play

Aplikasi yang mengandalkan SDK Layanan Play harus selalu memeriksa perangkat untuk APK layanan Google Play yang kompatibel sebelum mengakses fitur layanan Google Play. Disarankan untuk melakukan ini di dua tempat: di metode onCreate() aktivitas utama, dan di metode onResume() -nya. Pemeriksaan onCreate() memastikan bahwa aplikasi tidak dapat digunakan tanpa pemeriksaan yang berhasil. Pemeriksaan onResume() memastikan bahwa jika pengguna kembali ke aplikasi yang sedang berjalan melalui beberapa cara lain, seperti melalui tombol kembali, pemeriksaan tetap dilakukan.

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

Cegah inisialisasi otomatis

Saat token pendaftaran FCM dibuat, library akan mengupload ID dan data konfigurasi ke Firebase. Jika Anda lebih suka mencegah pembuatan otomatis token, nonaktifkan pengumpulan Analytics dan inisialisasi otomatis FCM (Anda harus menonaktifkan keduanya) 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 init otomatis FCM, lakukan panggilan waktu proses:

Java

FirebaseMessaging.getInstance().setAutoInitEnabled(true);

Kotlin+KTX

Firebase.messaging.isAutoInitEnabled = true

Untuk mengaktifkan kembali pengumpulan Analytics, panggil metode setAnalyticsCollectionEnabled() dari kelas FirebaseAnalytics . Sebagai contoh:

setAnalyticsCollectionEnabled(true);

Nilai-nilai ini bertahan selama aplikasi dimulai ulang setelah disetel.

Langkah selanjutnya

Setelah aplikasi klien disiapkan, Anda siap untuk mulai mengirim pesan downstream dengan Notifications composer . Fungsionalitas ini ditunjukkan dalam contoh panduan memulai , yang dapat Anda unduh, jalankan, dan tinjau.

Untuk menambahkan perilaku lain yang lebih canggih ke aplikasi, Anda bisa mendeklarasikan filter maksud dan mengimplementasikan aktivitas untuk merespons pesan masuk. Untuk detailnya, lihat panduan untuk mengirim pesan dari server aplikasi:

Perhatikan bahwa, untuk memanfaatkan fitur ini, Anda memerlukan implementasi server dan protokol server (HTTP atau XMPP), atau implementasi Admin SDK .