Självstudie: Skicka lokaliserade push-meddelanden till iOS med Hjälp av Azure Notification Hubs

Den här självstudien visar hur du använder mallfunktionen i Azure Notification Hubs för att sända meddelanden om senaste nytt som har lokaliserats efter språk och enhet. I den här självstudien börjar du med den iOS-app som skapades i Använda Notification Hubs för att skicka de senaste nyheterna. När du är klar kan du registrera dig för kategorier som du är intresserad av, ange ett språk där du vill ta emot meddelanden och endast ta emot push-meddelanden för de valda kategorierna på det språket.

Det finns två delar i det här scenariot:

  • Med iOS-appen kan klientenheter ange ett språk och prenumerera på olika nyhetskategorier.
  • Serverdelen sänder meddelandena med hjälp av tagg - och mallfunktionerna i Azure Notification Hubs.

I den här självstudien gör du följande:

  • Uppdatera appens användargränssnitt
  • Skapa iOS-appen
  • Skicka lokaliserade mallmeddelanden från .NET-konsolappen
  • Skicka lokaliserade mallmeddelanden från enheten

Översikt

I Använda Notification Hubs för att skicka senaste nytt skapade du en app som använde taggar för att prenumerera på meddelanden för olika nyhetskategorier. Många appar riktar sig dock mot flera marknader och kräver lokalisering. Det innebär att innehållet i själva meddelandena måste lokaliseras och levereras till rätt uppsättning enheter. Den här självstudien visar hur du använder mallfunktionen i Notification Hubs för att enkelt leverera lokaliserade meddelanden om senaste nytt.

Anteckning

Ett sätt att skicka lokaliserade meddelanden är att skapa flera versioner av varje tagg. För att till exempel stödja engelska, franska och mandarin behöver du tre olika taggar för världsnyheter: "world_en", "world_fr" och "world_ch". Då skulle du behöva skicka en lokaliserad version av världsnyheterna till var och en av dessa taggar. I det här avsnittet använder du mallar för att undvika spridning av taggar och kravet på att skicka flera meddelanden.

Mallar är ett sätt att ange hur en specifik enhet ska få ett meddelande. Mallen anger det exakta nyttolastformatet genom att referera till egenskaper som ingår i meddelandet som skickas av appserverdelen. I ditt fall skickar du ett språkspecifikt agnostiskt meddelande som innehåller alla språk som stöds:

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

Sedan ser du till att enheterna registreras med en mall som refererar till rätt egenskap. Till exempel en iOS-app som vill registrera sig för franska nyhetsregister med följande syntax:

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

Mer information om mallar finns i artikeln Mallar .

Förutsättningar

Uppdatera appens användargränssnitt

I det här avsnittet ändrar du appen Senaste nytt som du skapade i avsnittet Använda Notification Hubs för att skicka senaste nytt för att skicka lokaliserade senaste nytt med hjälp av mallar.

I lägger du MainStoryboard_iPhone.storyboardtill en segmenterad kontroll med de tre språken: engelska, franska och mandarin.

Skapa iOS UI-storyboarden

Se sedan till att lägga till en IBOutlet i Din ViewController.h enligt följande bild:

Skapa uttag för växlarna

Skapa iOS-appen

  1. I lägger du Notification.htill retrieveLocale metoden och ändrar lagrings- och prenumerationsmetoderna enligt följande kod:

    - (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 ändrar du Notification.mstoreCategoriesAndSubscribe metoden genom att lägga till parametern locale och lagra den i standardinställningarna för användaren:

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

    Ändra sedan prenumerationsmetoden så att den innehåller språkvarianten:

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

    Du använder metoden registerTemplateWithDeviceToken, i stället för registerNativeWithDeviceToken. När du registrerar dig för en mall måste du ange json-mallen och även ett namn för mallen (eftersom appen kanske vill registrera olika mallar). Se till att registrera dina kategorier som taggar, eftersom du vill se till att ta emot aviseringarna för dessa nyheter.

    Lägg till en metod för att hämta nationella inställningar från användarens standardinställningar:

    - (int) retrieveLocale {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    
        int locale = [defaults integerForKey:@"BreakingNewsLocale"];
    
        return locale < 0?0:locale;
    }
    
  2. Nu när du har ändrat Notifications klassen måste du se till att ViewController använder den nya UISegmentControl. Lägg till följande rad i viewDidLoad metoden för att se till att visa de nationella inställningar som är markerade för tillfället:

    self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
    

    I din subscribe -metod ändrar du sedan anropet storeCategoriesAndSubscribe till följande kod:

    [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. Slutligen måste du uppdatera didRegisterForRemoteNotificationsWithDeviceToken metoden i din AppDelegate.m så att du kan uppdatera registreringen korrekt när appen startar. Ändra anropet subscribe till meddelandemetoden med följande kod:

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

(valfritt) Skicka lokaliserade mallmeddelanden från .NET-konsolappen

När du skickar mallmeddelanden behöver du bara ange en uppsättning egenskaper. I det här scenariot innehåller uppsättningen egenskaper den lokaliserade versionen av de aktuella nyheterna.

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

Skicka meddelanden med hjälp av en C#-konsolapp

Det här avsnittet visar hur du skickar meddelanden med hjälp av en konsolapp. Koden sänder meddelanden till både Windows Store- och iOS-enheter. Ändra metoden SendTemplateNotificationAsync i den konsolapp som du skapade tidigare med följande kod:

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

Metoden SendTemplateNotificationAsync levererar lokaliserade nyheter till alla dina enheter, oavsett plattform. Din meddelandehubb skapar och levererar rätt inbyggd nyttolast till alla enheter som prenumererar på en specifik tagg.

Skicka meddelande med Mobile Services

Använd följande skript i Mobile Services-schemaläggaren:

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

(valfritt) Skicka lokaliserade mallmeddelanden från enheten

Om du inte har åtkomst till Visual Studio eller bara vill testa att skicka lokaliserade mallmeddelanden direkt från appen på enheten. Du kan lägga till de lokaliserade mallparametrarna till den SendNotificationRESTAPI metod som du definierade i föregående självstudie.

- (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ästa steg

I den här självstudien har du skickat lokaliserade meddelanden till iOS-enheter. Om du vill lära dig hur du skickar meddelanden till specifika användare av iOS-appar går du vidare till följande självstudie: