Kurz: Odesílání lokalizovaných nabízených oznámení do iOSu pomocí Služby Notification Hubs

V tomto kurzu se dozvíte, jak pomocí funkce šablon služby Azure Notification Hubs vysílat oznámení o nejnovějších novinkách lokalizovaných podle jazyka a zařízení. V tomto kurzu začnete s aplikací pro iOS vytvořenou v tématu Použití centra oznámení k odesílání nejnovějších zpráv. Až budete hotovi, můžete se zaregistrovat do kategorií, které vás zajímají, zadat jazyk, ve kterém chcete oznámení dostávat, a přijímat jenom nabízená oznámení pro vybrané kategorie v daném jazyce.

Tento scénář má dvě části:

  • Aplikace pro iOS umožňuje klientským zařízením určit jazyk a přihlásit se k odběru různých kategorií nejnovějších zpráv.
  • Back-end vysílá oznámení pomocí funkcí značky a šablony služby Azure Notification Hubs.

V tomto kurzu provedete následující kroky:

  • Aktualizace uživatelského rozhraní aplikace
  • Sestavení aplikace pro iOS
  • Odesílání oznámení lokalizovaných šablon z konzolové aplikace .NET
  • Odesílání oznámení lokalizované šablony ze zařízení

Přehled

V části Používání centra oznámení k odesílání nejnovějších zpráv jste vytvořili aplikaci, která používá značky k odběru oznámení pro různé kategorie zpráv. Mnoho aplikací ale cílí na více trhů a vyžaduje lokalizaci. To znamená, že obsah samotných oznámení musí být lokalizován a doručen do správné sady zařízení. V tomto kurzu se dozvíte, jak pomocí funkce šablony služby Notification Hubs snadno doručovat lokalizovaná oznámení o nejnovějších novinkách.

Poznámka

Jedním ze způsobů, jak odesílat lokalizovaná oznámení, je vytvořit více verzí každé značky. Pokud chcete například podporovat angličtinu, francouzštinu a mandarínštinu, budete potřebovat tři různé značky pro světové zprávy: "world_en", "world_fr" a "world_ch". Do každé z těchto značek byste pak museli odeslat lokalizovanou verzi zpráv o světě. V tomto tématu použijete šablony, abyste zabránili šíření značek a požadavku na odesílání více zpráv.

Šablony představují způsob, jak určit, jak má konkrétní zařízení dostávat oznámení. Šablona přesně určuje formát datové části tím, že odkazuje na vlastnosti, které jsou součástí zprávy odeslané back-endovou aplikací. Ve vašem případě odešlete zprávu nezávislou na národním prostředí obsahující všechny podporované jazyky:

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

Pak zajistíte, aby se zařízení zaregistrovala pomocí šablony, která odkazuje na správnou vlastnost. Například aplikace pro iOS, která se chce zaregistrovat do francouzských novinek, zaregistruje pomocí následující syntaxe:

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

Další informace o šablonách najdete v článku Šablony .

Požadavky

Aktualizace uživatelského rozhraní aplikace

V této části upravíte aplikaci Nejnovější zprávy, kterou jste vytvořili v tématu Použití centra oznámení k odesílání nejnovějších zpráv k odesílání lokalizovaných nejnovějších zpráv pomocí šablon.

Do souboru MainStoryboard_iPhone.storyboardpřidejte segmentovaný ovládací prvek se třemi jazyky: angličtina, francouzština a mandarínština.

Vytvoření scénáře uživatelského rozhraní iOS

Pak nezapomeňte přidat IBOutlet do souboru ViewController.h, jak je znázorněno na následujícím obrázku:

Vytvoření zásuvek pro přepínače

Sestavení aplikace pro iOS

  1. V souboru přidejte metodu retrieveLocale a upravte Notification.hmetody úložiště a odběru, jak je znázorněno v následujícím kódu:

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

    V souboru upravte Notification.mmetodu storeCategoriesAndSubscribe přidáním parametru locale a jeho uložením do výchozích hodnot uživatele:

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

    Pak upravte metodu přihlášení k odběru tak, aby zahrnovala národní prostředí:

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

    Místo metody použijete metodu registerTemplateWithDeviceTokenregisterNativeWithDeviceToken. Při registraci šablony musíte zadat šablonu JSON a také název šablony (protože aplikace může chtít zaregistrovat různé šablony). Nezapomeňte zaregistrovat kategorie jako značky, protože chcete mít jistotu, že budete dostávat oznámení o těchto novinkách.

    Přidejte metodu pro načtení národního prostředí z výchozího nastavení uživatele:

    - (int) retrieveLocale {
        NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    
        int locale = [defaults integerForKey:@"BreakingNewsLocale"];
    
        return locale < 0?0:locale;
    }
    
  2. Teď, když jste upravili Notifications třídu, musíte se ujistit, že ViewController používá nový UISegmentControlobjekt . Přidejte do metody následující řádek viewDidLoad , abyste měli jistotu, že se zobrazí aktuálně vybrané národní prostředí:

    self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
    

    Pak v subscribe metodě změňte volání na storeCategoriesAndSubscribe následující kód:

    [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. Nakonec musíte aktualizovat metodu didRegisterForRemoteNotificationsWithDeviceToken v souboru AppDelegate.m, abyste mohli správně aktualizovat registraci při spuštění aplikace. Změňte volání na metodu subscribe oznámení pomocí následujícího kódu:

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

(volitelné) Odesílání oznámení lokalizovaných šablon z konzolové aplikace .NET

Při odesílání oznámení šablony stačí zadat jenom sadu vlastností. V tomto scénáři sada vlastností obsahuje lokalizovanou verzi aktuálních zpráv.

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

Odesílání oznámení pomocí konzolové aplikace c#

V této části se dozvíte, jak odesílat oznámení pomocí konzolové aplikace. Kód vysílá oznámení na zařízení s Windows Storem i iOS. Změňte metodu SendTemplateNotificationAsync konzolové aplikace vytvořené dříve přidáním následujícího kódu:

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

Metoda SendTemplateNotificationAsync doručuje lokalizované zprávy do všech vašich zařízení bez ohledu na platformu. Vaše centrum oznámení sestaví a doručí správnou nativní datovou část do všech zařízení s odběrem konkrétní značky.

Odesílání oznámení pomocí Mobile Services

V plánovači Mobile Services použijte následující 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");
    }
});

(volitelné) Odesílání oznámení lokalizované šablony ze zařízení

Pokud nemáte přístup k sadě Visual Studio nebo chcete jenom otestovat odesílání lokalizovaných oznámení šablon přímo z aplikace na zařízení. Lokalizované parametry šablony můžete přidat do SendNotificationRESTAPI metody, kterou jste definovali v předchozím kurzu.

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

Další kroky

V tomto kurzu jste odeslali lokalizovaná oznámení do zařízení s iOSem. Pokud se chcete dozvědět, jak odesílat nabízená oznámení konkrétním uživatelům aplikací pro iOS, přejděte k následujícímu kurzu: