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:
Area topik berikut akan dieksplorasi:
Pemberitahuan Latar Belakang
Pesan Topik
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:
Buka properti untuk proyek FCMClient .
Di halaman Manifes Android, atur nama paket.
Dalam contoh berikut, nama paket diatur ke com.xamarin.fcmexample
:
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.
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.
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:
Salin google-services.json ke folder proyek.
Tambahkan google-services.json ke proyek aplikasi (klik Perlihatkan Semua File di Penjelajah Solusi, klik kanan google-services.json, lalu pilih Sertakan dalam Proyek).
Pilih google-services.json di jendela Penjelajah Solusi.
Di panel Properti , atur Build Action 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:
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:
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.
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:
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:
Ketuk tombol Token Log. Pesan seperti berikut ini harus ditampilkan di jendela output IDE:
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:
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:
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:
Saat dialog Tinjau pesan ditampilkan, klik KIRIM. Ikon pemberitahuan akan muncul di area pemberitahuan perangkat (atau emulator):
Buka ikon pemberitahuan untuk melihat pesan. Pesan pemberitahuan harus persis apa yang ditik ke dalam bidang teks Pesan dari Firebase Console:
Ketuk ikon pemberitahuan untuk meluncurkan aplikasi FCMClient . Ekstra Intent
yang dikirim ke FCMClient tercantum di jendela output IDE:
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 :
Jika aplikasi berhasil berlangganan, Anda akan melihat sinkronisasi topik berhasil di jendela output IDE:
Gunakan langkah-langkah berikut untuk mengirim pesan topik:
Di Firebase Console, klik PESAN BARU.
Pada halaman Buat pesan , masukkan teks pesan dan pilih Topik.
Di menu tarik-turun Topik, pilih topik bawaan, berita:
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.
Periksa jendela output IDE untuk melihat /topics/news dalam output log:
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:
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:
Di Firebase Console, klik PESAN BARU.
Pada halaman Buat pesan , masukkan teks pesan dan pilih Perangkat tunggal.
Salin string token dari jendela output IDE dan tempelkan ke bidang token pendaftaran FCM dari Firebase Console seperti sebelumnya.
Pastikan aplikasi berjalan di latar depan, lalu klik KIRIM PESAN di Firebase Console:
Saat dialog Tinjau pesan ditampilkan, klik KIRIM.
Pesan masuk dicatat ke jendela output IDE:
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
aplikasiIntent
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:
Di Firebase Console, klik PESAN BARU.
Pada halaman Buat pesan , masukkan teks pesan dan pilih Perangkat tunggal.
Salin string token dari jendela output IDE dan tempelkan ke bidang token pendaftaran FCM dari Firebase Console seperti sebelumnya.
Pastikan aplikasi berjalan di latar depan, lalu klik KIRIM PESAN di Firebase Console:
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:
Saat membuka pemberitahuan, Anda akan melihat pesan terakhir yang dikirim dari GUI Pemberitahuan Firebase Console:
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.