Tutorial: Notificações push localizada para dispositivos iOS com Notification Hubs do AzureTutorial: Push localized notifications to iOS devices using Azure Notification Hubs

Este tutorial mostra-lhe como utilizar o modelos funcionalidade dos Hubs de notificação do Azure para difundir notificações de notícias de última hora que foram localizadas por idioma e o dispositivo.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. Neste tutorial, começa com a aplicação iOS criada no Use Notification Hubs to send breaking news (Utilizar Hubs de Notificação para enviar notícias de última hora).In this tutorial, you start with the iOS app created in Use Notification Hubs to send breaking news. Quando terminar, pode se registrar para categorias que tiver interesse em, especificar um idioma no qual pretende receber as notificações e receber notificações de push apenas para as categorias selecionadas nesse idioma.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.

Existem duas partes para este cenário:There are two parts to this scenario:

  • aplicação iOS permite cliente dispositivos para especificar um idioma e subscrever as categorias de notícias de última hora diferentes;iOS app allows client devices to specify a language, and to subscribe to different breaking news categories;
  • O back-end difunde as notificações, utilizando o tag e modelo funcionalidades dos Hubs de notificação do Azure.The back-end broadcasts the notifications, using the tag and template features of Azure Notification Hubs.

Neste tutorial, siga os passos seguintes:In this tutorial, you take the following steps:

  • Atualizar a interface de utilizador de aplicaçãoUpdate the app user interface
  • Compilar a aplicação para iOSBuild the iOS app
  • Enviar notificações de localizado do modelo de aplicação de consola .NETSend localized template notifications from .NET console app
  • Enviar notificações localizadas de modelo do dispositivoSend localized template notifications from the device

Descrição geralOverview

Na Use Notification Hubs to send breaking news (Utilizar Hubs de Notificação para enviar notícias de última hora), criou uma aplicação que utilizada etiquetas subscrever notificações para as categorias de notícias diferentes.In Use Notification Hubs to send breaking news, you built an app that used tags to subscribe to notifications for different news categories. Muitas aplicações, no entanto, vários mercados de destino e requerem localização.Many apps, however, target multiple markets and require localization. Isso significa que o conteúdo das notificações próprios tem de estar localizado e entregues para o conjunto correto de dispositivos.It means that the content of the notifications themselves have to be localized and delivered to the correct set of devices. Este tutorial mostra-lhe como utilizar o modelo funcionalidade dos Hubs de notificação para fornecer facilmente notificações de notícias de última hora localizada.This tutorial shows you how to use the template feature of Notification Hubs to easily deliver localized breaking news notifications.

Nota

É uma forma de enviar notificações localizadas criar várias versões de cada etiqueta.One way to send localized notifications is to create multiple versions of each tag. Por exemplo, para oferecer suporte a inglês, francês e Mandarim, terá de ter três etiquetas diferentes para notícias do mundo: "world_en", "world_fr," e "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". Em seguida, terá de enviar uma versão localizada de notícias do mundo para cada uma dessas marcas.You would then have to send a localized version of the world news to each of these tags. Neste tópico, utilize modelos para evitar a proliferação de etiquetas e o requisito de enviar várias mensagens.In this topic, you use templates to avoid the proliferation of tags and the requirement of sending multiple messages.

Os modelos são uma forma de especificar a forma como um dispositivo específico deve receber uma notificação.Templates are a way to specify how a specific device should receive a notification. O modelo especifica o formato de payload exato ao consultar as propriedades que fazem parte da mensagem enviada pelo back-end da sua aplicação.The template specifies the exact payload format by referring to properties that are part of the message sent by your app back-end. No seu caso, envia uma mensagem de independente de localidade que contém todos os idiomas suportados:In your case, you send a locale-agnostic message containing all supported languages:

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

Em seguida, é garantir que os dispositivos registrar com um modelo que se refere-se para a propriedade correta.Then you ensure that devices register with a template that refers to the correct property. Por exemplo, uma aplicação iOS que pretende registar de notícias francês registra utilizando a seguinte sintaxe:For instance, an iOS app that wants to register for French news registers using the following syntax:

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

Para obter mais informações sobre modelos, consulte modelos artigo.For more information on templates, see Templates article.

Pré-requisitosPrerequisites

Atualizar a interface de utilizador de aplicaçãoUpdate the app user interface

Nesta secção, modificar a aplicação de notícias de última hora que criou no tópico Use Notification Hubs to send breaking news (Utilizar Hubs de Notificação para enviar notícias de última hora) enviar localizadas através de modelos de notícias de última hora.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.

No seu MainStoryboard_iPhone.storyboard, adicione um controlo segmentados com os três idiomas: Inglês, francês e Mandarim.In your MainStoryboard_iPhone.storyboard, add a Segmented Control with the three languages: English, French, and Mandarin.

Criar o storyboard de interface do Usuário do iOS

Em seguida, certifique-se adicionar um IBOutlet no seu viewcontroller. H, conforme mostrado na imagem seguinte:Then make sure to add an IBOutlet in your ViewController.h as shown in the following image:

Criar para os comutadores de comunicação

Compilar a aplicação para iOSBuild the iOS app

  1. No seu Notification.h, adicione o retrieveLocale método e modificar o arquivo e subscrever métodos, conforme mostrado no seguinte código: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;
    

    No seu Notification.m, modifique o storeCategoriesAndSubscribe método, adicionando o locale parâmetro e armazená-la nas predefinições de utilizador: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];
    }
    

    Em seguida, modifique o subscrever método para incluir a Localidade: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];
    }
    

    Use o método registerTemplateWithDeviceToken, em vez de registerNativeWithDeviceToken.You use the method registerTemplateWithDeviceToken, instead of registerNativeWithDeviceToken. Quando se registra para um modelo, terá de fornecer o modelo json e também um nome para o modelo (como a aplicação deve registar modelos diferentes).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). Certifique-se registrar seu categorias como etiquetas, desejar certificar-se receber as notificações para obter as notícias.Make sure to register your categories as tags, as you want to make sure to receive the notifications for those news.

    Adicione um método para recuperar a Localidade das predefinições de utilizador: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. Agora que modificou o Notifications classe, tem para se certificar de que o ViewController faz uso da nova UISegmentControl.Now that you modified the Notifications class, you have to make sure that the ViewController makes use of the new UISegmentControl. Adicione a seguinte linha no viewDidLoad método para certificar-se de que mostram a Localidade atualmente selecionado:Add the following line in the viewDidLoad method to make sure to show the locale that is currently selected:

    self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
    

    Em seguida, no seu subscribe método, alterar a sua chamada para o storeCategoriesAndSubscribe para o código a seguir: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. Por fim, é necessário atualizar o didRegisterForRemoteNotificationsWithDeviceToken método no seu Appdelegate, para que corretamente, pode atualizar o registo quando a aplicação for iniciada.Finally, you have to update the didRegisterForRemoteNotificationsWithDeviceToken method in your AppDelegate.m, so that you can correctly refresh your registration when your app starts. Alterar a sua chamada para o subscribe método de notificações com o código a seguir: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);
        }
    }];
    

(opcional) Enviar notificações de localizado do modelo de aplicação de consola .NET(optional) Send localized template notifications from .NET console app

Quando enviar notificações de modelos, apenas terá de fornecer um conjunto de propriedades.When you send template notifications, you only need to provide a set of properties. Neste cenário, o conjunto de propriedades contém a versão localizada da notícia atual.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!"
}

Enviar notificações através de uma aplicação de consola c#Send notifications using a C# console app

Esta secção mostra como enviar notificações através de uma aplicação de consola.This section shows how to send notifications using a console app. O código difunde notificações push para dispositivos Windows Store e iOS.The code broadcasts notifications to both Windows Store and iOS devices. Modifique o método SendTemplateNotificationAsync na aplicação de consola que criou anteriormente com o seguinte código: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);
    }
}

O método SendTemplateNotificationAsync fornece notícias para a informação localizada todos os seus dispositivos, independentemente da plataforma.The SendTemplateNotificationAsync method delivers the localized piece of news to all your devices, irrespective of the platform. O hub de notificação baseia-se e fornece o payload nativo correto para todos os dispositivos subscritos uma etiqueta específica.Your notification hub builds and delivers the correct native payload to all the devices subscribed to a specific tag.

Enviar notificação com os serviços móveisSending notification with Mobile Services

No agendador de serviços móveis, utilize o seguinte script: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");
    }
});

(opcional) Enviar notificações localizadas de modelo do dispositivo(optional) Send localized template notifications from the device

Se não tem acesso ao Visual Studio, ou apenas pretende teste enviar as notificações de modelo localizada diretamente a partir da aplicação no dispositivo.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. Pode adicionar parâmetros do modelo localizada para a SendNotificationRESTAPI método definido no tutorial anterior.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];
}

Passos SeguintesNext steps

Neste tutorial, enviou notificações localizadas para dispositivos iOS.In this tutorial, you sent localized notifications to iOS devices. Para saber como enviar notificações push para utilizadores específicos de aplicações iOS, avance para o tutorial seguinte:To learn how to push notifications to specific users of iOS apps, advance to the following tutorial:

Push notifications to specific users (Enviar notificações para utilizadores específicos)Push notifications to specific users