Bagikan melalui


Pemberitahuan Jarak Jauh Dengan Google Cloud Messaging

Peringatan

GCM google tidak digunakan lagi per 10 April 2018. Dokumen dan proyek sampel berikut mungkin tidak lagi dipertahankan. API server dan klien GCM Google akan dihapus segera setelah 29 Mei 2019. Google merekomendasikan migrasi aplikasi GCM ke Firebase Cloud Messaging (FCM). Untuk informasi selengkapnya tentang penghentian dan migrasi GCM, lihat Google Cloud Messaging - TIDAK DIGUNAKAN LAGI.

Untuk mulai menggunakan Pemberitahuan Jarak Jauh menggunakan Firebase Cloud Messaging dengan Xamarin, lihat Pemberitahuan Jarak Jauh dengan FCM.

Panduan ini memberikan penjelasan langkah demi langkah tentang cara menggunakan Google Cloud Messaging untuk menerapkan pemberitahuan jarak jauh (juga disebut pemberitahuan push) dalam aplikasi Xamarin.Android. Ini menjelaskan berbagai kelas yang harus Anda terapkan untuk berkomunikasi dengan Google Cloud Messaging (GCM), ini menjelaskan cara mengatur izin di Manifes Android untuk akses ke GCM, dan menunjukkan olahpesan end-to-end dengan program pengujian sampel.

Gambaran Umum Pemberitahuan GCM

Dalam panduan ini, kita akan membuat aplikasi Xamarin.Android yang menggunakan Google Cloud Messaging (GCM) untuk menerapkan pemberitahuan jarak jauh (juga dikenal sebagai pemberitahuan push). Kami akan menerapkan berbagai layanan niat dan pendengar yang menggunakan GCM untuk olahpesan jarak jauh, dan kami akan menguji implementasi kami dengan program baris perintah yang mensimulasikan server aplikasi.

Sebelum dapat melanjutkan panduan ini, Anda harus memperoleh kredensial yang diperlukan untuk menggunakan server GCM Google; proses ini dijelaskan di Google Cloud Messaging. Secara khusus, Anda akan memerlukan Kunci API dan ID Pengirim untuk menyisipkan ke dalam kode contoh yang disajikan dalam panduan ini.

Kami akan menggunakan langkah-langkah berikut untuk membuat aplikasi klien Xamarin.Android dengan dukungan GCM:

  1. Instal paket tambahan yang diperlukan untuk komunikasi dengan server GCM.
  2. Mengonfigurasi izin aplikasi untuk akses ke server GCM.
  3. Terapkan kode untuk memeriksa keberadaan Layanan Google Play.
  4. Terapkan layanan niat pendaftaran yang bernegosiasi dengan GCM untuk token pendaftaran.
  5. Terapkan layanan listener ID instans yang mendengarkan pembaruan token pendaftaran dari GCM.
  6. Terapkan layanan pendengar GCM yang menerima pesan jarak jauh dari server aplikasi melalui GCM.

Aplikasi ini akan menggunakan fitur GCM baru yang dikenal sebagai pesan topik. Dalam pesan topik, server aplikasi mengirim pesan ke topik, bukan ke daftar perangkat individual. Perangkat yang berlangganan topik tersebut dapat menerima pesan topik sebagai pemberitahuan push.

Ketika aplikasi klien siap, kami akan menerapkan aplikasi C# baris perintah yang mengirim pemberitahuan push ke aplikasi klien kami melalui GCM.

Panduan

Untuk memulai, mari kita buat Solusi kosong baru yang disebut RemoteNotifications. Selanjutnya, mari kita tambahkan proyek Android baru ke Solusi ini yang didasarkan pada templat Aplikasi Android. Mari kita panggil proyek ini ClientApp. (Jika Anda tidak terbiasa membuat proyek Xamarin.Android, lihat Halo, Android.) Proyek ClientApp akan berisi kode untuk aplikasi klien Xamarin.Android yang menerima pemberitahuan jarak jauh melalui GCM.

Tambahkan Paket yang Diperlukan

Sebelum dapat menerapkan kode aplikasi klien, kita harus menginstal beberapa paket yang akan kita gunakan untuk komunikasi dengan GCM. Selain itu, kita harus menambahkan aplikasi Google Play Store ke perangkat kita jika belum diinstal.

Menambahkan Paket GCM Xamarin Google Play Services

Untuk menerima pesan dari Google Cloud Messaging, kerangka kerja Google Play Services harus ada di perangkat. Tanpa kerangka kerja ini, aplikasi Android tidak dapat menerima pesan dari server GCM. Layanan Google Play berjalan di latar belakang saat perangkat Android dinyalakan, mendengarkan pesan dari GCM dengan diam-diam. Ketika pesan ini tiba, Google Play Services mengonversi pesan menjadi niat dan kemudian menyiarkan niat ini ke aplikasi yang telah mendaftarkannya.

Di Visual Studio, klik kanan Referensi > Kelola Paket NuGet ...; di Visual Studio untuk Mac, klik kanan Paket > Tambahkan Paket.... Cari Xamarin Google Play Services - GCM dan instal paket ini ke dalam proyek ClientApp:

Installing Google Play Services

Saat Anda menginstal Xamarin Google Play Services - GCM, Xamarin Google Play Services - Base diinstal secara otomatis. Jika Anda mendapatkan kesalahan, ubah pengaturan Minimum Android untuk menargetkan proyek ke nilai selain Mengkompilasi menggunakan versi SDK dan coba instal NuGet lagi.

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

using Android.Gms.Common;
using Android.Util;

Ini membuat jenis dalam paket GMS Google Play Services tersedia untuk kode kami, dan menambahkan fungsionalitas pengelogan yang akan kami gunakan untuk melacak transaksi kami dengan GMS.

Google Play Store

Untuk menerima pesan dari GCM, aplikasi Google Play Store harus diinstal di perangkat. (Setiap kali aplikasi Google Play diinstal di perangkat, Google Play Store juga diinstal, sehingga kemungkinan aplikasi tersebut sudah diinstal di perangkat pengujian Anda.) Tanpa Google Play, aplikasi Android tidak dapat menerima pesan dari GCM. Jika Anda belum menginstal aplikasi Google Play Store di perangkat, kunjungi situs web Google Play untuk mengunduh dan menginstal Google Play.

Sebagai alternatif, Anda dapat menggunakan emulator Android yang menjalankan Android 2.2 atau yang lebih baru alih-alih perangkat pengujian (Anda tidak perlu menginstal Google Play Store di emulator Android). Namun, jika Anda menggunakan emulator, Anda harus menggunakan Wi-Fi untuk terhubung ke GCM dan Anda harus membuka beberapa port di firewall Wi-Fi seperti yang dijelaskan nanti dalam panduan ini.

Atur Nama Paket

Di Google Cloud Messaging, kami menentukan nama paket untuk aplikasi berkemampuan GCM kami (nama paket ini juga berfungsi sebagai ID aplikasi yang terkait dengan kunci API dan ID Pengirim kami). Mari kita buka properti untuk proyek ClientApp dan atur nama paket ke string ini. Dalam contoh ini, kami mengatur nama paket ke com.xamarin.gcmexample:

Setting the package name

Perhatikan bahwa aplikasi klien tidak akan dapat menerima token pendaftaran dari GCM jika nama paket ini tidak sama persis dengan nama paket yang kami masukkan ke konsol Google Developer.

Menambahkan Izin ke Manifes Android

Aplikasi Android harus memiliki izin berikut yang dikonfigurasi sebelum dapat menerima pemberitahuan dari Google Cloud Messaging:

  • com.google.android.c2dm.permission.RECEIVE – Memberikan izin ke aplikasi kami untuk mendaftar dan menerima pesan dari Google Cloud Messaging. (Apa artinya c2dm ? Ini adalah singkatan dari Cloud to Device Messaging, yang merupakan pendahulu yang sekarang tidak digunakan lagi untuk GCM. GCM masih menggunakan c2dm dalam banyak string izinnya.)

  • android.permission.WAKE_LOCK – (Opsional) Mencegah CPU perangkat tidur saat mendengarkan pesan.

  • android.permission.INTERNET – Memberikan akses internet sehingga aplikasi klien dapat berkomunikasi dengan GCM.

  • .permission.C2D_MESSAGE package_name – Mendaftarkan aplikasi dengan Android dan meminta izin untuk menerima semua pesan C2D (cloud ke perangkat) secara eksklusif. Awalan package_name sama dengan ID aplikasi Anda.

Kami akan mengatur izin ini di manifes Android. Mari kita edit AndroidManifest.xml dan ganti konten dengan XML berikut:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="YOUR_PACKAGE_NAME"
    android:versionCode="1"
    android:versionName="1.0"
    android:installLocation="auto">
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE" />
    <permission android:name="YOUR_PACKAGE_NAME.permission.C2D_MESSAGE"
                android:protectionLevel="signature" />
    <application android:label="ClientApp" android:icon="@drawable/Icon">
    </application>
</manifest>

Di XML di atas, ubah YOUR_PACKAGE_NAME ke nama paket untuk proyek aplikasi klien Anda. Contohnya,com.xamarin.gcmexample.

Periksa Layanan Google Play

Untuk panduan ini, kami membuat aplikasi bare-bones dengan satu TextView di UI. Aplikasi ini tidak secara langsung menunjukkan interaksi dengan GCM. Sebagai gantinya, kita akan melihat jendela output untuk melihat bagaimana aplikasi kita berjabat tangan dengan GCM, dan kita akan memeriksa baki pemberitahuan untuk pemberitahuan baru saat mereka tiba.

Pertama, mari kita buat tata letak untuk area pesan. Edit Resources.layout.Main.axml dan ganti konten 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>

Simpan Main.axml dan tutup.

Saat aplikasi klien dimulai, kami ingin aplikasi tersebut memverifikasi bahwa Layanan Google Play tersedia sebelum kami mencoba menghubungi GCM. Edit MainActivity.cs dan ganti count deklarasi variabel instans dengan deklarasi variabel instans berikut:

TextView msgText;

Selanjutnya, 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 = "Sorry, 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 di area pesan yang menginstruksikan pengguna untuk mengunduh APK dari Google Play Store (atau mengaktifkannya di pengaturan sistem perangkat). Karena kita ingin menjalankan pemeriksaan ini ketika aplikasi klien dimulai, kita akan menambahkan panggilan ke metode ini di akhir OnCreate.

Selanjutnya, ganti OnCreate metode dengan kode berikut:

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    SetContentView (Resource.Layout.Main);
    msgText = FindViewById<TextView> (Resource.Id.msgText);

    IsPlayServicesAvailable ();
}

Kode ini memeriksa keberadaan APK Google Play Services dan menulis hasilnya ke area pesan.

Mari kita bangun kembali dan jalankan aplikasi sepenuhnya. Anda akan melihat layar yang terlihat seperti cuplikan layar berikut:

Google Play Services is available

Jika Anda tidak mendapatkan hasil ini, verifikasi bahwa GOOGLE Play Services APK diinstal di perangkat Anda dan bahwa paket Xamarin Google Play Services - GCM ditambahkan ke proyek ClientApp Anda seperti yang dijelaskan sebelumnya. Jika Anda mendapatkan kesalahan build, coba bersihkan Solusi dan bangun proyek lagi.

Selanjutnya, kita akan menulis kode untuk menghubungi GCM dan mendapatkan kembali token pendaftaran.

Mendaftar dengan GCM

Sebelum aplikasi dapat menerima pemberitahuan jarak jauh dari server aplikasi, aplikasi harus mendaftar dengan GCM dan mendapatkan kembali token pendaftaran. Pekerjaan mendaftarkan aplikasi kami dengan GCM ditangani oleh yang IntentService kami buat. Kami IntentService melakukan langkah-langkah berikut:

  1. Menggunakan API InstanceID untuk menghasilkan token keamanan yang mengotorisasi aplikasi klien kami untuk mengakses server aplikasi. Sebagai imbalannya, kami mendapatkan kembali token pendaftaran dari GCM.

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

  3. Berlangganan ke satu atau beberapa saluran topik pemberitahuan.

Setelah menerapkan ini IntentService, kita akan mengujinya untuk melihat apakah kita mendapatkan kembali token pendaftaran dari GCM.

Tambahkan file baru yang disebut RegistrationIntentService.cs dan ganti kode templat dengan yang berikut ini:

using System;
using Android.App;
using Android.Content;
using Android.Util;
using Android.Gms.Gcm;
using Android.Gms.Gcm.Iid;

namespace ClientApp
{
    [Service(Exported = false)]
    class RegistrationIntentService : IntentService
    {
        static object locker = new object();

        public RegistrationIntentService() : base("RegistrationIntentService") { }

        protected override void OnHandleIntent (Intent intent)
        {
            try
            {
                Log.Info ("RegistrationIntentService", "Calling InstanceID.GetToken");
                lock (locker)
                {
                    var instanceID = InstanceID.GetInstance (this);
                    var token = instanceID.GetToken (
                        "YOUR_SENDER_ID", GoogleCloudMessaging.InstanceIdScope, null);

                    Log.Info ("RegistrationIntentService", "GCM Registration Token: " + token);
                    SendRegistrationToAppServer (token);
                    Subscribe (token);
                }
            }
            catch (Exception e)
            {
                Log.Debug("RegistrationIntentService", "Failed to get a registration token");
                return;
            }
        }

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

        void Subscribe (string token)
        {
            var pubSub = GcmPubSub.GetInstance(this);
            pubSub.Subscribe(token, "/topics/global", null);
        }
    }
}

Dalam kode sampel di atas, ubah YOUR_SENDER_ID ke nomor ID Pengirim untuk proyek aplikasi klien Anda. Untuk mendapatkan ID Pengirim untuk proyek Anda:

  1. Masuk ke Google Cloud Console dan pilih nama proyek Anda dari menu tarik ke bawah. Di panel Info proyek yang ditampilkan untuk proyek Anda, klik Buka pengaturan proyek:

    Selecting XamarinGCM project

  2. Pada halaman Pengaturan, temukan nomor Proyek - ini adalah ID Pengirim untuk proyek Anda:

    Project number displayed

Kami ingin memulai saat RegistrationIntentService aplikasi kami mulai berjalan. Edit MainActivity.cs dan ubah OnCreate metode sehingga kami RegistrationIntentService dimulai setelah kami memeriksa keberadaan Layanan Google Play:

protected override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);

    SetContentView(Resource.Layout.Main);
    msgText = FindViewById<TextView> (Resource.Id.msgText);

    if (IsPlayServicesAvailable ())
    {
        var intent = new Intent (this, typeof (RegistrationIntentService));
        StartService (intent);
    }
}

Sekarang mari kita lihat setiap bagian RegistrationIntentService untuk memahami cara kerjanya.

Pertama, kami membuat anotasi dengan RegistrationIntentService atribut berikut untuk menunjukkan bahwa layanan kami tidak akan dibuat oleh sistem:

[Service (Exported = false)]

RegistrationIntentService Konstruktor memberi nama alur pekerja RegistrationIntentService untuk mempermudah penelusuran kesalahan.

public RegistrationIntentService() : base ("RegistrationIntentService") { }

Fungsionalitas RegistrationIntentService inti berada dalam OnHandleIntent metode . Mari kita telusuri kode ini untuk melihat caranya mendaftarkan aplikasi kami dengan GCM.

Meminta Token Pendaftaran

OnHandleIntentpertama memanggil metode InstanceID.GetToken Google untuk meminta token pendaftaran dari GCM. Kami membungkus kode lock ini untuk menjaga terhadap kemungkinan beberapa niat pendaftaran terjadi secara bersamaan - lock memastikan bahwa niat ini diproses secara berurutan. Jika kami gagal mendapatkan token pendaftaran, pengecualian akan dilemparkan dan kami mencatat kesalahan. Jika pendaftaran berhasil, token diatur ke token pendaftaran yang kami dapatkan kembali dari GCM:

static object locker = new object ();
...
try
{
    lock (locker)
    {
        var instanceID = InstanceID.GetInstance (this);
        var token = instanceID.GetToken (
            "YOUR_SENDER_ID", GoogleCloudMessaging.InstanceIdScope, null);
        ...
    }
}
catch (Exception e)
{
    Log.Debug ...

Meneruskan Token Pendaftaran ke Server Aplikasi

Jika kami mendapatkan token pendaftaran (yaitu, tidak ada pengecualian yang dilemparkan), kami memanggil SendRegistrationToAppServer untuk mengaitkan token pendaftaran pengguna dengan akun sisi server (jika ada) yang dikelola oleh aplikasi kami. Karena implementasi ini tergantung pada desain server aplikasi, metode kosong disediakan di sini:

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

Dalam beberapa kasus, server aplikasi tidak memerlukan token pendaftaran pengguna; dalam hal ini, metode ini dapat dihilangkan. Ketika token pendaftaran 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.

Berlangganan Topik Pemberitahuan

Selanjutnya, kami memanggil metode kami Subscribe untuk menunjukkan kepada GCM bahwa kami ingin berlangganan topik pemberitahuan. Dalam Subscribe, kami memanggil API GcmPubSub.Subscribe untuk berlangganan aplikasi klien kami ke semua pesan di bawah /topics/global:

void Subscribe (string token)
{
    var pubSub = GcmPubSub.GetInstance(this);
    pubSub.Subscribe(token, "/topics/global", null);
}

Server aplikasi harus mengirim pesan pemberitahuan ke /topics/global jika kita menerimanya. Perhatikan bahwa nama topik di bawah /topics bisa menjadi apa pun yang Anda inginkan, selama server aplikasi dan aplikasi klien sama-sama menyetujui nama-nama ini. (Di sini, kami memilih nama global untuk menunjukkan bahwa kami ingin menerima pesan pada semua topik yang didukung oleh server aplikasi.)

Menerapkan Layanan Pendengar ID Instans

Token pendaftaran unik dan aman; namun, aplikasi klien (atau GCM) mungkin perlu merefresh token pendaftaran jika terjadi penginstalan ulang aplikasi atau masalah keamanan. Untuk alasan ini, kita harus menerapkan InstanceIdListenerService yang menanggapi permintaan refresh token dari GCM.

Tambahkan file baru yang disebut InstanceIdListenerService.cs dan ganti kode templat dengan yang berikut ini:

using Android.App;
using Android.Content;
using Android.Gms.Gcm.Iid;

namespace ClientApp
{
    [Service(Exported = false), IntentFilter(new[] { "com.google.android.gms.iid.InstanceID" })]
    class MyInstanceIDListenerService : InstanceIDListenerService
    {
        public override void OnTokenRefresh()
        {
            var intent = new Intent (this, typeof (RegistrationIntentService));
            StartService (intent);
        }
    }
}

Anotasi InstanceIdListenerService dengan atribut berikut untuk menunjukkan bahwa layanan tidak akan dibuat oleh sistem dan dapat menerima permintaan refresh token pendaftaran GCM (juga disebut ID instans):

[Service(Exported = false), IntentFilter(new[] { "com.google.android.gms.iid.InstanceID" })]

Metode OnTokenRefresh dalam layanan kami memulai RegistrationIntentService sehingga dapat mencegat token pendaftaran baru.

Uji Pendaftaran dengan GCM

Mari kita bangun kembali dan jalankan aplikasi sepenuhnya. Jika Anda berhasil menerima token pendaftaran dari GCM, token pendaftaran harus ditampilkan di jendela output. Contohnya:

D/Mono    ( 1934): Assembly Ref addref ClientApp[0xb4ac2400] -> Xamarin.GooglePlayServices.Gcm[0xb4ac2640]: 2
I/RegistrationIntentService( 1934): Calling InstanceID.GetToken
I/RegistrationIntentService( 1934): GCM Registration Token: f8LdveCvXig:APA91bFIsjUAbP-V8TPQdLR89qQbEJh1SYG38AcCbBUf34z5gSdUc5OsXrgs93YFiGcRSRafPfzkz23lf3-LvYV1CwrFheMjHgwPeFSh12MywnRIhz

Menangani Pesan Hilir

Kode yang telah kami terapkan sejauh ini hanya kode "pengaturan"; ini memeriksa untuk melihat apakah Google Play Services diinstal dan bernegosiasi dengan GCM dan server aplikasi untuk menyiapkan aplikasi klien kami untuk menerima pemberitahuan jarak jauh. Namun, kami belum menerapkan kode yang benar-benar menerima dan memproses pesan pemberitahuan hilir. Untuk melakukan ini, kita harus menerapkan Layanan Pendengar GCM. Layanan ini menerima pesan topik dari server aplikasi dan menyiarkannya secara lokal sebagai pemberitahuan. Setelah menerapkan layanan ini, kami akan membuat program pengujian untuk mengirim pesan ke GCM sehingga kami dapat melihat apakah implementasi kami berfungsi dengan benar.

Tambahkan Ikon Pemberitahuan

Mari kita pertama-tama tambahkan ikon kecil yang akan muncul di area pemberitahuan saat pemberitahuan kami diluncurkan. Anda dapat menyalin ikon ini ke proyek Anda atau membuat ikon kustom Anda sendiri. Kami akan memberi nama file ikon ic_stat_button_click.png dan menyalinnya ke folder Sumber Daya/yang dapat digambar. Ingatlah untuk menggunakan Tambahkan > Item yang Ada ... untuk menyertakan file ikon ini dalam proyek Anda.

Menerapkan Layanan Pendengar GCM

Tambahkan file baru yang disebut GcmListenerService.cs dan ganti kode templat dengan yang berikut ini:

using Android.App;
using Android.Content;
using Android.OS;
using Android.Gms.Gcm;
using Android.Util;

namespace ClientApp
{
    [Service (Exported = false), IntentFilter (new [] { "com.google.android.c2dm.intent.RECEIVE" })]
    public class MyGcmListenerService : GcmListenerService
    {
        public override void OnMessageReceived (string from, Bundle data)
        {
            var message = data.GetString ("message");
            Log.Debug ("MyGcmListenerService", "From:    " + from);
            Log.Debug ("MyGcmListenerService", "Message: " + message);
            SendNotification (message);
        }

        void SendNotification (string message)
        {
            var intent = new Intent (this, typeof(MainActivity));
            intent.AddFlags (ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity (this, 0, intent, PendingIntentFlags.OneShot);

            var notificationBuilder = new Notification.Builder(this)
                .SetSmallIcon (Resource.Drawable.ic_stat_ic_notification)
                .SetContentTitle ("GCM Message")
                .SetContentText (message)
                .SetAutoCancel (true)
                .SetContentIntent (pendingIntent);

            var notificationManager = (NotificationManager)GetSystemService(Context.NotificationService);
            notificationManager.Notify (0, notificationBuilder.Build());
        }
    }
}

Mari kita lihat setiap bagian dari kita GcmListenerService untuk memahami cara kerjanya.

Pertama, kami membuat anotasi GcmListenerService dengan atribut untuk menunjukkan bahwa layanan ini tidak akan dibuat oleh sistem, dan kami menyertakan filter niat untuk menunjukkan bahwa layanan ini menerima pesan GCM:

[Service (Exported = false), IntentFilter (new [] { "com.google.android.c2dm.intent.RECEIVE" })]

Ketika GcmListenerService menerima pesan dari GCM, OnMessageReceived metode dipanggil. Metode ini mengekstrak konten pesan dari yang diteruskan Bundle, mencatat konten pesan (sehingga kita dapat melihatnya di jendela output), dan panggilan SendNotification untuk meluncurkan pemberitahuan lokal dengan konten pesan yang diterima:

var message = data.GetString ("message");
Log.Debug ("MyGcmListenerService", "From:    " + from);
Log.Debug ("MyGcmListenerService", "Message: " + message);
SendNotification (message);

Metode ini SendNotification menggunakan Notification.Builder untuk membuat pemberitahuan, lalu menggunakan NotificationManager untuk meluncurkan pemberitahuan. Secara efektif, ini mengonversi pesan pemberitahuan jarak jauh menjadi pemberitahuan lokal untuk disajikan kepada pengguna. Untuk informasi selengkapnya tentang menggunakan Notification.Builder dan NotificationManager, lihat Pemberitahuan Lokal.

Mendeklarasikan Penerima dalam Manifes

Sebelum dapat menerima pesan dari GCM, kita harus mendeklarasikan listener GCM dalam manifes Android. Mari kita edit AndroidManifest.xml dan ganti bagian <application> dengan XML berikut:

<application android:label="RemoteNotifications" android:icon="@drawable/Icon">
    <receiver android:name="com.google.android.gms.gcm.GcmReceiver"
              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="YOUR_PACKAGE_NAME" />
        </intent-filter>
    </receiver>
</application>

Di XML di atas, ubah YOUR_PACKAGE_NAME ke nama paket untuk proyek aplikasi klien Anda. Dalam contoh penelusuran kami, nama paketnya adalah com.xamarin.gcmexample.

Mari kita lihat apa yang dilakukan setiap pengaturan dalam XML ini:

Pengaturan Deskripsi
com.google.android.gms.gcm.GcmReceiver Menyatakan bahwa aplikasi kami mengimplementasikan penerima GCM yang menangkap dan memproses pesan pemberitahuan push masuk.
com.google.android.c2dm.permission.SEND Menyatakan bahwa hanya server GCM yang dapat mengirim pesan langsung ke aplikasi.
com.google.android.c2dm.intent.RECEIVE Iklan filter niat yang ditangani aplikasi kami menangani pesan siaran dari GCM.
com.google.android.c2dm.intent.REGISTRATION Iklan filter niat yang aplikasi kami tangani niat pendaftaran baru (artinya, kami telah menerapkan Instance ID Listener Service).

Atau, Anda dapat menghias GcmListenerService dengan atribut ini daripada menentukannya di XML; di sini kami menentukannya dalam AndroidManifest.xml sehingga sampel kode lebih mudah diikuti.

Membuat Pengirim Pesan untuk Menguji Aplikasi

Mari kita tambahkan proyek aplikasi konsol desktop C# ke Solusi dan menyebutnya MessageSender. Kami akan menggunakan aplikasi konsol ini untuk mensimulasikan server aplikasi - aplikasi akan mengirim pesan pemberitahuan ke ClientApp melalui GCM.

Menambahkan Paket Json.NET

Di aplikasi konsol ini, kami membangun payload JSON yang berisi pesan pemberitahuan yang ingin kami kirim ke aplikasi klien. Kita akan menggunakan paket Json.NET di MessageSender untuk mempermudah pembuatan objek JSON yang diperlukan oleh GCM. Di Visual Studio, klik kanan Referensi > Kelola Paket NuGet ...; di Visual Studio untuk Mac, klik kanan Paket > Tambahkan Paket....

Mari kita cari paket Json.NET dan instal dalam proyek:

Installing the Json.NET package

Menambahkan Referensi ke System.Net.Http

Kita juga perlu menambahkan referensi System.Net.Http sehingga kita dapat membuat contoh HttpClient untuk mengirim pesan pengujian kita ke GCM. Dalam proyek MessageSender, Klik kanan Referensi > Tambahkan Referensi dan gulir ke bawah hingga Anda melihat System.Net.Http. Letakkan tanda centang di samping System.Net.Http dan klik OK.

Menerapkan Kode yang Mengirim Pesan Pengujian

Di MessageSender, edit Program.cs dan ganti konten dengan kode berikut:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace MessageSender
{
    class MessageSender
    {
        public const string API_KEY = "YOUR_API_KEY";
        public const string MESSAGE = "Hello, Xamarin!";

        static void Main (string[] args)
        {
            var jGcmData = new JObject();
            var jData = new JObject();

            jData.Add ("message", MESSAGE);
            jGcmData.Add ("to", "/topics/global");
            jGcmData.Add ("data", jData);

            var url = new Uri ("https://gcm-http.googleapis.com/gcm/send");
            try
            {
                using (var client = new HttpClient())
                {
                    client.DefaultRequestHeaders.Accept.Add(
                        new MediaTypeWithQualityHeaderValue("application/json"));

                    client.DefaultRequestHeaders.TryAddWithoutValidation (
                        "Authorization", "key=" + API_KEY);

                    Task.WaitAll(client.PostAsync (url,
                        new StringContent(jGcmData.ToString(), Encoding.Default, "application/json"))
                            .ContinueWith(response =>
                            {
                                Console.WriteLine(response);
                                Console.WriteLine("Message sent: check the client device notification tray.");
                            }));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Unable to send GCM message:");
                Console.Error.WriteLine(e.StackTrace);
            }
        }
    }
}

Dalam kode di atas, ubah YOUR_API_KEY ke Kunci API untuk proyek aplikasi klien Anda.

Server aplikasi pengujian ini mengirimkan pesan berformat JSON berikut ke GCM:

{
  "to": "/topics/global",
  "data": {
    "message": "Hello, Xamarin!"
  }
}

GCM, pada gilirannya, meneruskan pesan ini ke aplikasi klien Anda. Mari kita buat MessageSender dan buka jendela konsol tempat kita dapat menjalankannya dari baris perintah.

Cobalah!

Sekarang kami siap untuk menguji aplikasi klien kami. Jika Anda menggunakan emulator atau jika perangkat berkomunikasi dengan GCM melalui Wi-Fi, Anda harus membuka port TCP berikut di firewall agar pesan GCM dapat melalui: 5228, 5229, dan 5230.

Mulai aplikasi klien Anda dan tonton jendela output. RegistrationIntentService Setelah berhasil menerima token pendaftaran dari GCM, jendela output harus menampilkan token dengan output log yang menyerupai yang berikut ini:

I/RegistrationIntentService(16103): GCM Registration Token: eX9ggabZV1Q:APA91bHjBnQXMUeBOT6JDiLpRt8m2YWtY ...

Pada titik ini aplikasi klien siap untuk menerima pesan pemberitahuan jarak jauh. Dari baris perintah, jalankan program MessageSender.exe untuk mengirim pesan pemberitahuan "Halo, Xamarin" ke aplikasi klien. Jika Anda belum membangun proyek MessageSender , lakukan sekarang.

Untuk menjalankan MessageSender.exe di bawah Visual Studio, buka perintah, ubah ke direktori MessageSender/bin/Debug , dan jalankan perintah secara langsung:

MessageSender.exe

Untuk menjalankan MessageSender.exe di bawah Visual Studio untuk Mac, buka sesi Terminal, ubah ke MessageSender/bin/Debug direktori, dan gunakan mono untuk menjalankan MessageSender.exe

mono MessageSender.exe

Mungkin perlu waktu hingga satu menit agar pesan disebarluaskan melalui GCM dan kembali ke aplikasi klien Anda. Jika pesan berhasil diterima, kita akan melihat output yang menyerupai berikut ini di jendela output:

D/MyGcmListenerService(16103): From:    /topics/global
D/MyGcmListenerService(16103): Message: Hello, Xamarin!

Selain itu, Anda harus melihat bahwa ikon pemberitahuan baru telah muncul di baki pemberitahuan:

Notification icon appears on device

Saat Anda membuka baki pemberitahuan untuk melihat pemberitahuan, Anda akan melihat pemberitahuan jarak jauh kami:

Notification message is displayed

Selamat, aplikasi Anda telah menerima pemberitahuan jarak jauh pertamanya!

Perhatikan bahwa pesan GCM tidak akan lagi diterima jika aplikasi dihentikan paksa. Untuk melanjutkan pemberitahuan setelah penghentian paksa, aplikasi harus dimulai ulang secara manual. Untuk informasi selengkapnya tentang kebijakan Android ini, lihat Meluncurkan kontrol pada aplikasi yang dihentikan dan posting luapan tumpukan ini.

Ringkasan

Panduan ini merinci langkah-langkah untuk menerapkan pemberitahuan jarak jauh dalam aplikasi Xamarin.Android. Ini menjelaskan cara menginstal paket tambahan yang diperlukan untuk komunikasi GCM, dan menjelaskan cara mengonfigurasi izin aplikasi untuk akses ke server GCM. Ini memberikan contoh kode yang menggambarkan cara memeriksa keberadaan Layanan Google Play, cara menerapkan layanan niat pendaftaran dan layanan pendengar ID instans yang bernegosiasi dengan GCM untuk token pendaftaran, dan cara menerapkan layanan pendengar GCM yang menerima dan memproses pesan pemberitahuan jarak jauh. Terakhir, kami menerapkan program uji baris perintah untuk mengirim pemberitahuan pengujian ke aplikasi klien kami melalui GCM.