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.
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:
Dalam asisten editor, buat outlet untuk semua sakelar dan namai "WorldSwitch", "PoliticsSwitch", "BusinessSwitch", "TechnologySwitch", "ScienceSwitch", "SportsSwitch"
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;
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;
Tambahkan direktif impor berikut ke Notifications.m:
#import <WindowsAzureMessaging/WindowsAzureMessaging.h>
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.
Dalam file
AppDelegate.h
, tambahkan pernyataan impor untukNotifications.h
dan tambahkan properti untuk instans kelasNotifications
:#import "Notifications.h" @property (nonatomic) Notifications* notifications;
Pada metode
didFinishLaunchingWithOptions
dalamAppDelegate.m
, tambahkan kode untuk menginisialisasi instans pemberitahuan di awal metode.
HUBNAME
danHUBLISTENACCESS
(didefinisikan dalamhubinfo.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 sebelumnyaself.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.
Dalam
didRegisterForRemoteNotificationsWithDeviceToken
metode dalamAppDelegate.m
, ganti kode dalam metode dengan kode berikut untuk meneruskan token perangkat ke kelasnotifications
. Kelasnotifications
melakukan pendaftaran untuk pemberitahuan dengan kategori. Jika pengguna mengubah pilihan kategori, Panggil metodesubscribeWithCategories
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
.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.
Dalam
ViewController.m
, tambahkan pernyataanimport
untukAppDelegate.h
dan salin kode berikut ke dalam metodesubscribe
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 kelasNotifications
untuk menyimpan daftar di penyimpanan lokal dan mendaftarkan tag yang sesuai dengan hub pemberitahuan Anda. Ketika kategori diubah, pendaftaran dibuat ulang dengan kategori baru.Dalam
ViewController.m
, tambahkan kode berikut dalam metodeviewDidLoad
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.
Di Visual Studio, buat aplikasi konsol Visual Studio C# baru:
- Pada menu, pilih File>Baru>Proyek.
- Di Tambahkan proyek baru, pilih Aplikasi Konsol (.NET Framework) untuk C# di daftar templat, lalu pilih Berikutnya.
- Masukkan nama untuk aplikasi.
- Untuk Solusi, pilih Tambahkan ke solusi, dan pilih Buat untuk membuat proyek.
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.
Buka file program.cs, lalu tambahkan penyataan
using
berikut:using Microsoft.Azure.NotificationHubs;
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.
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.Dalam metode
Main()
, tambahkan baris berikut:SendTemplateNotificationAsync(); Console.ReadLine();
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.
Dalam
ViewController.m
, perbarui metodeSendNotificationRESTAPI
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]; }
Dalam
ViewController.m
, perbarui tindakanSend 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]; } }
Bangun ulang proyek Anda dan pastikan Anda tidak memiliki kesalahan build.
Menjalankan aplikasi dan membuat pemberitahuan
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.
Saat Anda memilih Berlangganan, Aplikasi ini mengonversi kategori yang dipilih menjadi tag dan meminta pendaftaran perangkat baru untuk tag yang dipilih dari hub pemberitahuan.
Masukkan pesan yang akan dikirim sebagai berita terkini lalu tekan tombol Kirim Pemberitahuan. Atau, jalankan aplikasi konsol .NET untuk menghasilkan pemberitahuan.
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: