Zelfstudie: Gelokaliseerde pushmeldingen verzenden naar iOS met behulp van Azure Notification Hubs
In deze zelfstudie ziet u hoe u de sjablonenfunctie van Azure Notification Hubs gebruikt om meldingen van belangrijk nieuws uit te zenden die per taal en apparaat zijn gelokaliseerd. In deze zelfstudie begint u met de iOS-app die is gemaakt in Notification Hubs gebruiken om belangrijk nieuws te verzenden. Wanneer u klaar bent, kunt u zich registreren voor categorieën waarin u geïnteresseerd bent, een taal opgeven waarin de meldingen moeten worden ontvangen en alleen pushmeldingen ontvangen voor de geselecteerde categorieën in die taal.
Dit scenario bestaat uit twee onderdelen:
- Met de iOS-app kunnen clientapparaten een taal opgeven en zich abonneren op verschillende belangrijke nieuwscategorieën;
- De back-end verzendt de meldingen met behulp van de tag - en sjabloonfuncties van Azure Notification Hubs.
In deze zelfstudie voert u de volgende stappen uit:
- De gebruikersinterface van de app bijwerken
- De iOS-app bouwen
- Gelokaliseerde sjabloonmeldingen verzenden vanuit de .NET-console-app
- Gelokaliseerde sjabloonmeldingen verzenden vanaf het apparaat
Overzicht
In Notification Hubs gebruiken om belangrijk nieuws te verzenden, hebt u een app gebouwd die tags gebruikt om u te abonneren op meldingen voor verschillende nieuwscategorieën. Veel apps zijn echter gericht op meerdere markten en vereisen lokalisatie. Dit betekent dat de inhoud van de meldingen zelf moet worden gelokaliseerd en geleverd aan de juiste set apparaten. In deze zelfstudie leert u hoe u de sjabloonfunctie van Notification Hubs kunt gebruiken om eenvoudig gelokaliseerde belangrijke nieuwsmeldingen te verzenden.
Notitie
Een manier om gelokaliseerde meldingen te verzenden, is door meerdere versies van elke tag te maken. Als u bijvoorbeeld Engels, Frans en Mandarijn wilt ondersteunen, hebt u drie verschillende labels nodig voor wereldnieuws: 'world_en', 'world_fr' en 'world_ch'. Vervolgens moet u een gelokaliseerde versie van het wereldnieuws naar elk van deze tags verzenden. In dit onderwerp gebruikt u sjablonen om de verspreiding van tags en de vereiste van het verzenden van meerdere berichten te voorkomen.
Sjablonen zijn een manier om op te geven hoe een specifiek apparaat een melding moet ontvangen. De sjabloon bepaalt de exacte indeling van de payload door te verwijzen naar eigenschappen die deel uitmaken van het bericht dat is verzonden door uw back-endapp. In uw geval verzendt u een landinstellingsneutraal bericht dat alle ondersteunde talen bevat:
{
"News_English": "...",
"News_French": "...",
"News_Mandarin": "..."
}
Vervolgens zorgt u ervoor dat apparaten worden geregistreerd met een sjabloon die naar de juiste eigenschap verwijst. Bijvoorbeeld een iOS-app die zich wil registreren voor Franse nieuwsregisters met behulp van de volgende syntaxis:
{
aps: {
alert: "$(News_French)"
}
}
Zie het artikel Sjablonen voor meer informatie over sjablonen.
Vereisten
- Voltooi de zelfstudie Pushmeldingen naar specifieke iOS-apparaten en zorg dat de code beschikbaar is, omdat deze zelfstudie rechtstreeks op die code voortbouwt.
- Visual Studio 2019 is optioneel.
De gebruikersinterface van de app bijwerken
In deze sectie wijzigt u de app Voor belangrijk nieuws die u hebt gemaakt in het onderwerp Notification Hubs gebruiken om belangrijk nieuws te verzenden en gelokaliseerd belangrijk nieuws te verzenden met behulp van sjablonen.
Voeg in uw MainStoryboard_iPhone.storyboard
een gesegmenteerd besturingselement toe met de drie talen: Engels, Frans en Mandarijn.
Voeg vervolgens een IBOutlet toe aan uw ViewController.h, zoals wordt weergegeven in de volgende afbeelding:
De iOS-app bouwen
Voeg in uw
Notification.h
deretrieveLocale
methode toe en wijzig de opslag- en abonnementsmethoden, zoals wordt weergegeven in de volgende code:- (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;
Wijzig in uw
Notification.m
destoreCategoriesAndSubscribe
methode door delocale
parameter toe te voegen en op te slaan in de standaardinstellingen van de gebruiker:- (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]; }
Wijzig vervolgens de methode voor abonneren zodat deze de landinstelling bevat:
- (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]; }
U gebruikt de methode
registerTemplateWithDeviceToken
in plaats vanregisterNativeWithDeviceToken
. Wanneer u zich registreert voor een sjabloon, moet u de json-sjabloon en ook een naam voor de sjabloon opgeven (omdat de app mogelijk verschillende sjablonen wil registreren). Zorg ervoor dat u uw categorieën registreert als tags, omdat u ervoor wilt zorgen dat u de meldingen voor dat nieuws ontvangt.Voeg een methode toe om de landinstelling op te halen uit de standaardinstellingen van de gebruiker:
- (int) retrieveLocale { NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; int locale = [defaults integerForKey:@"BreakingNewsLocale"]; return locale < 0?0:locale; }
Nu u de
Notifications
klasse hebt gewijzigd, moet u ervoor zorgen dat deViewController
gebruikmaakt van de nieuweUISegmentControl
. Voeg de volgende regel toe aan deviewDidLoad
methode om ervoor te zorgen dat de landinstelling wordt weergegeven die momenteel is geselecteerd:self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
Wijzig vervolgens in uw
subscribe
methode uw aanroep in destoreCategoriesAndSubscribe
naar de volgende code:[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); } }];
Ten slotte moet u de
didRegisterForRemoteNotificationsWithDeviceToken
methode in uw AppDelegate.m bijwerken, zodat u uw registratie correct kunt vernieuwen wanneer uw app wordt gestart. Wijzig uw aanroep naar desubscribe
methode van meldingen met de volgende code: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); } }];
(optioneel) Gelokaliseerde sjabloonmeldingen verzenden vanuit de .NET-console-app
Wanneer u sjabloonmeldingen verzendt, hoeft u alleen een set eigenschappen op te geven. In dit scenario bevat de set eigenschappen de gelokaliseerde versie van het huidige nieuws.
{
"News_English": "World News in English!",
"News_French": "World News in French!",
"News_Mandarin": "World News in Mandarin!"
}
Meldingen verzenden met een C#-console-app
In deze sectie wordt beschreven hoe u meldingen verzendt met behulp van een console-app. De code verzendt meldingen naar zowel Windows Store- als iOS-apparaten. Wijzig de methode SendTemplateNotificationAsync
in de console-app die u eerder hebt gemaakt met de volgende code:
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);
}
}
De methode SendTemplateNotificationAsync levert het gelokaliseerde nieuwsbericht op al uw apparaten, ongeacht het platform. Uw Notification Hub bouwt en levert de juiste systeemeigen nettolading aan alle apparaten die zijn geabonneerd op een specifieke tag.
Melding verzenden met Mobile Services
Gebruik in uw Mobile Services-planner het volgende script:
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");
}
});
(optioneel) Gelokaliseerde sjabloonmeldingen verzenden vanaf het apparaat
Als u geen toegang hebt tot Visual Studio of gewoon het verzenden van de gelokaliseerde sjabloonmeldingen rechtstreeks vanuit de app op het apparaat wilt testen. U kunt de gelokaliseerde sjabloonparameters toevoegen aan de SendNotificationRESTAPI
methode die u in de vorige zelfstudie hebt gedefinieerd.
- (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];
}
Volgende stappen
In deze zelfstudie hebt u gelokaliseerde meldingen verzonden naar iOS-apparaten. Als u wilt weten hoe u pushmeldingen kunt verzenden naar specifieke gebruikers van iOS-apps, gaat u verder met de volgende zelfstudie: