Bagikan melalui


Pemberitahuan Jarak Jauh dengan Firebase Cloud Messaging

Panduan ini memberikan penjelasan langkah demi langkah tentang cara menggunakan Firebase Cloud Messaging untuk menerapkan pemberitahuan jarak jauh (juga disebut pemberitahuan push) dalam aplikasi Xamarin.Android. Ini menggambarkan cara mengimplementasikan berbagai kelas yang diperlukan untuk komunikasi dengan Firebase Cloud Messaging (FCM), memberikan contoh cara mengonfigurasi Manifes Android untuk akses ke FCM, dan menunjukkan olahpesan hilir menggunakan Firebase Console.

Gambaran umum pemberitahuan FCM

Dalam panduan ini, aplikasi dasar bernama FCMClient akan dibuat untuk mengilustrasikan hal-hal penting olahpesan FCM. FCMClient memeriksa keberadaan Google Play Services, menerima token pendaftaran dari FCM, menampilkan pemberitahuan jarak jauh yang Anda kirim dari Firebase Console, dan berlangganan pesan topik:

Contoh cuplikan layar aplikasi

Area topik berikut akan dieksplorasi:

  1. Pemberitahuan Latar Belakang

  2. Pesan Topik

  3. Pemberitahuan Latar Depan

Selama panduan ini, Anda akan secara bertahap menambahkan fungsionalitas ke FCMClient dan menjalankannya di perangkat atau emulator untuk memahami bagaimana ia berinteraksi dengan FCM. Anda akan menggunakan pengelogan untuk menyaksikan transaksi aplikasi langsung dengan server FCM, dan Anda akan mengamati bagaimana pemberitahuan dihasilkan dari pesan FCM yang Anda masukkan ke GUI Pemberitahuan Firebase Console.

Persyaratan

Akan sangat membantu untuk membiasakan diri dengan berbagai jenis pesan yang dapat dikirim oleh Firebase Cloud Messaging. Payload pesan akan menentukan bagaimana aplikasi klien akan menerima dan memproses pesan.

Sebelum dapat melanjutkan panduan ini, Anda harus memperoleh kredensial yang diperlukan untuk menggunakan server FCM Google; proses ini dijelaskan dalam Firebase Cloud Messaging. Secara khusus, Anda harus mengunduh file google-services.json untuk digunakan dengan contoh kode yang disajikan dalam panduan ini. Jika Anda belum membuat proyek di Firebase Console (atau jika Anda belum mengunduh file google-services.json ), lihat Firebase Cloud Messaging.

Untuk menjalankan aplikasi contoh, Anda memerlukan perangkat pengujian Android atau emulator yang kompatibile dengan Firebase. Firebase Cloud Messaging mendukung klien yang berjalan di Android 4.0 atau yang lebih tinggi, dan perangkat ini juga harus menginstal aplikasi Google Play Store (diperlukan Google Play Services 9.2.1 atau yang lebih baru). Jika Anda belum menginstal aplikasi Google Play Store di perangkat, kunjungi situs web Google Play untuk mengunduh dan menginstalnya. Sebagai alternatif, Anda dapat menggunakan emulator Android SDK dengan Google Play Services yang diinstal alih-alih perangkat pengujian (Anda tidak perlu menginstal Google Play Store jika Anda menggunakan emulator Android SDK).

Memulai proyek aplikasi

Untuk memulai, buat proyek Xamarin.Android kosong baru yang disebut FCMClient. Jika Anda tidak terbiasa membuat proyek Xamarin.Android, lihat Halo, Android. Setelah aplikasi baru dibuat, langkah selanjutnya adalah mengatur nama paket dan menginstal beberapa paket NuGet yang akan digunakan untuk komunikasi dengan FCM.

Atur nama paket

Di Firebase Cloud Messaging, Anda menentukan nama paket untuk aplikasi berkemampuan FCM. Nama paket ini juga berfungsi sebagai ID aplikasi yang terkait dengan kunci API. Konfigurasikan aplikasi untuk menggunakan nama paket ini:

  1. Buka properti untuk proyek FCMClient .

  2. Di halaman Manifes Android, atur nama paket.

Dalam contoh berikut, nama paket diatur ke com.xamarin.fcmexample:

Mengatur nama paket

Saat Anda memperbarui Manifes Android, periksa juga untuk memastikan bahwa Internet izin diaktifkan.

Penting

Aplikasi klien tidak akan dapat menerima token pendaftaran dari FCM jika nama paket ini tidak sama persis dengan nama paket yang dimasukkan ke Dalam Firebase Console.

Menambahkan paket Basis Layanan Xamarin Google Play

Karena Firebase Cloud Messaging bergantung pada Google Play Services, paket Xamarin Google Play Services - Base NuGet harus ditambahkan ke proyek Xamarin.Android. Anda akan memerlukan versi 29.0.0.2 atau yang lebih baru.

  1. Di Visual Studio, klik kanan Referensi > Kelola Paket NuGet ....

  2. Klik tab Telusuri dan cari Xamarin.GooglePlayServices.Base.

  3. Instal paket ini ke dalam proyek FCMClient :

    Menginstal Google Play Services Base

Jika Anda mendapatkan kesalahan selama penginstalan NuGet, tutup proyek FCMClient , buka lagi, dan coba lagi penginstalan NuGet.

Saat Anda menginstal Xamarin.GooglePlayServices.Base, semua dependensi yang diperlukan juga diinstal. Edit MainActivity.cs dan tambahkan pernyataan berikut using :

using Android.Gms.Common;

Pernyataan ini membuat kelas di Xamarin.GooglePlayServices.Base tersedia untuk kode FCMClient.GoogleApiAvailability GoogleApiAvailability digunakan untuk memeriksa keberadaan Layanan Google Play.

Menambahkan paket Olahpesan Xamarin Firebase

Untuk menerima pesan dari FCM, paket Xamarin Firebase - Messaging NuGet harus ditambahkan ke proyek aplikasi. Tanpa paket ini, aplikasi Android tidak dapat menerima pesan dari server FCM.

  1. Di Visual Studio, klik kanan Referensi > Kelola Paket NuGet ....

  2. Cari Xamarin.Firebase.Messaging.

  3. Instal paket ini ke dalam proyek FCMClient :

    Menginstal Xamarin Firebase Messaging

Saat Anda menginstal Xamarin.Firebase.Messaging, semua dependensi yang diperlukan juga diinstal.

Selanjutnya, edit MainActivity.cs dan tambahkan pernyataan berikut using :

using Firebase.Messaging;
using Firebase.Iid;
using Android.Util;

Dua pernyataan pertama membuat jenis dalam paket Xamarin.Firebase.Messaging NuGet tersedia untuk kode FCMClient . Android.Util menambahkan fungsionalitas pengelogan yang akan digunakan untuk mengamati transaksi dengan FMS.

Tambahkan File JSON Layanan Google

Langkah selanjutnya adalah menambahkan file google-services.json ke direktori akar proyek Anda:

  1. Salin google-services.json ke folder proyek.

  2. Tambahkan google-services.json ke proyek aplikasi (klik Perlihatkan Semua File di Penjelajah Solusi, klik kanan google-services.json, lalu pilih Sertakan dalam Proyek).

  3. Pilih google-services.json di jendela Penjelajah Solusi.

  4. Di panel Properti , atur Build Action ke GoogleServicesJson:

    Mengatur tindakan build ke GoogleServicesJson

    Catatan

    Jika tindakan build GoogleServicesJson tidak ditampilkan, simpan dan tutup solusi, lalu buka kembali.

Saat google-services.json ditambahkan ke proyek (dan tindakan build GoogleServicesJson diatur), proses build mengekstrak ID klien dan kunci API lalu menambahkan kredensial ini ke AndroidManifest.xml yang digabungkan/dihasilkan yang berada di obj/Debug/android/AndroidManifest.xml. Proses penggabungan ini secara otomatis menambahkan izin apa pun dan elemen FCM lainnya yang diperlukan untuk koneksi ke server FCM.

Periksa Layanan Google Play dan buat saluran pemberitahuan

Google menyarankan agar aplikasi Android memeriksa keberadaan GOOGLE Play Services APK sebelum mengakses fitur Google Play Services (untuk informasi selengkapnya, lihat Memeriksa layanan Google Play).

Tata letak awal untuk UI aplikasi akan dibuat terlebih dahulu. Edit Sumber Daya/tata letak/Main.axml dan ganti kontennya dengan XML berikut:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp">
    <TextView
        android:text=" "
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/msgText"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:padding="10dp" />
</LinearLayout>

Ini TextView akan digunakan untuk menampilkan pesan yang menunjukkan apakah Layanan Google Play diinstal. Simpan perubahan ke Main.axml.

Edit MainActivity.cs dan tambahkan variabel instans berikut ke MainActivity kelas :

public class MainActivity : AppCompatActivity
{
    static readonly string TAG = "MainActivity";

    internal static readonly string CHANNEL_ID = "my_notification_channel";
    internal static readonly int NOTIFICATION_ID = 100;

    TextView msgText;

Variabel CHANNEL_ID dan NOTIFICATION_ID akan digunakan dalam metode CreateNotificationChannel yang akan ditambahkan ke MainActivity nanti dalam panduan ini.

Dalam contoh berikut, OnCreate metode ini akan memverifikasi bahwa Layanan Google Play tersedia sebelum aplikasi mencoba menggunakan layanan FCM. Tambahkan metode berikut ke kelas MainActivity:

public bool IsPlayServicesAvailable ()
{
    int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable (this);
    if (resultCode != ConnectionResult.Success)
    {
        if (GoogleApiAvailability.Instance.IsUserResolvableError (resultCode))
            msgText.Text = GoogleApiAvailability.Instance.GetErrorString (resultCode);
        else
        {
            msgText.Text = "This device is not supported";
            Finish ();
        }
        return false;
    }
    else
    {
        msgText.Text = "Google Play Services is available.";
        return true;
    }
}

Kode ini memeriksa perangkat untuk melihat apakah APK Google Play Services diinstal. Jika tidak diinstal, pesan ditampilkan dalam TextBox yang menginstruksikan pengguna untuk mengunduh APK dari Google Play Store (atau untuk mengaktifkannya di pengaturan sistem perangkat).

Aplikasi yang berjalan di Android 8.0 (API level 26) atau yang lebih tinggi harus membuat saluran pemberitahuan untuk menerbitkan pemberitahuan mereka. Tambahkan metode berikut ke MainActivity kelas yang akan membuat saluran pemberitahuan (jika perlu):

void CreateNotificationChannel()
{
    if (Build.VERSION.SdkInt < BuildVersionCodes.O)
    {
        // Notification channels are new in API 26 (and not a part of the
        // support library). There is no need to create a notification
        // channel on older versions of Android.
        return;
    }

    var channel = new NotificationChannel(CHANNEL_ID,
                                          "FCM Notifications",
                                          NotificationImportance.Default)
                  {

                      Description = "Firebase Cloud Messages appear in this channel"
                  };

    var notificationManager = (NotificationManager)GetSystemService(Android.Content.Context.NotificationService);
    notificationManager.CreateNotificationChannel(channel);
}

Ganti metode OnCreate dengan kode berikut:

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);
    SetContentView (Resource.Layout.Main);
    msgText = FindViewById<TextView> (Resource.Id.msgText);

    IsPlayServicesAvailable ();

    CreateNotificationChannel();
}

IsPlayServicesAvailable dipanggil di akhir OnCreate sehingga pemeriksaan Layanan Google Play berjalan setiap kali aplikasi dimulai. Metode CreateNotificationChannel ini dipanggil untuk memastikan bahwa saluran pemberitahuan ada untuk perangkat yang menjalankan Android 8 atau yang lebih tinggi. Jika aplikasi Anda memiliki OnResume metode , aplikasi juga harus memanggil IsPlayServicesAvailable dari OnResume . Bangun ulang dan jalankan aplikasi sepenuhnya. Jika semua dikonfigurasi dengan benar, Anda akan melihat layar yang terlihat seperti cuplikan layar berikut:

Aplikasi menunjukkan bahwa Google Play Services tersedia

Jika Anda tidak mendapatkan hasil ini, verifikasi bahwa APK Layanan Google Play diinstal di perangkat Anda (untuk informasi selengkapnya, lihat Menyiapkan Layanan Google Play). Verifikasi juga bahwa Anda telah menambahkan paket Xamarin.Google.Play.Services.Base ke proyek FCMClient Anda seperti yang dijelaskan sebelumnya.

Menambahkan penerima ID instans

Langkah selanjutnya adalah menambahkan layanan yang diperluas FirebaseInstanceIdService untuk menangani pembuatan, rotasi, dan pembaruan token pendaftaran Firebase. Layanan FirebaseInstanceIdService ini diperlukan agar FCM dapat mengirim pesan ke perangkat. FirebaseInstanceIdService Saat layanan ditambahkan ke aplikasi klien, aplikasi akan secara otomatis menerima pesan FCM dan menampilkannya sebagai pemberitahuan setiap kali aplikasi di latar belakang.

Mendeklarasikan penerima dalam Manifes Android

Edit AndroidManifest.xml dan sisipkan elemen berikut <receiver> ke dalam bagian <application> :

<receiver
    android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
    android:exported="false" />
<receiver
    android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
    </intent-filter>
</receiver>

XML ini melakukan hal berikut:

  • Mendeklarasikan FirebaseInstanceIdReceiver implementasi yang menyediakan pengidentifikasi unik untuk setiap instans aplikasi. Penerima ini juga mengautentikasi dan mengotorisasi tindakan.

  • Menyatakan implementasi internal FirebaseInstanceIdInternalReceiver yang digunakan untuk memulai layanan dengan aman.

  • ID aplikasi disimpan dalam file google-services.json yang ditambahkan ke proyek. Pengikatan Xamarin.Android Firebase akan mengganti token ${applicationId} dengan ID aplikasi; tidak ada kode tambahan yang diperlukan oleh aplikasi klien untuk memberikan ID aplikasi.

FirebaseInstanceIdReceiver adalah WakefulBroadcastReceiver yang menerima FirebaseInstanceId dan FirebaseMessaging peristiwa dan mengirimkannya ke kelas yang Anda dapatkan dari FirebaseInstanceIdService.

Menerapkan Layanan ID Instans Firebase

Pekerjaan mendaftarkan aplikasi dengan FCM ditangani oleh layanan kustom FirebaseInstanceIdService yang Anda sediakan. FirebaseInstanceIdService lakukan langkah-langkah berikut:

  1. Menggunakan API ID Instans untuk menghasilkan token keamanan yang mengotorisasi aplikasi klien untuk mengakses FCM dan server aplikasi. Sebagai imbalannya, aplikasi mendapatkan kembali token pendaftaran dari FCM.

  2. Meneruskan token pendaftaran ke server aplikasi jika server aplikasi memerlukannya.

Tambahkan file baru yang disebut MyFirebaseIIDService.cs dan ganti kode templatnya dengan yang berikut ini:

using System;
using Android.App;
using Firebase.Iid;
using Android.Util;

namespace FCMClient
{
    [Service]
    [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
    public class MyFirebaseIIDService : FirebaseInstanceIdService
    {
        const string TAG = "MyFirebaseIIDService";
        public override void OnTokenRefresh()
        {
            var refreshedToken = FirebaseInstanceId.Instance.Token;
            Log.Debug(TAG, "Refreshed token: " + refreshedToken);
            SendRegistrationToServer(refreshedToken);
        }
        void SendRegistrationToServer(string token)
        {
            // Add custom implementation, as needed.
        }
    }
}

Layanan ini menerapkan OnTokenRefresh metode yang dipanggil ketika token pendaftaran awalnya dibuat atau diubah. Saat OnTokenRefresh dijalankan, ia mengambil token terbaru dari FirebaseInstanceId.Instance.Token properti (yang diperbarui secara asinkron oleh FCM). Dalam contoh ini, token yang di-refresh dicatat sehingga dapat dilihat di jendela output:

var refreshedToken = FirebaseInstanceId.Instance.Token;
Log.Debug(TAG, "Refreshed token: " + refreshedToken);

OnTokenRefresh jarang dipanggil: ini digunakan untuk memperbarui token dalam keadaan berikut:

  • Saat aplikasi diinstal atau dihapus instalasinya.

  • Saat pengguna menghapus data aplikasi.

  • Saat aplikasi menghapus ID Instans.

  • Ketika keamanan token telah disusupi.

Menurut dokumentasi ID Instans Google, layanan ID Instans FCM akan meminta agar aplikasi me-refresh tokennya secara berkala (biasanya, setiap 6 bulan).

OnTokenRefresh juga memanggil SendRegistrationToAppServer untuk mengaitkan token pendaftaran pengguna dengan akun sisi server (jika ada) yang dikelola oleh aplikasi:

void SendRegistrationToAppServer (string token)
{
    // Add custom implementation here as needed.
}

Karena implementasi ini tergantung pada desain server aplikasi, isi metode kosong disediakan dalam contoh ini. Jika server aplikasi Anda memerlukan informasi pendaftaran FCM, ubah SendRegistrationToAppServer untuk mengaitkan token ID instans FCM pengguna dengan akun sisi server apa pun yang dikelola oleh aplikasi Anda. (Perhatikan bahwa token buram ke aplikasi klien.)

Ketika token dikirim ke server aplikasi, SendRegistrationToAppServer harus mempertahankan boolean untuk menunjukkan apakah token telah dikirim ke server. Jika boolean ini salah, SendRegistrationToAppServer mengirim token ke server aplikasi - jika tidak, token sudah dikirim ke server aplikasi dalam panggilan sebelumnya. Dalam beberapa kasus (seperti contoh ini FCMClient ), server aplikasi tidak memerlukan token; oleh karena itu, metode ini tidak diperlukan untuk contoh ini.

Menerapkan kode aplikasi klien

Sekarang setelah layanan penerima diberlakukan, kode aplikasi klien dapat ditulis untuk memanfaatkan layanan ini. Di bagian berikut, tombol ditambahkan ke UI untuk mencatat token pendaftaran (juga disebut token ID Instans), dan lebih banyak kode ditambahkan ke MainActivity untuk melihat Intent informasi saat aplikasi diluncurkan dari pemberitahuan:

Tombol Token Log ditambahkan ke layar aplikasi

Token log

Kode yang ditambahkan dalam langkah ini hanya ditujukan untuk tujuan demonstrasi - aplikasi klien produksi tidak perlu mencatat token pendaftaran. Edit Sumber Daya/tata letak/Main.axml dan tambahkan deklarasi berikut Button segera setelah TextView elemen :

<Button
  android:id="@+id/logTokenButton"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:text="Log Token" />

Tambahkan kode berikut di akhir metode MainActivity.OnCreate:

var logTokenButton = FindViewById<Button>(Resource.Id.logTokenButton);
logTokenButton.Click += delegate {
    Log.Debug(TAG, "InstanceID token: " + FirebaseInstanceId.Instance.Token);
};

Kode ini mencatat token saat ini ke jendela output saat tombol Token Log diketuk.

Menangani niat pemberitahuan

Saat pengguna mengetuk pemberitahuan yang dikeluarkan dari FCMClient, data apa pun yang menyertai pesan pemberitahuan tersebut tersedia di Intent ekstra. Edit MainActivity.cs dan tambahkan kode berikut ke bagian OnCreate atas metode (sebelum panggilan ke IsPlayServicesAvailable):

if (Intent.Extras != null)
{
    foreach (var key in Intent.Extras.KeySet())
    {
        var value = Intent.Extras.GetString(key);
        Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
    }
}

Peluncur Intent aplikasi diaktifkan saat pengguna mengetuk pesan pemberitahuannya, sehingga kode ini akan mencatat data yang menyertainya Intent di jendela output. Jika berbeda Intent harus diaktifkan, click_action bidang pesan pemberitahuan harus diatur ke Intent itu (peluncur Intent digunakan ketika tidak click_action ada yang ditentukan).

Pemberitahuan latar belakang

Buat dan jalankan aplikasi FCMClient . Tombol Token Log ditampilkan:

Tombol Token Log ditampilkan

Ketuk tombol Token Log. Pesan seperti berikut ini harus ditampilkan di jendela output IDE:

Token ID Instans ditampilkan di jendela Output

String panjang berlabel token adalah token ID instans yang akan Anda tempelkan ke Firebase Console – pilih dan salin string ini ke clipboard. Jika Anda tidak melihat token ID instans, tambahkan baris berikut ke bagian OnCreate atas metode untuk memverifikasi bahwa google-services.json diurai dengan benar:

Log.Debug(TAG, "google app id: " + GetString(Resource.String.google_app_id));

Nilai google_app_id yang dicatat ke jendela output harus cocok dengan nilai yang mobilesdk_app_id dicatat dalam google-services.json. Resource.String.google_app_id dihasilkan oleh msbuild saat memproses google-services.json.

Mengirim pesan

Masuk ke Firebase Console, pilih proyek Anda, klik Pemberitahuan, dan klik KIRIM PESAN PERTAMA ANDA:

Tombol Kirim Pesan Pertama Anda

Pada halaman Buat pesan , masukkan teks pesan dan pilih Perangkat tunggal. Salin token ID instans dari jendela output IDE dan tempelkan ke bidang token pendaftaran FCM dari Firebase Console:

Dialog tulis pesan

Di perangkat Android (atau emulator), latar belakang aplikasi dengan mengetuk tombol Gambaran Umum Android dan menyentuh layar beranda. Setelah perangkat siap, klik KIRIM PESAN di Firebase Console:

Tombol Kirim pesan

Saat dialog Tinjau pesan ditampilkan, klik KIRIM. Ikon pemberitahuan akan muncul di area pemberitahuan perangkat (atau emulator):

Ikon pemberitahuan ditampilkan

Buka ikon pemberitahuan untuk melihat pesan. Pesan pemberitahuan harus persis apa yang ditik ke dalam bidang teks Pesan dari Firebase Console:

Pesan pemberitahuan ditampilkan pada perangkat

Ketuk ikon pemberitahuan untuk meluncurkan aplikasi FCMClient . Ekstra Intent yang dikirim ke FCMClient tercantum di jendela output IDE:

Daftar tambahan niat dari kunci, ID pesan, dan kunci ciutkan

Dalam contoh ini, kunci dari diatur ke nomor proyek Firebase aplikasi (dalam contoh ini, 41590732), dan collapse_key diatur ke nama paketnya (com.xamarin.fcmexample). Jika Anda tidak menerima pesan, coba hapus aplikasi FCMClient di perangkat (atau emulator) dan ulangi langkah-langkah di atas.

Catatan

Jika Anda menutup paksa aplikasi, FCM akan berhenti mengirimkan pemberitahuan. Android mencegah siaran layanan latar belakang secara tidak sengaja atau tidak perlu meluncurkan komponen aplikasi yang dihentikan. (Untuk informasi selengkapnya tentang perilaku ini, lihat Luncurkan kontrol pada aplikasi yang dihentikan.) Untuk alasan ini, perlu untuk menghapus instalan aplikasi secara manual setiap kali Anda menjalankannya dan menghentikannya dari sesi debug - ini memaksa FCM untuk menghasilkan token baru sehingga pesan akan terus diterima.

Menambahkan ikon pemberitahuan default kustom

Dalam contoh sebelumnya, ikon pemberitahuan diatur ke ikon aplikasi. XML berikut mengonfigurasi ikon default kustom untuk pemberitahuan. Android menampilkan ikon default kustom ini untuk semua pesan pemberitahuan di mana ikon pemberitahuan tidak diatur secara eksplisit.

Untuk menambahkan ikon pemberitahuan default kustom, tambahkan ikon Anda ke direktori Sumber Daya/yang dapat digambar, edit AndroidManifest.xml, dan sisipkan elemen berikut <meta-data> ke <application> bagian :

<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />

Dalam contoh ini, ikon pemberitahuan yang berada di Resources/drawable/ic_stat_ic_notification.png akan digunakan sebagai ikon pemberitahuan default kustom. Jika ikon default kustom tidak dikonfigurasi di AndroidManifest.xml dan tidak ada ikon yang diatur dalam payload pemberitahuan, Android menggunakan ikon aplikasi sebagai ikon pemberitahuan (seperti yang terlihat pada cuplikan layar ikon pemberitahuan di atas).

Menangani pesan topik

Kode yang ditulis sejauh ini menangani token pendaftaran dan menambahkan fungsionalitas pemberitahuan jarak jauh ke aplikasi. Contoh berikutnya menambahkan kode yang mendengarkan pesan topik dan meneruskannya ke pengguna sebagai pemberitahuan jarak jauh. Pesan topik adalah pesan FCM yang dikirim ke satu atau beberapa perangkat yang berlangganan topik tertentu. Untuk informasi selengkapnya tentang pesan topik, lihat Pesan Topik.

Berlangganan topik

Edit Sumber Daya/tata letak/Main.axml dan tambahkan deklarasi berikut Button segera setelah elemen sebelumnya Button :

<Button
  android:id="@+id/subscribeButton"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:layout_marginTop="20dp"
  android:text="Subscribe to Notifications" />

XML ini menambahkan tombol Berlangganan Pemberitahuan ke tata letak. Edit MainActivity.cs dan tambahkan kode berikut ke akhir OnCreate metode:

var subscribeButton = FindViewById<Button>(Resource.Id.subscribeButton);
subscribeButton.Click += delegate {
    FirebaseMessaging.Instance.SubscribeToTopic("news");
    Log.Debug(TAG, "Subscribed to remote notifications");
};

Kode ini menemukan tombol Berlangganan Pemberitahuan di tata letak dan menetapkan penanganan kliknya ke kode yang memanggil FirebaseMessaging.Instance.SubscribeToTopic, meneruskan topik berlangganan, berita. Saat pengguna mengetuk tombol Berlangganan , aplikasi berlangganan topik berita . Di bagian berikut, pesan topik berita akan dikirim dari GUI Pemberitahuan Firebase Console.

Mengirim pesan topik

Hapus instalan aplikasi, bangun ulang, dan jalankan lagi. Klik tombol Berlangganan Pemberitahuan :

Tombol Berlangganan Pemberitahuan

Jika aplikasi berhasil berlangganan, Anda akan melihat sinkronisasi topik berhasil di jendela output IDE:

Jendela output memperlihatkan pesan sinkronisasi topik berhasil

Gunakan langkah-langkah berikut untuk mengirim pesan topik:

  1. Di Firebase Console, klik PESAN BARU.

  2. Pada halaman Buat pesan , masukkan teks pesan dan pilih Topik.

  3. Di menu tarik-turun Topik, pilih topik bawaan, berita:

    Memilih topik berita

  4. Di perangkat Android (atau emulator), latar belakang aplikasi dengan mengetuk tombol Gambaran Umum Android dan menyentuh layar beranda.

  5. Setelah perangkat siap, klik KIRIM PESAN di Firebase Console.

  6. Periksa jendela output IDE untuk melihat /topics/news dalam output log:

    Pesan dari /topic/news ditampilkan

Ketika pesan ini terlihat di jendela output, ikon pemberitahuan juga akan muncul di area pemberitahuan pada perangkat Android. Buka ikon pemberitahuan untuk melihat pesan topik:

Pesan topik muncul sebagai pemberitahuan

Jika Anda tidak menerima pesan, coba hapus aplikasi FCMClient di perangkat (atau emulator) dan ulangi langkah-langkah di atas.

Pemberitahuan latar depan

Untuk menerima pemberitahuan di aplikasi latar depan, Anda harus menerapkan FirebaseMessagingService. Layanan ini juga diperlukan untuk menerima payload data dan untuk mengirim pesan upstram. Contoh berikut menggambarkan cara mengimplementasikan layanan yang diperluas FirebaseMessagingService - aplikasi yang dihasilkan akan dapat menangani pemberitahuan jarak jauh saat berjalan di latar depan.

Menerapkan FirebaseMessagingService

FirebaseMessagingService Layanan ini bertanggung jawab untuk menerima dan memproses pesan dari Firebase. Setiap aplikasi harus mensublasifikasi jenis ini dan mengambil alih OnMessageReceived untuk memproses pesan masuk. Saat aplikasi berada di latar depan, OnMessageReceived panggilan balik akan selalu menangani pesan.

Catatan

Aplikasi hanya memiliki 10 detik untuk menangani Pesan Firebase Cloud yang masuk. Pekerjaan apa pun yang memakan waktu lebih lama dari ini harus dijadwalkan untuk eksekusi latar belakang menggunakan pustaka seperti Android Job Scheduler atau Firebase Job Dispatcher.

Tambahkan file baru yang disebut MyFirebaseMessagingService.cs dan ganti kode templatnya dengan yang berikut ini:

using System;
using Android.App;
using Android.Content;
using Android.Media;
using Android.Util;
using Firebase.Messaging;

namespace FCMClient
{
    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class MyFirebaseMessagingService : FirebaseMessagingService
    {
        const string TAG = "MyFirebaseMsgService";
        public override void OnMessageReceived(RemoteMessage message)
        {
            Log.Debug(TAG, "From: " + message.From);
            Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
        }
    }
}

Perhatikan bahwa MESSAGING_EVENT filter niat harus dideklarasikan sehingga pesan FCM baru diarahkan ke MyFirebaseMessagingService:

[IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]

Saat aplikasi klien menerima pesan dari FCM, OnMessageReceived mengekstrak konten pesan dari objek yang diteruskan RemoteMessage dengan memanggil metodenya GetNotification . Selanjutnya, ini mencatat konten pesan sehingga dapat dilihat di jendela output IDE:

var body = message.GetNotification().Body;
Log.Debug(TAG, "Notification Message Body: " + body);

Catatan

Jika Anda mengatur titik henti di FirebaseMessagingService, sesi penelusuran kesalahan Anda mungkin atau mungkin tidak mencapai titik henti ini karena bagaimana FCM mengirimkan pesan.

Kirim pesan lain

Hapus instalan aplikasi, bangun ulang, jalankan lagi, dan ikuti langkah-langkah ini untuk mengirim pesan lain:

  1. Di Firebase Console, klik PESAN BARU.

  2. Pada halaman Buat pesan , masukkan teks pesan dan pilih Perangkat tunggal.

  3. Salin string token dari jendela output IDE dan tempelkan ke bidang token pendaftaran FCM dari Firebase Console seperti sebelumnya.

  4. Pastikan aplikasi berjalan di latar depan, lalu klik KIRIM PESAN di Firebase Console:

    Mengirim pesan lain dari Konsol

  5. Saat dialog Tinjau pesan ditampilkan, klik KIRIM.

  6. Pesan masuk dicatat ke jendela output IDE:

    Isi pesan dicetak ke jendela output

Menambahkan pengirim pemberitahuan lokal

Dalam contoh yang tersisa ini, pesan FCM masuk akan dikonversi menjadi pemberitahuan lokal yang diluncurkan saat aplikasi berjalan di latar depan. Edit MyFirebaseMessageService.cs dan tambahkan pernyataan berikut using :

using FCMClient;
using System.Collections.Generic;

Tambahkan metode berikut ke MyFirebaseMessagingService:

void SendNotification(string messageBody, IDictionary<string, string> data)
{
    var intent = new Intent(this, typeof(MainActivity));
    intent.AddFlags(ActivityFlags.ClearTop);
    foreach (var key in data.Keys)
    {
        intent.PutExtra(key, data[key]);
    }

    var pendingIntent = PendingIntent.GetActivity(this,
                                                  MainActivity.NOTIFICATION_ID,
                                                  intent,
                                                  PendingIntentFlags.OneShot);

    var notificationBuilder = new  NotificationCompat.Builder(this, MainActivity.CHANNEL_ID)
                              .SetSmallIcon(Resource.Drawable.ic_stat_ic_notification)
                              .SetContentTitle("FCM Message")
                              .SetContentText(messageBody)
                              .SetAutoCancel(true)
                              .SetContentIntent(pendingIntent);

    var notificationManager = NotificationManagerCompat.From(this);
    notificationManager.Notify(MainActivity.NOTIFICATION_ID, notificationBuilder.Build());
}

Untuk membedakan pemberitahuan ini dari pemberitahuan latar belakang, kode ini menandai pemberitahuan dengan ikon yang berbeda dari ikon aplikasi. Tambahkan file ic_stat_ic_notification.png ke Sumber Daya/dapat digambar dan sertakan dalam proyek FCMClient .

Metode ini SendNotification menggunakan NotificationCompat.Builder untuk membuat pemberitahuan, dan NotificationManagerCompat digunakan untuk meluncurkan pemberitahuan. Pemberitahuan menyimpan PendingIntent yang akan memungkinkan pengguna untuk membuka aplikasi dan melihat konten string yang diteruskan ke messageBody. Untuk informasi selengkapnya tentang NotificationCompat.Builder, lihat Pemberitahuan Lokal.

SendNotification Panggil metode di akhir OnMessageReceived metode:

public override void OnMessageReceived(RemoteMessage message)
{
    Log.Debug(TAG, "From: " + message.From);

    var body = message.GetNotification().Body;
    Log.Debug(TAG, "Notification Message Body: " + body);
    SendNotification(body, message.Data);
}

Akibat perubahan ini, SendNotification akan berjalan setiap kali pemberitahuan diterima saat aplikasi berada di latar depan, dan pemberitahuan akan muncul di area pemberitahuan.

Saat aplikasi berada di latar belakang, payload pesan akan menentukan bagaimana pesan ditangani:

  • Pemberitahuan – pesan akan dikirim ke baki sistem. Pemberitahuan lokal akan muncul di sana. Saat pengguna mengetuk pemberitahuan, aplikasi akan diluncurkan.
  • Data – pesan akan ditangani oleh OnMessageReceived.
  • Keduanya – pesan yang memiliki pemberitahuan dan payload data akan dikirimkan ke baki sistem. Saat aplikasi diluncurkan, payload data akan muncul di Extras aplikasi Intent yang digunakan untuk memulai aplikasi.

Dalam contoh ini, jika aplikasi di latar belakang, SendNotification akan berjalan jika pesan memiliki payload data. Jika tidak, pemberitahuan latar belakang (diilustrasikan sebelumnya dalam panduan ini) akan diluncurkan.

Mengirim pesan terakhir

Hapus instalan aplikasi, bangun ulang, jalankan lagi, lalu gunakan langkah-langkah berikut untuk mengirim pesan terakhir:

  1. Di Firebase Console, klik PESAN BARU.

  2. Pada halaman Buat pesan , masukkan teks pesan dan pilih Perangkat tunggal.

  3. Salin string token dari jendela output IDE dan tempelkan ke bidang token pendaftaran FCM dari Firebase Console seperti sebelumnya.

  4. Pastikan aplikasi berjalan di latar depan, lalu klik KIRIM PESAN di Firebase Console:

    Mengirim pesan latar depan

Kali ini, pesan yang dicatat di jendela output juga dikemas dalam pemberitahuan baru – ikon pemberitahuan muncul di baki pemberitahuan saat aplikasi berjalan di latar depan:

Ikon pemberitahuan untuk pesan latar depan

Saat membuka pemberitahuan, Anda akan melihat pesan terakhir yang dikirim dari GUI Pemberitahuan Firebase Console:

Pemberitahuan latar depan ditampilkan dengan ikon latar depan

Memutuskan sambungan dari FCM

Untuk berhenti berlangganan dari topik, panggil metode UnsubscribeFromTopic pada kelas FirebaseMessaging . Misalnya, untuk berhenti berlangganan dari topik berita yang berlangganan sebelumnya, tombol Berhenti berlangganan dapat ditambahkan ke tata letak dengan kode handler berikut:

var unSubscribeButton = FindViewById<Button>(Resource.Id.unsubscribeButton);
unSubscribeButton.Click += delegate {
    FirebaseMessaging.Instance.UnsubscribeFromTopic("news");
    Log.Debug(TAG, "Unsubscribed from remote notifications");
};

Untuk membatalkan pendaftaran perangkat dari FCM sama sekali, hapus ID instans dengan memanggil metode DeleteInstanceId pada kelas FirebaseInstanceId . Contohnya:

FirebaseInstanceId.Instance.DeleteInstanceId();

Panggilan metode ini menghapus ID instans dan data yang terkait dengannya. Akibatnya, pengiriman data FCM secara berkala ke perangkat dihentikan.

Pemecahan Masalah

Berikut ini menjelaskan masalah dan solusi yang mungkin muncul saat menggunakan Firebase Cloud Messaging dengan Xamarin.Android.

FirebaseApp tidak Diinisialisasi

Dalam beberapa kasus, Anda mungkin melihat pesan kesalahan ini:

Java.Lang.IllegalStateException: Default FirebaseApp is not initialized in this process
Make sure to call FirebaseApp.initializeApp(Context) first.

Ini adalah masalah umum yang dapat Anda atasi dengan membersihkan solusi dan membangun kembali proyek (Bangun > Solusi Bersih, Bangun > Solusi Pembangunan Kembali).

Ringkasan

Panduan ini merinci langkah-langkah untuk menerapkan pemberitahuan jarak jauh Firebase Cloud Messaging dalam aplikasi Xamarin.Android. Ini menjelaskan cara menginstal paket yang diperlukan untuk komunikasi FCM, dan menjelaskan cara mengonfigurasi Manifes Android untuk akses ke server FCM. Ini memberikan contoh kode yang menggambarkan cara memeriksa keberadaan Google Play Services. Ini menunjukkan cara menerapkan layanan pendengar ID instans yang bernegosiasi dengan FCM untuk token pendaftaran, dan menjelaskan bagaimana kode ini membuat pemberitahuan latar belakang saat aplikasi di latar belakang. Ini menjelaskan cara berlangganan pesan topik, dan memberikan contoh implementasi layanan pendengar pesan yang digunakan untuk menerima dan menampilkan pemberitahuan jarak jauh saat aplikasi berjalan di latar depan.