Öğretici: Azure Notification Hubs kullanarak belirli iOS cihazlarına anında iletme bildirimleri gönderme
Genel Bakış
Bu öğreticide, bir iOS uygulamasında son dakika haberleri yayınlamak için Azure Notification Hubs'ın nasıl kullanılacağı gösterilmektedir. Tamamlandığında, ilgilendiğiniz son dakika haberleri kategorilerine kaydolabilirsiniz ve yalnızca bu kategoriler için anında iletme bildirimleri alabilirsiniz. Bu senaryo, daha önce ilgisini belirtmiş kullanıcı gruplarına bildirim gönderilmesi gereken RSS okuyucu, müzik hayranlarına yönelik uygulamalar vb. birçok uygulama için ortak düzendir.
Yayın senaryoları, bildirim hub’ında bir kayıt oluştururken bir veya daha fazla etiket dahil edilerek etkinleştirilir. Bildirimler bir etikete gönderildiğinde, etiket için kaydolan cihazlar bildirimi alır. Etiketler basitçe birer dize olduğundan, önceden hazırlanması gerekmez. Etiketler hakkında daha fazla bilgi için bkz. Notification Hubs Yönlendirme ve Etiket İfadeleri.
Bu öğreticide, aşağıdaki adımları gerçekleştireceksiniz:
- Uygulamaya kategori seçimi ekleme
- Etiketli bildirimler gönderme
- Cihazdan bildirim gönderme
- Uygulamayı çalıştırma ve bildirimler oluşturma
Ön koşullar
Bu konu, Öğretici: Azure Notification Hubs kullanarak iOS uygulamalarına anında iletme bildirimleri gönderme bölümünde oluşturduğunuz uygulama üzerinde oluşturulmuştur. Bu öğreticiye başlamadan önce Öğretici: Azure Notification Hubs kullanarak iOS uygulamalarına anında iletme bildirimleri gönderme adımlarını tamamlamış olmanız gerekir.
Uygulamaya kategori seçimi ekleme
İlk adım, kullanıcının kaydolmak üzere kategorileri seçmesini sağlayan kullanıcı arabirimi öğelerini mevcut görsel şeridinize eklemektir. Bir kullanıcı tarafından seçilen kategoriler cihazda depolanır. Uygulama başlatıldığında, etiketler olarak seçilen kategorilerle bildirim hub’ınızda bir cihaz kaydı oluşturulur.
MainStoryboard_iPhone.storyboard'unuza nesne kitaplığından aşağıdaki bileşenleri ekleyin:
"Son Dakika Haberleri" metnini içeren bir etiket,
"World", "Politics", "Business", "Technology", "Science", "Sports" kategori metinleri içeren etiketler,
Kategori başına bir tane olmak üzere altı anahtar, her anahtarın Durumunu varsayılan olarak Kapalı olarak ayarlar.
"Abone ol" etiketli bir düğme
Görsel taslak aşağıdaki gibi görünmelidir:
Yardımcı editörde, tüm anahtarlar için çıkışlar oluşturun ve bunlara "WorldSwitch", "PoliticsSwitch", "BusinessSwitch", "TechnologySwitch", "ScienceSwitch", "SportsSwitch" adını verin
Düğmeniz için adlı
subscribe
bir Eylem oluşturun; aşağıdakiViewController.h
kodu içermelidir:@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;
adlı
Notifications
yeni bir Cocoa Touch Sınıfı oluşturun. Notifications.h dosyasının arabirim bölümünde aşağıdaki kodu kopyalayın:@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;
Notifications.m'ye aşağıdaki içeri aktarma yönergesini ekleyin:
#import <WindowsAzureMessaging/WindowsAzureMessaging.h>
Notifications.m dosyasının uygulama bölümünde aşağıdaki kodu kopyalayın.
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]; }
Bu sınıf, bu cihazın aldığı haber kategorilerini depolamak ve almak için yerel depolamayı kullanır. Ayrıca, şablon kaydı kullanarak bu kategorilere kaydolmak için bir yöntem içerir.
AppDelegate.h
dosyasında için bir içeri aktarma deyimiNotifications.h
ekleyin ve sınıfının bir örneğiNotifications
için bir özellik ekleyin:#import "Notifications.h" @property (nonatomic) Notifications* notifications;
didFinishLaunchingWithOptions
içindeki yöntemindeAppDelegate.m
, yönteminin başındaki notifications örneğini başlatmak için kodu ekleyin.
HUBNAME
veHUBLISTENACCESS
(içindehubinfo.h
tanımlanmıştır), ve<connection string with listen access>
yer tutucularının yerine<hub name>
daha önce edindiğiniz DefaultListenSharedAccessSignature bağlantı dizesinin bildirim hub'ı adınızla değiştirilmiş olması gerekirself.notifications = [[Notifications alloc] initWithConnectionString:HUBLISTENACCESS HubName:HUBNAME];
Not
Bir istemci uygulaması ile dağıtılmış kimlik bilgileri genellikle güvenli olmadığından yalnızca istemci uygulamanızla dinleme erişimi için anahtarı dağıtmanız gerekir. Dinleme erişimi, uygulamanızın bildirimlere kaydolmasını sağlar, ancak mevcut kayıtlar değiştirilemez ve bildirimler gönderilemez. Tam erişim anahtarı, güvenli bir arka uç hizmetinde bildirimler göndermek ve mevcut kayıtları değiştirmek için kullanılır.
didRegisterForRemoteNotificationsWithDeviceToken
içindeki yöntemindeAppDelegate.m
, yöntemindeki kodu aşağıdaki kodla değiştirerek cihaz belirtecini sınıfınanotifications
geçirin.notifications
sınıfı, kategorilerle bildirimlere kaydolma işlemini gerçekleştirir. Kullanıcı kategori seçimlerini değiştirirse, abone ol düğmesine yanıt olarak yöntemini çağıraraksubscribeWithCategories
bunları güncelleştirin.Not
Apple Anında İletilen Bildirim Hizmeti (APNS) tarafından atanan cihaz belirteci istediğiniz zaman değişebileceğinden, bildirim hatalarını önlemek için bildirimlere sık sık kaydolmanız gerekir. Bu örnek, uygulama her başlatıldığında bildirimlere kaydolur. Sık sık çalıştırılan uygulamalar için, önceki kayıttan bu yana bir günden az zaman geçtiyse bant genişliğini korumak için günde birkaç kere kaydı atlayabilirsiniz.
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); } }];
Bu noktada yönteminde
didRegisterForRemoteNotificationsWithDeviceToken
başka kod olmamalıdır.Notification Hubs'ı kullanmaya başlama öğreticisi tamamladıktan sonra aşağıdaki yöntemlerin zaten mevcut
AppDelegate.m
olması gerekir. Aksi takdirde, bunları ekleyin.- (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"]]; }
Bu yöntem, uygulama çalışırken alınan bildirimleri basit bir UIAlert görüntüleyerek işler.
içinde
ViewController.m
içinAppDelegate.h
birimport
deyim ekleyin ve aşağıdaki kodu XCode tarafından oluşturulansubscribe
yönteme kopyalayın. Bu kod, bildirim kaydını kullanıcının kullanıcı arabiriminde seçtiği yeni kategori etiketlerini kullanacak şekilde güncelleştirir.#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); } }];
Bu yöntem kategorilerden birini
NSMutableArray
oluşturur ve listeyi yerel depolama alanında depolamak için sınıfını kullanırNotifications
ve ilgili etiketleri bildirim hub'ınıza kaydeder. Kategoriler değiştirildiğinde kayıt yeni kategorilerle yeniden oluşturulur.içinde
ViewController.m
, kullanıcı arabiriminiviewDidLoad
önceden kaydedilmiş kategorilere göre ayarlamak için yöntemine aşağıdaki kodu ekleyin.// 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;
Uygulama artık uygulama her başlatıldığında bildirim hub'ına kaydolmak için kullanılan cihaz yerel depolama alanında bir kategori kümesi depolayabilir. Kullanıcı çalışma zamanında kategori seçimini değiştirebilir ve cihaz kaydını güncelleştirmek için yöntemine tıklayabilir subscribe
. Ardından, son dakika haber bildirimlerini doğrudan uygulamanın kendisinde göndermek için uygulamayı güncelleştirirsiniz.
(isteğe bağlı) Etiketli bildirimler gönderme
Visual Studio'ya erişiminiz yoksa sonraki bölüme atlayabilir ve uygulamanın kendisinden bildirim gönderebilirsiniz. Ayrıca, bildirim hub'ınızın hata ayıklama sekmesini kullanarak Azure portal doğru şablon bildirimini de gönderebilirsiniz.
Bu bölümde, son dakika haberlerini .NET konsol uygulamasından etiketli şablon bildirimleri olarak yollarsınız.
Visual Studio'da yeni bir Visual C# konsol uygulaması oluşturun:
- MenüdeDosya Yeni Proje'yi>seçin>.
- Yeni proje oluştur bölümünde şablon listesindeN C# için Konsol Uygulaması (.NET Framework) öğesini ve ardından İleri'yi seçin.
- Uygulama için bir ad girin.
- Çözüm için Çözüme ekle'yi seçin ve oluştur'u seçerek projeyi oluşturun.
Araçlar>NuGet Paket Yöneticisi Paket Yöneticisi>Konsolu'nu seçin ve konsol penceresinde aşağıdaki komutu çalıştırın:
Install-Package Microsoft.Azure.NotificationHubs
Bu eylem , Microsoft.Azure.NotificationHubs paketini kullanarak Azure Notification Hubs SDK'sına bir başvuru ekler.
Program.cs dosyasını açın ve aşağıdaki
using
deyimi ekleyin:using Microsoft.Azure.NotificationHubs;
Program
sınıfında, aşağıdaki yöntemi ekleyin veya zaten mevcutsa değiştirin: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); } }
Bu kod, dize dizisindeki altı etiketin her biri için bir şablon bildirimi gönderir. Etiketlerin kullanılması, cihazların yalnızca kayıtlı kategoriler için bildirim almasını sağlar.
Önceki kodda,
<hub name>
ve<connection string with full access>
yer tutucularını bildirim hub'ı adınız ve bildirim hub’ınızın panosundaki DefaultFullSharedAccessSignature bağlantı dizeniz ile değiştirin.yöntemine
Main()
aşağıdaki satırları ekleyin:SendTemplateNotificationAsync(); Console.ReadLine();
Konsol uygulamasını oluşturun.
(isteğe bağlı) Cihazdan bildirim gönderme
Normalde bildirimler bir arka uç hizmeti tarafından gönderilir ancak son dakika haberlerini doğrudan uygulamadan gönderebilirsiniz. Bunu yapmak için Notification Hubs'ı kullanmaya başlama öğreticisinde tanımladığınız yöntemi güncelleştirinSendNotificationRESTAPI
.
içinde
ViewController.m
, yöntemini aşağıdaki gibi güncelleştirerekSendNotificationRESTAPI
kategori etiketi için bir parametre kabul eder ve uygun şablon bildirimini gönderir.- (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]; }
içinde
ViewController.m
, eylemi aşağıdakiSend Notification
kodda gösterildiği gibi güncelleştirin. Böylece her etiketi kullanarak bildirimleri tek tek gönderir ve birden çok platforma gönderir.- (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]; } }
Projenizi yeniden derleyin ve derleme hatası olmadığından emin olun.
Uygulamayı çalıştırma ve bildirimler oluşturma
Projeyi oluşturmak ve uygulamayı başlatmak için Çalıştır düğmesine basın. Abone olmak için bazı son dakika haberleri seçeneklerini belirleyin ve abone ol düğmesine basın. Bildirimlerin abone olduğunu belirten bir iletişim kutusu görmeniz gerekir.
Abone Ol'u seçtiğinizde uygulama seçili kategorileri etiketlere dönüştürür ve bildirim hub'ından seçili etiketler için yeni bir cihaz kaydı isteğinde bulunur.
Son dakika haberleri olarak gönderilecek iletiyi girin ve Bildirim Gönder düğmesine basın. Alternatif olarak, bildirim oluşturmak için .NET konsol uygulamasını çalıştırın.
Son dakika haberlerine abone olan her cihaz, az önce gönderdiğiniz son dakika haber bildirimlerini alır.
Sonraki adımlar
Bu öğreticide, kategoriler için kaydolan belirli iOS cihazlarına yayın bildirimleri gönderdiniz. Yerelleştirilmiş bildirimleri göndermeyi öğrenmek için aşağıdaki öğreticiye ilerleyin: