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

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.storyboardeen gesegmenteerd besturingselement toe met de drie talen: Engels, Frans en Mandarijn.

Het storyboard van de iOS-gebruikersinterface maken

Voeg vervolgens een IBOutlet toe aan uw ViewController.h, zoals wordt weergegeven in de volgende afbeelding:

Maak stopcontacten voor de schakelaars

De iOS-app bouwen

  1. Voeg in uw Notification.hde retrieveLocale 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.mde storeCategoriesAndSubscribe methode door de locale 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 registerTemplateWithDeviceTokenin plaats van registerNativeWithDeviceToken. 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;
    }
    
  2. Nu u de Notifications klasse hebt gewijzigd, moet u ervoor zorgen dat de ViewController gebruikmaakt van de nieuwe UISegmentControl. Voeg de volgende regel toe aan de viewDidLoad 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 de storeCategoriesAndSubscribe 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);
        }
    }];
    
  3. 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 de subscribe 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: