Bagikan melalui


Tutorial: Mengirim pemberitahuan ke perangkat tertentu menggunakan Notification Hubs dan Google Firebase Cloud Messaging

Gambaran Umum

Penting

Pada Juni 2024, API warisan FCM tidak akan lagi didukung dan akan dihentikan. Untuk menghindari gangguan dalam layanan pemberitahuan push, Anda harus bermigrasi ke protokol FCM v1 sesegera mungkin.

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 untai (karakter), tag tidak harus diprovisikan terlebih dahulu. Untuk informasi selengkapnya tentang tag, lihat Perutean dan Ekspresi Tag Notification Hubs.

Dalam tutorial ini, Anda akan melakukan tindakan berikut:

  • 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 Firebase Cloud Messaging. Sebelum memulai tutorial ini, lengkapi Tutorial: Pemberitahuan push ke perangkat Android dengan menggunakan Azure Notification Hubs dan Firebase 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:

    Cuplikan layar emulator menampilkan seperti apa aktivitas utama tata letak grafis X M L.

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

    import java.util.HashSet;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.Toast;
    
    import com.google.android.gms.tasks.OnSuccessListener;
    import com.google.firebase.iid.FirebaseInstanceId;
    import com.google.firebase.iid.InstanceIdResult;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    
    public class Notifications {
        private static final String PREFS_NAME = "BreakingNewsCategories";
        private FirebaseInstanceId fcm;
        private NotificationHub hub;
        private Context context;
        private String senderId;
        public static String FCM_token = "";
        private static final String TAG = "Notifications";
    
        public Notifications(Context context, String hubName, String listenConnectionString) {
            this.context = context;
            this.senderId = senderId;
    
            fcm = FirebaseInstanceId.getInstance();
            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 {
                        FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() {
                            @Override
                            public void onSuccess(InstanceIdResult instanceIdResult) {
                                FCM_token = instanceIdResult.getToken();
                                Log.d(TAG, "FCM Registration Token: " + FCM_token);
                            }
                        });
    
                        TimeUnit.SECONDS.sleep(1);
    
                        String templateBodyFCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
                        hub.registerTemplate(FCM_token,"simpleFCMTemplate", templateBodyFCM,
                                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, tambahkan bidang untuk Notifications:

    private Notifications notifications;
    
  5. Kemudian, perbarui metode onCreate seperti yang ditunjukkan dalam kode berikut. Anda mendaftar dengan Notification Hubs dalam metode subscribeToCategories dari kelas Pemberitahuan.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mainActivity = this;
    
        FirebaseService.createChannelAndHandleNotifications(getApplicationContext());
        notifications = new Notifications(this, 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;
    import android.view.View;
    
  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 notifikasi 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.

Mendaftar untuk pemberitahuan

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

  1. Konfirmasikan bahwa kode berikut ada 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 backend yang dapat mengirim pemberitahuan kategori ke aplikasi ini.

Mengirim pemberitahuan bertag

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 lebih pengalihan kategori, lalu klik Berlangganan. Aplikasi ini mengonversi 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.

    Berlangganan untuk kategori

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

    Pemberitahuan berita teknologi

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: