Tutorial: Senden von lokalisierten Pushbenachrichtigungen an iOS mit 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. In diesem Tutorial beginnen Sie mit der iOS-App, die Sie in Verwenden von Notification Hubs zum Übermitteln von aktuellen Nachrichten erstellt haben. 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.

Dieses Szenario besteht aus zwei Teilen:

  • Mit der iOS-App können Client-Geräte eine Sprache auswählen und verschiedene Nachrichtenkategorien abonnieren.
  • Das Back-End überträgt die Benachrichtigungen mithilfe des Tag- und Vorlagen-Features von Azure Notification Hubs.

In diesem Tutorial führen Sie die folgenden Schritte aus:

  • Aktualisieren der App-Benutzeroberfläche
  • Erstellen der iOS-App
  • Senden von lokalisierten Vorlagenbenachrichtigungen aus der .NET-Konsolen-App
  • Senden von lokalisierten Vorlagenbenachrichtigungen vom Gerät

Übersicht

In Verwenden von Notification Hubs zum Übermitteln von aktuellen Nachrichten haben Sie eine App erstellt, in der Benutzer mit Tags Nachrichten aus verschiedenen Kategorien abonnieren können. Viele Apps richten sich jedoch an verschiedene Märkte und müssen lokalisiert werden. In diesen Fällen muss auch der Inhalt der Benachrichtigungen lokalisiert und an die korrekten Geräte ausgeliefert werden. Dieses Tutorial zeigt Ihnen, wie Sie mit dem Feature für Vorlagen von Notification Hubs lokalisierte Benachrichtigungen über Nachrichten verschicken.

Hinweis

Sie können mehrere Versionen der einzelnen Tags erstellen, um lokalisierte Benachrichtigungen zu verschicken. 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“. Anschließend müssten Sie eine lokalisierte Version der Nachrichten an die einzelnen Tags schicken. In diesem Thema verwenden Sie Vorlagen, um die Anzahl der Tags einzugrenzen und den Versand mehrerer Nachrichten zu vermeiden.

Mit Vorlagen können Sie festlegen, wie ein bestimmtes Gerät eine Benachrichtigung empfangen soll. Die Vorlage gibt das exakte Format der Nutzlast anhand von Eigenschaften an, die Teil der von Ihrem Back-End verschickten Nachricht sind. In Ihrem Fall senden Sie eine sprachenunabhängige Nachricht, die alle unterstützten Sprachen enthält:

{
    "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. Eine iOS-App, die eine Registrierung für französische Nachrichten durchführen möchte, registriert beispielsweise mit folgender Syntax:

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

Weitere Informationen zu Vorlagen finden Sie im Artikel Vorlagen.

Voraussetzungen

Aktualisieren der App-Benutzeroberfläche

In diesem Abschnitt modifizieren Sie die App zu aktuellen Nachrichten, die Sie in dem Thema Verwenden von Notification Hubs zum Übermitteln von aktuellen Nachrichten erstellt haben, derart, dass lokalisierte aktuelle Nachrichten mit Vorlagen verschickt werden.

Fügen Sie in MainStoryboard_iPhone.storyboard ein segmentiertes Steuerelement mit den drei Sprachen Englisch, Französisch und Mandarin hinzu.

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:

Erstellen der Outlets für Switches

Erstellen der 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:

    - (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:

    - (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:

    - (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. 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). Registrieren Sie Ihre Kategorien auf jeden Fall als Tags, da Sie so sicherstellen, dass Sie Benachrichtigungen für diese Nachrichten erhalten.

    Fügen Sie eine Methode hinzu, um das Gebietsschema aus den Benutzerstandardeinstellungen abzurufen:

    - (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. Fügen Sie in der viewDidLoad-Methode die folgende Zeile hinzu, um sicherzustellen, dass das aktuell ausgewählte Gebietsschema angezeigt wird:

    self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
    

    Ändern Sie dann in Ihrer subscribe-Methode den Aufruf von storeCategoriesAndSubscribe in den folgenden 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. Ändern Sie den Aufruf der subscribe-Methode für Benachrichtigungen in folgenden 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

Wenn Sie Vorlagenbenachrichtigungen senden, müssen Sie nur einen Satz von Eigenschaften bereitstellen. In diesem Szenario enthält der Satz von Eigenschaften die lokalisierte Version der aktuellen Nachrichten.

{
    "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-App

Dieser Abschnitt zeigt, wie Benachrichtigungen mit einer Konsolen-App gesendet werden. Der Code überträgt Benachrichtigungen an Windows Store- und iOS-Geräte. Ändern Sie die SendTemplateNotificationAsync-Methode in der zuvor erstellten Konsolen-App mit dem folgenden 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);
    }
}

Die SendTemplateNotificationAsync-Methode übermittelt den lokalisierten Teil der Nachrichten an alle Ihre Geräte, unabhängig von der Plattform. Ihr Benachrichtigungshub erstellt und übermittelt die richtige native Nutzlast für alle Geräte, die einen bestimmten Tag abonniert haben.

Senden von Benachrichtigungen mit Mobile Services

Verwenden Sie im Mobile Service-Scheduler das folgende Skript:

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

Wenn Sie keinen Zugriff auf Visual Studio haben oder einfach die lokalisierten Vorlagenbenachrichtigungen direkt aus der App auf dem Gerät senden möchten, Sie können die lokalisierten Vorlagenparameter der SendNotificationRESTAPI-Methode hinzufügen, die Sie im vorherigen Tutorial definiert haben.

- (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 Schritte

In diesem Tutorial haben Sie lokalisierte Benachrichtigungen an iOS-Geräte gesendet. Um zu erfahren, wie Sie Pushbenachrichtigungen an bestimmte Benutzer von iOS-Apps senden, fahren Sie mit dem folgenden Tutorial fort: