Öğretici: Azure Notification Hubs kullanarak iOS'a yerelleştirilmiş anında iletme bildirimleri gönderme
Bu öğreticide, dil ve cihaz tarafından yerelleştirilmiş son dakika haber bildirimlerini yayınlamak için Azure Notification Hubs'ın şablonlar özelliğinin nasıl kullanılacağı gösterilmektedir. Bu öğreticide, son dakika haberleri göndermek için Notification Hubs'ı kullanma bölümünde oluşturulan iOS uygulamasıyla başlayacaksınız. Tamamlandığında, ilgilendiğiniz kategorilere kaydolabilir, bildirimlerin alınabileceği bir dil belirtebilir ve yalnızca o dildeki seçili kategoriler için anında iletme bildirimleri alabilirsiniz.
Bu senaryo iki bölümden oluşur:
- iOS uygulaması, istemci cihazların bir dil belirtmesine ve farklı son dakika haber kategorilerine abone olmasına olanak tanır;
- Arka uç, Azure Notification Hubs'ın etiket ve şablon özelliklerini kullanarak bildirimleri yayınlar.
Bu öğreticide, aşağıdaki adımları gerçekleştireceksiniz:
- Uygulama kullanıcı arabirimini güncelleştirme
- iOS uygulamasını derleme
- .NET konsol uygulamasından yerelleştirilmiş şablon bildirimleri gönderme
- Cihazdan yerelleştirilmiş şablon bildirimleri gönderme
Genel Bakış
Son dakika haberleri göndermek için Notification Hubs'ı kullanma bölümünde, farklı haber kategorilerine yönelik bildirimlere abone olmak için etiketleri kullanan bir uygulama oluşturacaksınız. Ancak birçok uygulama birden çok pazarı hedefler ve yerelleştirme gerektirir. Bu, bildirimlerin içeriğinin yerelleştirilmesi ve doğru cihaz kümesine teslim edilmesi gerektiğini gösterir. Bu öğreticide, yerelleştirilmiş son dakika haber bildirimlerini kolayca sunmak için Notification Hubs'ın şablon özelliğini nasıl kullanacağınız gösterilmektedir.
Not
Yerelleştirilmiş bildirimler göndermenin bir yolu, her etiketin birden çok sürümünü oluşturmaktır. Örneğin İngilizce, Fransızca ve Mandarin'i desteklemek için dünya haberleri için üç farklı etikete ihtiyacınız vardır: "world_en", "world_fr" ve "world_ch". Daha sonra bu etiketlerin her birine dünya haberlerinin yerelleştirilmiş bir sürümünü göndermeniz gerekir. Bu konuda, etiketlerin çoğalmasını ve birden çok ileti gönderme gereksinimini önlemek için şablonları kullanırsınız.
Şablonlar, belirli bir cihazın nasıl bildirim alacağını belirtmenin bir yoludur. Şablon, uygulama arka ucunuz tarafından gönderilen iletinin parçası olan özelliklere başvurarak tam yük biçimini belirtir. Sizin durumunuzda, desteklenen tüm dilleri içeren yerel ayardan bağımsız bir ileti gönderirsiniz:
{
"News_English": "...",
"News_French": "...",
"News_Mandarin": "..."
}
Ardından cihazların doğru özelliğe başvuran bir şablonla kaydolduğundan emin olursunuz. Örneğin, Fransızca haber kayıtlarına kaydolmak isteyen bir iOS uygulaması aşağıdaki söz dizimini kullanarak kaydeder:
{
aps: {
alert: "$(News_French)"
}
}
Şablonlar hakkında daha fazla bilgi için Şablonlar makalesine bakın.
Önkoşullar
- Belirli iOS cihazlarına anında iletme bildirimleri öğreticisini tamamlayın ve kodun kullanılabilir olmasını sağlayın çünkü bu öğretici doğrudan bu kodun üzerine derlenmektedir.
- Visual Studio 2019 isteğe bağlıdır.
Uygulama kullanıcı arabirimini güncelleştirme
Bu bölümde, Notification Hubs kullanarak son dakika haberlerini göndermek için şablonları kullanarak yerelleştirilmiş son dakika haberleri gönderme konusunda oluşturduğunuz Son Dakika Haberleri uygulamasını değiştireceksiniz.
içinde MainStoryboard_iPhone.storyboard
, üç dil içeren bir Segmentli Denetim ekleyin: İngilizce, Fransızca ve Mandarin.
Ardından, aşağıdaki görüntüde gösterildiği gibi ViewController.h dosyasına bir IBOutlet eklediğinizden emin olun:
iOS uygulamasını derleme
dosyanızda
Notification.h
yöntemini ekleyinretrieveLocale
ve aşağıdaki kodda gösterildiği gibi depo ve abone olma yöntemlerini değiştirin:- (void) storeCategoriesAndSubscribeWithLocale:(int) locale categories:(NSSet*) categories completion: (void (^)(NSError* error))completion; - (void) subscribeWithLocale:(int) locale categories:(NSSet*) categories completion:(void (^)(NSError *))completion; - (NSSet*) retrieveCategories; - (int) retrieveLocale;
içinde
Notification.m
, parametresinistoreCategoriesAndSubscribe
ekleyereklocale
ve kullanıcı varsayılanlarında depolayarak yöntemini değiştirin:- (void) storeCategoriesAndSubscribeWithLocale:(int) locale categories:(NSSet *)categories completion:(void (^)(NSError *))completion { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; [defaults setValue:[categories allObjects] forKey:@"BreakingNewsCategories"]; [defaults setInteger:locale forKey:@"BreakingNewsLocale"]; [defaults synchronize]; [self subscribeWithLocale: locale categories:categories completion:completion]; }
Ardından abone olma yöntemini yerel ayarı içerecek şekilde değiştirin:
- (void) subscribeWithLocale: (int) locale categories:(NSSet *)categories completion:(void (^)(NSError *))completion{ SBNotificationHub* hub = [[SBNotificationHub alloc] initWithConnectionString:@"<connection string>" notificationHubPath:@"<hub name>"]; NSString* localeString; switch (locale) { case 0: localeString = @"English"; break; case 1: localeString = @"French"; break; case 2: localeString = @"Mandarin"; break; } NSString* template = [NSString stringWithFormat:@"{\"aps\":{\"alert\":\"$(News_%@)\"},\"inAppMessage\":\"$(News_%@)\"}", localeString, localeString]; [hub registerTemplateWithDeviceToken:self.deviceToken name:@"localizednewsTemplate" jsonBodyTemplate:template expiryTemplate:@"0" tags:categories completion:completion]; }
yerine yöntemini
registerTemplateWithDeviceToken
registerNativeWithDeviceToken
kullanırsınız. Bir şablona kaydolduysanız, json şablonunu ve şablon için bir ad sağlamanız gerekir (uygulama farklı şablonları kaydetmek isteyebilir). Bu haberler için bildirimleri aldığınızdan emin olmak için kategorilerinizi etiket olarak kaydettiğinizden emin olun.Kullanıcının varsayılan ayarlarından yerel ayarı almak için bir yöntem ekleyin:
- (int) retrieveLocale { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; int locale = [defaults integerForKey:@"BreakingNewsLocale"]; return locale < 0?0:locale; }
Artık sınıfını değiştirdiğinize
Notifications
göre, öğesininViewController
yeniUISegmentControl
öğesini kullandığından emin olmanız gerekir. Şu anda seçili olan yerel ayarı gösterdiğinden emin olmak için yöntemine aşağıdaki satırıviewDidLoad
ekleyin:self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
Ardından, yönteminizde
subscribe
çağrısıstoreCategoriesAndSubscribe
olarak aşağıdaki kodla değiştirin:[notifications storeCategoriesAndSubscribeWithLocale: self.Locale.selectedSegmentIndex categories:[NSSet setWithArray:categories] completion: ^(NSError* error) { if (!error) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Notification" message: @"Subscribed!" delegate:nil cancelButtonTitle: @"OK" otherButtonTitles:nil, nil]; [alert show]; } else { NSLog(@"Error subscribing: %@", error); } }];
Son olarak, uygulamanız başlatıldığında kaydınızı doğru şekilde yenileyebilmek için AppDelegate.m'nizde yöntemini güncelleştirmeniz
didRegisterForRemoteNotificationsWithDeviceToken
gerekir. Çağrınızısubscribe
aşağıdaki kodla bildirim yöntemine değiştirin:NSSet* categories = [self.notifications retrieveCategories]; int locale = [self.notifications retrieveLocale]; [self.notifications subscribeWithLocale: locale categories:categories completion:^(NSError* error) { if (error != nil) { NSLog(@"Error registering for notifications: %@", error); } }];
(isteğe bağlı) .NET konsol uygulamasından yerelleştirilmiş şablon bildirimleri gönderme
Şablon bildirimleri gönderdiğinizde, yalnızca bir özellik kümesi sağlamanız gerekir. Bu senaryoda, özellikler kümesi geçerli haberlerin yerelleştirilmiş sürümünü içerir.
{
"News_English": "World News in English!",
"News_French": "World News in French!",
"News_Mandarin": "World News in Mandarin!"
}
C# konsol uygulaması kullanarak bildirim gönderme
Bu bölümde, bir konsol uygulaması kullanarak nasıl bildirim gönderebilirsiniz gösterilmektedir. Kod, bildirimleri hem Windows Mağazası hem de iOS cihazlarına yayınlar. Daha önce oluşturduğunuz konsol uygulamasındaki SendTemplateNotificationAsync
yöntemini aşağıdaki kodla 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"}};
// Sending the notification as a template notification. All template registrations that contain
// "messageParam" or "News_<local selected>" and the proper tags will receive the notifications.
// This includes APNS, GCM, WNS, and MPNS template registrations.
Dictionary<string, string> templateParams = new Dictionary<string, string>();
// Create an array of breaking news categories.
var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
var locales = new string[] { "English", "French", "Mandarin" };
foreach (var category in categories)
{
templateParams["messageParam"] = "Breaking " + category + " News!";
// Sending localized News for each tag too...
foreach( var locale in locales)
{
string key = "News_" + locale;
// Your real localized news content would go here.
templateParams[key] = "Breaking " + category + " News in " + locale + "!";
}
await hub.SendTemplateNotificationAsync(templateParams, category);
}
}
SendTemplateNotificationAsync yöntemi, platformdan bağımsız olarak yerelleştirilmiş haber parçasını tüm cihazlarınıza sunar. Bildirim hub'ınız, belirli bir etikete abone olan tüm cihazlara doğru yerel yükü oluşturur ve teslim eder.
Mobile Services ile bildirim gönderme
Mobile Services zamanlayıcınızda aşağıdaki betiği kullanın:
var azure = require('azure');
var notificationHubService = azure.createNotificationHubService('<hub name>', '<connection string with full access>');
var notification = {
"News_English": "World News in English!",
"News_French": "World News in French!",
"News_Mandarin", "World News in Mandarin!"
}
notificationHubService.send('World', notification, function(error) {
if (!error) {
console.warn("Notification successful");
}
});
(isteğe bağlı) Cihazdan yerelleştirilmiş şablon bildirimleri gönderme
Visual Studio'ya erişiminiz yoksa veya yalnızca yerelleştirilmiş şablon bildirimlerini doğrudan cihazda uygulamadan göndermeyi test etmek istiyorsanız. Yerelleştirilmiş şablon parametrelerini önceki öğreticide SendNotificationRESTAPI
tanımladığınız yönteme ekleyebilirsiniz.
- (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 : %@\","
\"News_English\":\"Breaking %@ News in English : %@\","
\"News_French\":\"Breaking %@ News in French : %@\","
\"News_Mandarin\":\"Breaking %@ News in Mandarin : %@\","
categoryTag, self.notificationMessage.text,
categoryTag, self.notificationMessage.text, // insert English localized news here
categoryTag, self.notificationMessage.text, // insert French localized news here
categoryTag, self.notificationMessage.text]; // insert Mandarin localized news here
// 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];
}
Sonraki adımlar
Bu öğreticide, iOS cihazlarına yerelleştirilmiş bildirimler gönderdiniz. iOS uygulamalarının belirli kullanıcılarına anında iletme bildirimleri göndermeyi öğrenmek için aşağıdaki öğreticiye ilerleyin: