Tutorial: Kirim pemberitahuan push ke perangkat Android tertentu menggunakan Google Cloud Messaging (tidak digunakan lagi)

Peringatan

Mulai 10 April 2018, Google telah menghentikan Google Cloud Messaging (GCM). Server GCM dan API klien sudah tidak digunakan lagi dan akan segera dihapus setelah 29 Mei 2019. Selengkapnya, lihatPertanyaan yang Sering Diajukan untuk GCM dan FCM.

Gambaran Umum

Tutorial ini menunjukkan cara menggunakan Microsoft Azure Notification Hubs untuk menyiarkan pemberitahuan berita terkini ke aplikasi Android. Setelah selesai, Anda dapat mendaftar untuk kategori berita terkini yang Anda minati, dan hanya menerima pemberitahuan push untuk kategori tersebut. Skenario ini merupakan pola umum yang digunakan berbagai aplikasi di mana pemberitahuan harus dikirim ke grup pengguna yang sebelumnya telah menyatakan minat mereka, seperti, pembaca RSS, aplikasi untuk penggemar musik, dll.

Skenario siaran aktif dengan menyertakan satu atau beberapa tag saat membuat pendaftaran di hub pemberitahuan. Ketika pemberitahuan dikirim ke tag, semua perangkat yang terdaftar untuk tag menerima pemberitahuan. Karena tag hanya berupa string, tag tidak harus disediakan terlebih dahulu. Untuk informasi selengkapnya tentang tag, lihat Perutean dan Ekspresi Tag Notification Hubs.

Dalam tutorial ini, lakukan tindakan ini:

  • Menambahkan pilihan kategori ke aplikasi ponsel.
  • Mendaftar untuk pemberitahuan dengan tag.
  • Mengirim pemberitahuan dengan tag.
  • Menguji aplikasi

Prasyarat

Tutorial ini dibangun pada aplikasi yang Anda buat di Tutorial: Pemberitahuan push ke perangkat Android dengan menggunakan Azure Notification Hubs dan Google Cloud Messaging. Sebelum memulai tutorial ini, lengkapi Tutorial: Pemberitahuan push ke perangkat Android dengan menggunakan Azure Notification Hubs dan Google Cloud Messaging.

Menambahkan pilihan kategori ke aplikasi

Langkah pertama adalah menambahkan elemen UI ke aktivitas utama Anda yang sudah ada yang memungkinkan pengguna untuk memilih kategori untuk mendaftar. Kategori yang dipilih oleh pengguna disimpan di perangkat. Saat aplikasi dimulai, aplikasi akan membuat pendaftaran perangkat di pemberitahuan hub Anda dengan kategori yang dipilih sebagai tag.

  1. Buka res/layout/activity_main.xml file, dan ganti konten tersebut dengan berikut ini:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.example.breakingnews.MainActivity"
        android:orientation="vertical">
    
            <CheckBox
                android:id="@+id/worldBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_world" />
            <CheckBox
                android:id="@+id/politicsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_politics" />
            <CheckBox
                android:id="@+id/businessBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_business" />
            <CheckBox
                android:id="@+id/technologyBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_technology" />
            <CheckBox
                android:id="@+id/scienceBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_science" />
            <CheckBox
                android:id="@+id/sportsBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/label_sports" />
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="subscribe"
                android:text="@string/button_subscribe" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                android:id="@+id/text_hello"
            />
    </LinearLayout>
    
  2. Buka file res/values/strings.xml dan tambahkan baris berikut:

    <string name="button_subscribe">Subscribe</string>
    <string name="label_world">World</string>
    <string name="label_politics">Politics</string>
    <string name="label_business">Business</string>
    <string name="label_technology">Technology</string>
    <string name="label_science">Science</string>
    <string name="label_sports">Sports</string>
    

    Tata letak grafis main_activity.xml Anda akan terlihat seperti pada gambar berikut:

    Screenshot of a development environment, with an app screen visible. The app lists the news categories that were added to the code.

  3. Buat kelas Notifications dalam paket yang sama dengan kelas MainActivity Anda.

    import java.util.HashSet;
    import java.util.Set;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.Toast;
    import android.view.View;
    
    import com.google.android.gms.gcm.GoogleCloudMessaging;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class Notifications {
        private static final String PREFS_NAME = "BreakingNewsCategories";
        private GoogleCloudMessaging gcm;
        private NotificationHub hub;
        private Context context;
        private String senderId;
    
        public Notifications(Context context, String senderId, String hubName,
                                String listenConnectionString) {
            this.context = context;
            this.senderId = senderId;
    
            gcm = GoogleCloudMessaging.getInstance(context);
            hub = new NotificationHub(hubName, listenConnectionString, context);
        }
    
        public void storeCategoriesAndSubscribe(Set<String> categories)
        {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            settings.edit().putStringSet("categories", categories).commit();
            subscribeToCategories(categories);
        }
    
        public Set<String> retrieveCategories() {
            SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
            return settings.getStringSet("categories", new HashSet<String>());
        }
    
        public void subscribeToCategories(final Set<String> categories) {
            new AsyncTask<Object, Object, Object>() {
                @Override
                protected Object doInBackground(Object... params) {
                    try {
                        String regid = gcm.register(senderId);
    
                        String templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
                        hub.registerTemplate(regid,"simpleGCMTemplate", templateBodyGCM,
                            categories.toArray(new String[categories.size()]));
                    } catch (Exception e) {
                        Log.e("MainActivity", "Failed to register - " + e.getMessage());
                        return e;
                    }
                    return null;
                }
    
                protected void onPostExecute(Object result) {
                    String message = "Subscribed for categories: "
                            + categories.toString();
                    Toast.makeText(context, message,
                            Toast.LENGTH_LONG).show();
                }
            }.execute(null, null, null);
        }
    
    }
    

    Kelas ini menggunakan penyimpanan lokal untuk menyimpan kategori berita yang harus diterima perangkat ini. Kelas ini juga berisi metode untuk mendaftar pada kategori ini.

  4. Di kelas MainActivity Anda hapus bidang pribadi Anda untuk NotificationHub dan GoogleCloudMessaging, dan tambahkan bidang untuk Notifications:

    // private GoogleCloudMessaging gcm;
    // private NotificationHub hub;
    private Notifications notifications;
    
  5. Kemudian, dalam metode onCreate, hapus inisialisasi bidang hub dan metode registerWithNotificationHubs. Kemudian tambahkan baris berikut, yang menginisialisasi instans kelas Notifications.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainActivity = this;
    
        NotificationsManager.handleNotifications(this, NotificationSettings.SenderId,
                MyHandler.class);
    
        notifications = new Notifications(this, NotificationSettings.SenderId, NotificationSettings.HubName, NotificationSettings.HubListenConnectionString);
    
        notifications.subscribeToCategories(notifications.retrieveCategories());
    }
    

    Pastikan bahwa nama hub dan string koneksi diatur dengan benar di kelas NotificationSettings.

    Catatan

    Karena info masuk yang didistribusikan dengan aplikasi klien biasanya tidak aman, sebaiknya Anda hanya mendistribusikan kunci untuk akses mendengarkan dengan aplikasi klien Anda. Akses mendengarkan memungkinkan aplikasi Anda untuk mendaftar pemberitahuan, namun pendaftaran yang sudah ada tidak dapat dimodifikasi, dan pemberitahuan tidak dapat dikirim. Kunci akses penuh digunakan dalam layanan ujung belakang yang aman untuk mengirim pemberitahuan dan mengubah pendaftaran yang sudah ada.

  6. Kemudian, tambahkan impor berikut:

    import android.widget.CheckBox;
    import java.util.HashSet;
    import java.util.Set;
    
  7. Tambahkan metode subscribeberikut untuk menangani kejadian klik tombol berlangganan:

    public void subscribe(View sender) {
        final Set<String> categories = new HashSet<String>();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        if (world.isChecked())
            categories.add("world");
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        if (politics.isChecked())
            categories.add("politics");
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        if (business.isChecked())
            categories.add("business");
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        if (technology.isChecked())
            categories.add("technology");
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        if (science.isChecked())
            categories.add("science");
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        if (sports.isChecked())
            categories.add("sports");
    
        notifications.storeCategoriesAndSubscribe(categories);
    }
    

    Metode ini membuat daftar kategori dan menggunakan kelas Notifications untuk menyimpan daftar di penyimpanan lokal dan mendaftarkan tag yang sesuai dengan hub pemberitahuan Anda. Ketika kategori diubah, pendaftaran dibuat ulang dengan kategori baru.

Aplikasi Anda sekarang dapat menyimpan set kategori di dalam penyimpanan lokal pada perangkat dan mendaftar dengan hub pemberitahuan setiap kali pengguna mengubah pilihan kategori.

Daftar untuk pemberitahuan

Langkah-langkah ini mendaftar dengan hub pemberitahuan pada saat mulai menggunakan kategori yang telah disimpan di penyimpanan lokal.

Catatan

Karena pendaftaran yang ditetapkan oleh Google Cloud Messaging (GCM) dapat berubah kapan saja, Anda harus sering mendaftar pemberitahuan untuk menghindari kegagalan pemberitahuan. Contoh ini mendaftar untuk pemberitahuan setiap kali aplikasi dimulai. Untuk aplikasi yang sering Anda jalankan, lebih dari sekali sehari, Anda mungkin dapat melewati pendaftaran untuk mempertahankan bandwidth jika kurang dari sehari telah berlalu sejak pendaftaran sebelumnya.

  1. Tambahkan kode berikut di akhir metode onCreate di kelas MainActivity:

    notifications.subscribeToCategories(notifications.retrieveCategories());
    

    Kode ini memastikan bahwa setiap kali aplikasi dimulai, aplikasi mengambil kategori dari penyimpanan lokal dan meminta pendaftaran untuk kategori ini.

  2. Kemudian perbarui metode onStart() kelas MainActivity dengan cara sebagai berikut:

    @Override
    protected void onStart() {
    
        super.onStart();
        isVisible = true;
    
        Set<String> categories = notifications.retrieveCategories();
    
        CheckBox world = (CheckBox) findViewById(R.id.worldBox);
        world.setChecked(categories.contains("world"));
        CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
        politics.setChecked(categories.contains("politics"));
        CheckBox business = (CheckBox) findViewById(R.id.businessBox);
        business.setChecked(categories.contains("business"));
        CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
        technology.setChecked(categories.contains("technology"));
        CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
        science.setChecked(categories.contains("science"));
        CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
        sports.setChecked(categories.contains("sports"));
    }
    

    Kode ini memperbarui halaman utama berdasarkan status kategori yang disimpan sebelumnya.

Aplikasi Anda sekarang sudah lengkap dan dapat menyimpan set kategori di dalam penyimpanan lokal pada perangkat yang digunakan untuk mendaftar menggunakan hub pemberitahuan setiap kali pengguna mengubah pilihan kategori. Selanjutnya, tentukan ujung belakang yang dapat mengirim pemberitahuan kategori ke aplikasi ini.

Mengirim pemberitahuan dengan tag

Di bagian ini, Anda mengirim berita terbaru sebagai notifikasi templat bertag dari aplikasi konsol .NET.

  1. Di Visual Studio, buat aplikasi konsol Visual Studio C# baru:

    1. Pada menu, pilih File>Baru>Proyek.
    2. Di Tambahkan proyek baru, pilih Aplikasi Konsol (.NET Framework) untuk C# di daftar templat, lalu pilih Berikutnya.
    3. Masukkan nama untuk aplikasi.
    4. Untuk Solusi, pilih Tambahkan ke solusi, dan pilih Buat untuk membuat proyek.
  2. Pilih Alat>Pengelola Paket NuGet>Konsol Pengelola Paket lalu, di jendela konsol jalankan perintah berikut:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Tindakan ini menambahkan referensi ke SDK Microsoft Azure Notification Hubs dengan menggunakan paket Microsoft.Azure.NotificationHubs.

  3. Buka file program.cs, lalu tambahkan penyataan using berikut:

    using Microsoft.Azure.NotificationHubs;
    
  4. Di kelas Program, tambahkan metode berikut atau ganti jika sudah ada:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Apple requires the apns-push-type header for all requests
        var headers = new Dictionary<string, string> {{"apns-push-type", "alert"}};
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" and the proper tags will receive the notifications.
        // This includes APNS, GCM/FCM, WNS, and MPNS template registrations.
    
        Dictionary<string, string> templateParams = new Dictionary<string, string>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    Kode ini mengirimkan pemberitahuan templat untuk masing-masing dari enam tag dalam array string. Penggunaan tag memastikan bahwa perangkat hanya menerima notifikasi untuk kategori yang terdaftar.

  5. Di kode sebelumnya, ganti tempat penampung <hub name> dan <connection string with full access> dengan nama hub notifikasi dan string koneksi untuk DefaultFullSharedAccessSignature dari dasbor hub notifikasi Anda.

  6. Dalam metode Main(), tambahkan baris berikut:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Membangun aplikasi konsol.

Menguji aplikasi

  1. Di Android Studio, jalankan aplikasi di perangkat Android atau emulator Anda. UI aplikasi menyediakan serangkaian pengalih yang memungkinkan Anda untuk memilih kategori untuk berlangganan.

  2. Aktifkan satu atau beberapa tombol kategori, lalu klik Berlangganan. Aplikasi ini mengkonversi kategori yang dipilih menjadi tag dan meminta pendaftaran perangkat baru untuk tag yang dipilih dari hub pemberitahuan. Kategori yang terdaftar dikembalikan dan ditampilkan dalam pemberitahuan toast.

    Subscribe for categories

  3. Jalankan aplikasi konsol .NET, yang mengirimkan pemberitahuan untuk setiap kategori. Pemberitahuan untuk kategori yang dipilih muncul sebagai pemberitahuan toast.

    Technology news notifications

Langkah berikutnya

Dalam tutorial ini, kirim pemberitahuan siaran ke perangkat Android tertentu yang telah mendaftar untuk kategori tersebut. Untuk mempelajari cara mengirim pemberitahuan push ke pengguna tertentu, lanjutkan ke tutorial berikut: