Tutorial: Senden von lokalisierten Pushbenachrichtigungen an iOS mit Azure Notification HubsTutorial: Send localized push notifications to iOS using Azure Notification Hubs

In diesem Tutorial wird gezeigt, wie Sie mit dem Feature Vorlagen von Azure Notification Hubs Benachrichtigungen senden können, die je nach Sprache und Gerät lokalisiert wurden.This tutorial shows you how to use the templates feature of Azure Notification Hubs to broadcast breaking news notifications that have been localized by language and device. In diesem Tutorial beginnen Sie mit der iOS-App, die Sie in Verwenden von Benachrichtigungshubs zum Übermitteln von Nachrichten erstellt haben.In this tutorial, you start with the iOS app created in Use Notification Hubs to send breaking news. Anschließend können Sie sich für Kategorien registrieren, die Sie interessieren, eine Sprache für die Benachrichtigungen auszuwählen und nur Pushbenachrichtigungen für diese Kategorien in der jeweiligen Sprache empfangen.When complete, you can register for categories you're interested in, specify a language in which to receive the notifications, and receive only push notifications for the selected categories in that language.

Dieses Szenario besteht aus zwei Teilen:There are two parts to this scenario:

  • Mit der iOS-App können Client-Geräte eine Sprache auswählen und verschiedene Nachrichtenkategorien abonnieren.iOS app allows client devices to specify a language, and to subscribe to different breaking news categories;
  • Das Back-End überträgt die Benachrichtigungen mithilfe des Tag- und Vorlagen-Features von Azure Notification Hubs.The back-end broadcasts the notifications, using the tag and template features of Azure Notification Hubs.

In diesem Tutorial führen Sie die folgenden Schritte aus:In this tutorial, you take the following steps:

  • Aktualisieren der App-BenutzeroberflächeUpdate the app user interface
  • Erstellen der iOS-AppBuild the iOS app
  • Senden von lokalisierten Vorlagenbenachrichtigungen aus der .NET-Konsolen-AppSend localized template notifications from .NET console app
  • Senden von lokalisierten Vorlagenbenachrichtigungen vom GerätSend localized template notifications from the device

ÜbersichtOverview

In Verwenden von Benachrichtigungshubs zum Übermitteln von Nachrichten haben Sie eine App erstellt, in der Benutzer mit Tags Nachrichten aus verschiedenen Kategorien abonnieren können.In Use Notification Hubs to send breaking news, you built an app that used tags to subscribe to notifications for different news categories. Viele Apps richten sich jedoch an verschiedene Märkte und müssen lokalisiert werden.Many apps, however, target multiple markets and require localization. In diesen Fällen muss auch der Inhalt der Benachrichtigungen lokalisiert und an die korrekten Geräte ausgeliefert werden.It means that the content of the notifications themselves have to be localized and delivered to the correct set of devices. Dieses Tutorial zeigt Ihnen, wie Sie mit dem Feature für Vorlagen von Notification Hubs lokalisierte Benachrichtigungen über Nachrichten verschicken.This tutorial shows you how to use the template feature of Notification Hubs to easily deliver localized breaking news notifications.

Hinweis

Sie können mehrere Versionen der einzelnen Tags erstellen, um lokalisierte Benachrichtigungen zu verschicken.One way to send localized notifications is to create multiple versions of each tag. Für Englisch, Französisch und Mandarin müssen Sie z.B. drei verschiedene Markierungen für Weltnachrichten erstellen: „world_en“, „world_fr“ und „world_ch“.For instance, to support English, French, and Mandarin, you would need three different tags for world news: "world_en", "world_fr", and "world_ch". Anschließend müssten Sie eine lokalisierte Version der Nachrichten an die einzelnen Tags schicken.You would then have to send a localized version of the world news to each of these tags. In diesem Thema verwenden Sie Vorlagen, um die Anzahl der Tags einzugrenzen und den Versand mehrerer Nachrichten zu vermeiden.In this topic, you use templates to avoid the proliferation of tags and the requirement of sending multiple messages.

Mit Vorlagen können Sie festlegen, wie ein bestimmtes Gerät eine Benachrichtigung empfangen soll.Templates are a way to specify how a specific device should receive a notification. Die Vorlage gibt das exakte Format der Nutzlast anhand von Eigenschaften an, die Teil der von Ihrem Back-End verschickten Nachricht sind.The template specifies the exact payload format by referring to properties that are part of the message sent by your app back-end. In Ihrem Fall senden Sie eine sprachenunabhängige Nachricht, die alle unterstützten Sprachen enthält:In your case, you send a locale-agnostic message containing all supported languages:

{
    "News_English": "...",
    "News_French": "...",
    "News_Mandarin": "..."
}

Anschließend stellen Sie sicher, dass sich die Geräte mit einer Vorlage registrieren, die auf die korrekte Eigenschaft verweist.Then you ensure that devices register with a template that refers to the correct property. Eine iOS-App, die eine Registrierung für französische Nachrichten durchführen möchte, registriert beispielsweise mit folgender Syntax:For instance, an iOS app that wants to register for French news registers using the following syntax:

{
    aps: {
        alert: "$(News_French)"
    }
}

Weitere Informationen zu Vorlagen finden Sie im Artikel Vorlagen.For more information on templates, see Templates article.

VoraussetzungenPrerequisites

Aktualisieren der App-BenutzeroberflächeUpdate the app user interface

In diesem Abschnitt modifizieren Sie die App zu aktuellen Nachrichten, die Sie in dem Thema Verwenden von Benachrichtigungshubs zum Übermitteln von Nachrichten erstellt haben, derart, dass lokalisierte aktuelle Nachrichten mit Vorlagen verschickt werden.In this section, you modify the Breaking News app that you created in the topic Use Notification Hubs to send breaking news to send localized breaking news using templates.

Fügen Sie in Ihrem MainStoryboard_iPhone.storyboard-Element ein segmentiertes Steuerelement mit den drei Sprachen hinzu: Englisch, Französisch und Mandarin.In your MainStoryboard_iPhone.storyboard, add a Segmented Control with the three languages: English, French, and Mandarin.

Erstellen der iOS-Storyboard-Benutzeroberfläche

Fügen Sie dann auf jeden Fall wie in der folgenden Abbildung gezeigt ein IBOutlet in „ViewController.h“ hinzu:Then make sure to add an IBOutlet in your ViewController.h as shown in the following image:

Erstellen der Outlets für Switches

Erstellen der iOS-AppBuild the iOS app

  1. Fügen Sie in Ihrem Notification.h-Element die retrieveLocale-Methode hinzu. Ändern Sie dann die store- und subscribe-Methoden wie im folgenden Code gezeigt:In your Notification.h, add the retrieveLocale method, and modify the store and subscribe methods as shown in the following 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;
    

    Ändern Sie in Ihrem Notification.m-Element die storeCategoriesAndSubscribe-Methode, indem Sie den locale-Parameter hinzufügen und in den Benutzerstandardwerten speichern:In your Notification.m, modify the storeCategoriesAndSubscribe method, by adding the locale parameter and storing it in the user defaults:

    - (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];
    }
    

    Ändern Sie dann die subscribe -Methode, um das Gebietsschema einzuschließen:Then modify the subscribe method to include the locale:

    - (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];
    }
    

    Sie verwenden die Methode registerTemplateWithDeviceToken anstelle von registerNativeWithDeviceToken.You use the method registerTemplateWithDeviceToken, instead of registerNativeWithDeviceToken. Bei der Registrierung für eine Vorlage muss die json-Vorlage und ein Name für die Vorlage bereitgestellt werden (da die App möglicherweise unterschiedliche Vorlagen registrieren möchte).When you register for a template, you have to provide the json template and also a name for the template (as the app might want to register different templates). Registrieren Sie Ihre Kategorien auf jeden Fall als Tags, da Sie so sicherstellen, dass Sie Benachrichtigungen für diese Nachrichten erhalten.Make sure to register your categories as tags, as you want to make sure to receive the notifications for those news.

    Fügen Sie eine Methode hinzu, um das Gebietsschema aus den Benutzerstandardeinstellungen abzurufen:Add a method to retrieve the locale from the user default settings:

    - (int) retrieveLocale {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    
        int locale = [defaults integerForKey:@"BreakingNewsLocale"];
    
        return locale < 0?0:locale;
    }
    
  2. Nachdem Sie nun die Notifications-Klasse geändert haben, müssen Sie sicherstellen, dass ViewController das neue UISegmentControl-Element verwendet.Now that you modified the Notifications class, you have to make sure that the ViewController makes use of the new UISegmentControl. Fügen Sie in der viewDidLoad-Methode die folgende Zeile hinzu, um sicherzustellen, dass das aktuell ausgewählte Gebietsschema angezeigt wird:Add the following line in the viewDidLoad method to make sure to show the locale that is currently selected:

    self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
    

    Ändern Sie dann in Ihrer subscribe-Methode den Aufruf von storeCategoriesAndSubscribe in den folgenden Code:Then, in your subscribe method, change your call to the storeCategoriesAndSubscribe to the following 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. Abschließend müssen Sie die didRegisterForRemoteNotificationsWithDeviceToken-Methode in „AppDelegate.m“ aktualisieren, damit Ihre Registrierung beim Starten der App korrekt aktualisiert wird.Finally, you have to update the didRegisterForRemoteNotificationsWithDeviceToken method in your AppDelegate.m, so that you can correctly refresh your registration when your app starts. Ändern Sie den Aufruf der subscribe-Methode für Benachrichtigungen in folgenden Code:Change your call to the subscribe method of notifications with the following 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);
        }
    }];
    

(Optional) Senden von lokalisierten Vorlagenbenachrichtigungen aus der .NET-Konsolen-App(optional) Send localized template notifications from .NET console app

Wenn Sie Vorlagenbenachrichtigungen senden, müssen Sie nur einen Satz von Eigenschaften bereitstellen.When you send template notifications, you only need to provide a set of properties. In diesem Szenario enthält der Satz von Eigenschaften die lokalisierte Version der aktuellen Nachrichten.In this scenario, the set of properties contain the localized version of the current news.

{
    "News_English": "World News in English!",
    "News_French": "World News in French!",
    "News_Mandarin": "World News in Mandarin!"
}

Senden von Benachrichtigungen mit einer C#-Konsolen-AppSend notifications using a C# console app

Dieser Abschnitt zeigt, wie Benachrichtigungen mit einer Konsolen-App gesendet werden.This section shows how to send notifications using a console app. Der Code überträgt Benachrichtigungen an Windows Store- und iOS-Geräte.The code broadcasts notifications to both Windows Store and iOS devices. Ändern Sie die SendTemplateNotificationAsync-Methode in der zuvor erstellten Konsolen-App mit dem folgenden Code:Modify the SendTemplateNotificationAsync method in the console app you previously created with the following code:

private static async void SendTemplateNotificationAsync()
{
    // Define the notification hub.
    NotificationHubClient hub = 
        NotificationHubClient.CreateClientFromConnectionString(
            "<connection string with full access>", "<hub name>");

    // 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);
    }
}

Die SendTemplateNotificationAsync-Methode übermittelt den lokalisierten Teil der Nachrichten an alle Ihre Geräte, unabhängig von der Plattform.The SendTemplateNotificationAsync method delivers the localized piece of news to all your devices, irrespective of the platform. Ihr Benachrichtigungshub erstellt und übermittelt die richtige native Nutzlast für alle Geräte, die einen bestimmten Tag abonniert haben.Your notification hub builds and delivers the correct native payload to all the devices subscribed to a specific tag.

Senden von Benachrichtigungen mit Mobile ServicesSending notification with Mobile Services

Verwenden Sie im Mobile Service-Scheduler das folgende Skript:In your Mobile Services scheduler, use the following 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");
    }
});

(Optional) Senden von lokalisierten Vorlagenbenachrichtigungen vom Gerät(optional) Send localized template notifications from the device

Wenn Sie keinen Zugriff auf Visual Studio haben oder einfach die lokalisierten Vorlagenbenachrichtigungen direkt aus der App auf dem Gerät senden möchten,If you don't have access to Visual Studio, or want to just test sending the localized template notifications directly from the app on the device. Sie können die lokalisierten Vorlagenparameter der SendNotificationRESTAPI-Methode hinzufügen, die Sie im vorherigen Tutorial definiert haben.You can add the localized template parameters to the SendNotificationRESTAPI method you defined in the previous tutorial.

- (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];
}

Nächste SchritteNext steps

In diesem Tutorial haben Sie lokalisierte Benachrichtigungen an iOS-Geräte gesendet.In this tutorial, you sent localized notifications to iOS devices. Um zu erfahren, wie Sie Pushbenachrichtigungen an bestimmte Benutzer von iOS-Apps senden, fahren Sie mit dem folgenden Tutorial fort:To learn how to push notifications to specific users of iOS apps, advance to the following tutorial: