Tutorial: Mengirim pemberitahuan push ke pengguna iOS tertentu menggunakan Azure Notification Hubs

Gambaran Umum

Tutorial ini menunjukkan cara menggunakan Microsoft Azure Notification Hubs untuk menyiarkan pemberitahuan berita terkini ke aplikasi iOS. 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. Saat pemberitahuan dikirim ke tag, seluruh perangkat yang terdaftar dengan tag akan 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, lakukan langkah-langkah berikut:

  • Menambahkan pilihan kategori ke aplikasi
  • Mengirim pemberitahuan dengan tag
  • Mengirim pemberitahuan dari perangkat
  • Menjalankan aplikasi dan membuat pemberitahuan

Prasyarat

Topik ini dibuat pada aplikasi yang Anda buat di Tutorial: Pemberitahuan push ke aplikasi iOS menggunakan Azure Notification Hubs. Sebelum memulai tutorial ini, Anda sudah harus menyelesaikan Tutorial: Pemberitahuan push ke aplikasi iOS menggunakan Azure Notification Hubs.

Menambahkan pilihan kategori ke aplikasi

Langkah pertama adalah menambahkan elemen antarmuka pengguna ke papan cerita Anda yang sudah ada yang memungkinkan pengguna untuk memilih kategori untuk didaftarkan. 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. Di MainStoryboard_iPhone.storyboard Anda, tambahkan komponen berikut dari pustaka objek:

    • Label dengan teks "Breaking News",

    • Label dengan teks kategori "World", "Politics", "Business", "Technology", "Science", "Sports",

    • Enam sakelar, satu per kategori, atur setiap sakelarstatus menjadi Nonaktif secara default.

    • Satu tombol berlabel "Berlangganan"

      Papan cerita Anda akan terlihat seperti berikut:

      Pembangun antarmuka Xcode

  2. Dalam asisten editor, buat outlet untuk semua sakelar dan namai "WorldSwitch", "PoliticsSwitch", "BusinessSwitch", "TechnologySwitch", "ScienceSwitch", "SportsSwitch"

  3. Buat Tindakan untuk tombol Anda yang disebut subscribe; ViewController.h Anda harus berisi kode berikut:

    @property (weak, nonatomic) IBOutlet UISwitch *WorldSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *PoliticsSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *BusinessSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *TechnologySwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *ScienceSwitch;
    @property (weak, nonatomic) IBOutlet UISwitch *SportsSwitch;
    
    - (IBAction)subscribe:(id)sender;
    
  4. Buat Kelas Cocoa Touch baru yang disebut Notifications. Salin kode berikut di bagian antarmuka file Notifications.h:

    @property NSData* deviceToken;
    
    - (id)initWithConnectionString:(NSString*)listenConnectionString HubName:(NSString*)hubName;
    
    - (void)storeCategoriesAndSubscribeWithCategories:(NSArray*)categories
                completion:(void (^)(NSError* error))completion;
    
    - (NSSet*)retrieveCategories;
    
    - (void)subscribeWithCategories:(NSSet*)categories completion:(void (^)(NSError *))completion;
    
  5. Tambahkan direktif impor berikut ke Notifications.m:

    #import <WindowsAzureMessaging/WindowsAzureMessaging.h>
    
  6. Salin kode berikut di bagian implementasi file Notifications.m.

    SBNotificationHub* hub;
    
    - (id)initWithConnectionString:(NSString*)listenConnectionString HubName:(NSString*)hubName{
    
        hub = [[SBNotificationHub alloc] initWithConnectionString:listenConnectionString
                                    notificationHubPath:hubName];
    
        return self;
    }
    
    - (void)storeCategoriesAndSubscribeWithCategories:(NSSet *)categories completion:(void (^)(NSError *))completion {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
        [defaults setValue:[categories allObjects] forKey:@"BreakingNewsCategories"];
    
        [self subscribeWithCategories:categories completion:completion];
    }
    
    - (NSSet*)retrieveCategories {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    
        NSArray* categories = [defaults stringArrayForKey:@"BreakingNewsCategories"];
    
        if (!categories) return [[NSSet alloc] init];
        return [[NSSet alloc] initWithArray:categories];
    }
    
    - (void)subscribeWithCategories:(NSSet *)categories completion:(void (^)(NSError *))completion
    {
        NSString* templateBodyAPNS = @"{\"aps\":{\"alert\":\"$(messageParam)\"}}";
    
        [hub registerTemplateWithDeviceToken:self.deviceToken name:@"simpleAPNSTemplate" 
            jsonBodyTemplate:templateBodyAPNS expiryTemplate:@"0" tags:categories completion:completion];
    }
    

    Kelas ini menggunakan penyimpanan lokal untuk menyimpan kategori berita yang diterima perangkat ini. Kelas ini juga berisi metode untuk mendaftarkan kategori ini menggunakan pendaftaran Templat.

  7. Dalam file AppDelegate.h, tambahkan pernyataan impor untuk Notifications.h dan tambahkan properti untuk instans kelas Notifications:

    #import "Notifications.h"
    
    @property (nonatomic) Notifications* notifications;
    
  8. Pada metode didFinishLaunchingWithOptions dalam AppDelegate.m, tambahkan kode untuk menginisialisasi instans pemberitahuan di awal metode.
    HUBNAME dan HUBLISTENACCESS (didefinisikan dalam hubinfo.h) harus sudah memilik tempat penampung <hub name> dan <connection string with listen access> yang telah diganti dengan nama hub pemberitahuan Anda dan string koneksi untuk DefaultListenSharedAccessSignature yang Anda peroleh sebelumnya

    self.notifications = [[Notifications alloc] initWithConnectionString:HUBLISTENACCESS HubName:HUBNAME];
    

    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 backend yang aman untuk mengirim pemberitahuan dan mengubah pendaftaran yang sudah ada.

  9. Dalam didRegisterForRemoteNotificationsWithDeviceToken metode dalam AppDelegate.m, ganti kode dalam metode dengan kode berikut untuk meneruskan token perangkat ke kelas notifications. Kelas notifications melakukan pendaftaran untuk pemberitahuan dengan kategori. Jika pengguna mengubah pilihan kategori, Panggil metode subscribeWithCategories sebagai respons terhadap tombol berlangganan untuk memperbaruinya.

    Catatan

    Karena token perangkat yang ditetapkan oleh Apple Push Notification Service (APNS) dapat berubah kapan saja, Anda harus sering mendaftarkan 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.

    self.notifications.deviceToken = deviceToken;
    
    // Retrieves the categories from local storage and requests a registration for these categories
    // each time the app starts and performs a registration.
    
    NSSet* categories = [self.notifications retrieveCategories];
    [self.notifications subscribeWithCategories:categories completion:^(NSError* error) {
        if (error != nil) {
            NSLog(@"Error registering for notifications: %@", error);
        }
    }];
    

    Pada titik ini, seharusnya tidak ada kode lain dalam metode didRegisterForRemoteNotificationsWithDeviceToken.

  10. Metode berikut harus sudah ada dalam AppDelegate.m dari menyelesaikan tutorial Memulai dengan Microsoft Azure Notification Hubs. Jika belum, tambahkan sekarang.

    - (void)MessageBox:(NSString *)title message:(NSString *)messageText
    {
    
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:messageText delegate:self
            cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
    }
    
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:
       (NSDictionary *)userInfo {
       NSLog(@"%@", userInfo);
       [self MessageBox:@"Notification" message:[[userInfo objectForKey:@"aps"] valueForKey:@"alert"]];
     }
    

    Metode ini menangani pemberitahuan yang diterima saat aplikasi berjalan dengan menampilkan UIAlert sederhana.

  11. Dalam ViewController.m, tambahkan pernyataan import untuk AppDelegate.h dan salin kode berikut ke dalam metode subscribe yang dihasilkan XCode. Kode ini memperbarui pendaftaran pemberitahuan untuk menggunakan tag kategori baru yang dipilih pengguna di antarmuka pengguna.

    #import "Notifications.h"
    
    NSMutableArray* categories = [[NSMutableArray alloc] init];
    
    if (self.WorldSwitch.isOn) [categories addObject:@"World"];
    if (self.PoliticsSwitch.isOn) [categories addObject:@"Politics"];
    if (self.BusinessSwitch.isOn) [categories addObject:@"Business"];
    if (self.TechnologySwitch.isOn) [categories addObject:@"Technology"];
    if (self.ScienceSwitch.isOn) [categories addObject:@"Science"];
    if (self.SportsSwitch.isOn) [categories addObject:@"Sports"];
    
    Notifications* notifications = [(AppDelegate*)[[UIApplication sharedApplication]delegate] notifications];
    
    [notifications storeCategoriesAndSubscribeWithCategories:categories completion: ^(NSError* error) {
        if (!error) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:"Notification" message:"Subscribed" delegate:self
            cancelButtonTitle:@"OK" otherButtonTitles: nil];
            [alert show];
        } else {
            NSLog(@"Error subscribing: %@", error);
        }
    }];
    

    Metode ini membuat NSMutableArray 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.

  12. Dalam ViewController.m, tambahkan kode berikut dalam metode viewDidLoad untuk mengatur antarmuka pengguna berdasarkan kategori yang disimpan sebelumnya.

    // This updates the UI on startup based on the status of previously saved categories.
    
    Notifications* notifications = [(AppDelegate*)[[UIApplication sharedApplication]delegate] notifications];
    
    NSSet* categories = [notifications retrieveCategories];
    
    if ([categories containsObject:@"World"]) self.WorldSwitch.on = true;
    if ([categories containsObject:@"Politics"]) self.PoliticsSwitch.on = true;
    if ([categories containsObject:@"Business"]) self.BusinessSwitch.on = true;
    if ([categories containsObject:@"Technology"]) self.TechnologySwitch.on = true;
    if ([categories containsObject:@"Science"]) self.ScienceSwitch.on = true;
    if ([categories containsObject:@"Sports"]) self.SportsSwitch.on = true;
    

Aplikasi ini sekarang dapat menyimpan set kategori di penyimpanan lokal perangkat yang digunakan untuk mendaftar dengan hub pemberitahuan setiap kali aplikasi dimulai. Pengguna dapat mengubah pemilihan kategori pada waktu runtime dan mengklik metode subscribe untuk memperbarui pendaftaran untuk perangkat. Selanjutnya, Anda memperbarui aplikasi untuk mengirim pemberitahuan berita terkini langsung di aplikasi itu sendiri.

(opsional) Mengirim pemberitahuan yang diberi tag

Jika tidak memiliki akses ke Visual Studio, Anda dapat melompat ke bagian berikutnya dan mengirim pemberitahuan dari aplikasi itu sendiri. Anda juga dapat mengirim templat pemberitahuan yang sesuai dari portal Microsoft Azure menggunakan tab debug untuk hub pemberitahuan Anda.

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.

(opsional) Mengirim pemberitahuan dari perangkat

Biasanya pemberitahuan akan dikirim oleh layanan ujung belakang tetapi, Anda dapat mengirim pemberitahuan berita terkini langsung dari aplikasi. Untuk melakukannya, Anda memperbarui metode SendNotificationRESTAPI yang Anda tentukan dalam tutorial Mulai menggunakan Microsoft Azure Notification Hubs.

  1. Dalam ViewController.m, perbarui metode SendNotificationRESTAPI sebagai berikut sehingga menerima parameter untuk tag kategori dan mengirim templat pemberitahuan yang sesuai.

    - (void)SendNotificationRESTAPI:(NSString*)categoryTag
    {
        NSURLSession* session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration
                                    defaultSessionConfiguration] delegate:nil delegateQueue:nil];
    
        NSString *json;
    
        // Construct the messages REST endpoint
        NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@/messages/%@", HubEndpoint,
                                            HUBNAME, API_VERSION]];
    
        // Generated the token to be used in the authorization header.
        NSString* authorizationToken = [self generateSasToken:[url absoluteString]];
    
        //Create the request to add the template notification message to the hub
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [request setHTTPMethod:@"POST"];
    
        // Add the category as a tag
        [request setValue:categoryTag forHTTPHeaderField:@"ServiceBusNotification-Tags"];
    
        // Template notification
        json = [NSString stringWithFormat:@"{\"messageParam\":\"Breaking %@ News : %@\"}",
                categoryTag, self.notificationMessage.text];
    
        // Signify template notification format
        [request setValue:@"template" forHTTPHeaderField:@"ServiceBusNotification-Format"];
    
        // JSON Content-Type
        [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
        //Authenticate the notification message POST request with the SaS token
        [request setValue:authorizationToken forHTTPHeaderField:@"Authorization"];
    
        //Add the notification message body
        [request setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]];
    
        // Send the REST request
        NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
                    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
            {
            NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
                if (error || httpResponse.statusCode != 200)
                {
                    NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
                }
                if (data != NULL)
                {
                    //xmlParser = [[NSXMLParser alloc] initWithData:data];
                    //[xmlParser setDelegate:self];
                    //[xmlParser parse];
                }
            }];
    
        [dataTask resume];
    }
    
  2. Dalam ViewController.m, perbarui tindakan Send Notification seperti yang ditunjukkan dalam kode yang mengikuti. Sehingga tindakan mengirimkan pemberitahuan menggunakan setiap tag satu per satu dan dikirim ke beberapa platform.

    - (IBAction)SendNotificationMessage:(id)sender
    {
        self.sendResults.text = @"";
    
        NSArray* categories = [NSArray arrayWithObjects: @"World", @"Politics", @"Business",
                                @"Technology", @"Science", @"Sports", nil];
    
        // Lets send the message as breaking news for each category to WNS, FCM, and APNS
        // using a template.
        for(NSString* category in categories)
        {
            [self SendNotificationRESTAPI:category];
        }
    }
    
  3. Bangun ulang proyek Anda dan pastikan Anda tidak memiliki kesalahan build.

Menjalankan aplikasi dan membuat pemberitahuan

  1. Tekan tombol Jalankan untuk menyusun proyek dan memulai aplikasi. Pilih beberapa opsi berita terkini untuk berlangganan lalu tekan tombol Berlangganan. Anda akan melihat dialog yang menunjukkan pemberitahuan telah berlangganan.

    Contoh pemberitahuan di iOS

    Saat Anda memilih Berlangganan, Aplikasi ini mengonversi kategori yang dipilih menjadi tag dan meminta pendaftaran perangkat baru untuk tag yang dipilih dari hub pemberitahuan.

  2. Masukkan pesan yang akan dikirim sebagai berita terkini lalu tekan tombol Kirim Pemberitahuan. Atau, jalankan aplikasi konsol .NET untuk menghasilkan pemberitahuan.

    Mengubah preferensi pemberitahuan di iOS

  3. Setiap perangkat yang berlangganan berita terkini menerima pemberitahuan berita terkini yang baru saja Anda kirim.

Langkah berikutnya

Dalam tutorial ini, Anda mengirim pemberitahuan siaran ke perangkat iOS tertentu yang telah mendaftar untuk kategori tersebut. Untuk mempelajari cara mengirim pemberitahuan push berbasis lokasi, lanjutkan ke tutorial berikut: