Uso di Hub di notifica per inviare le ultime notizie localizzate ai dispositivi iOSUse Notification Hubs to send localized breaking news to iOS devices

PanoramicaOverview

In questo argomento viene illustrato come utilizzare la funzionalità relativa ai modelli di Hub di notifica di Azure per trasmettere notifiche relative alle ultime notizie localizzate in base alla lingua e al dispositivo.This topic 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 questa esercitazione verrà utilizzata l'app di iOS creata in Utilizzo di Hub di notifica per inviare le e ultime notizie.In this tutorial you start with the iOS app created in [Use Notification Hubs to send breaking news]. Al termine, sarà possibile effettuare la registrazione per le categorie di proprio interesse, specificare la lingua in cui ricevere le notifiche e ricevere solo notifiche push per le categorie selezionate nella lingua scelta.When complete, you will be able to register for categories you are interested in, specify a language in which to receive the notifications, and receive only push notifications for the selected categories in that language.

Lo scenario è composto da due parti:There are two parts to this scenario:

  • l'app per iOS consente ai dispositivi client di specificare una lingua e di sottoscrivere categorie diverse di ultime notizie;iOS app allows client devices to specify a language, and to subscribe to different breaking news categories;
  • il back-end trasmette le notifiche usando le funzionalità relative ai tag e ai modelli di Hub di notifica di Azure.the back-end broadcasts the notifications, using the tag and template feautres of Azure Notification Hubs.

PrerequisitiPrerequisites

È necessario aver completato l'esercitazione Utilizzo di Hub di notifica per inviare le e ultime notizie e disporre del relativo codice, in quanto questa esercitazione è basata direttamente su tale codice.You must have already completed the [Use Notification Hubs to send breaking news] tutorial and have the code available, because this tutorial builds directly upon that code.

Visual Studio 2012 o versione successiva è facoltativo.Visual Studio 2012 or later is optional.

Concetti relativi ai modelliTemplate concepts

In Utilizzo di Hub di notifica per inviare le e ultime notizie è stata creata un'app che utilizza i tag per sottoscrivere le notifiche per diverse categorie di notizie.In [Use Notification Hubs to send breaking news] you built an app that used tags to subscribe to notifications for different news categories. Molte app, tuttavia, sono destinate a più mercati ed è necessario localizzarle.Many apps, however, target multiple markets and require localization. Questo significa che il contenuto delle notifiche deve essere localizzato e inviato al set di dispositivi corretto.This means that the content of the notifications themselves have to be localized and delivered to the correct set of devices. In questo argomento verrà illustrato come usare la funzionalità relativa ai modelli di Hub di notifica per inviare facilmente notifiche relative alle ultime notizie localizzate.In this topic we will show how to use the template feature of Notification Hubs to easily deliver localized breaking news notifications.

Nota: un possibile modo per inviare notifiche localizzate consiste nel creare più versioni di ogni tag.Note: one way to send localized notifications is to create multiple versions of each tag. Per supportare l'inglese, il francese e il mandarino, ad esempio, sono necessari tre tag diversi per le ultime notizie internazionali: "world_en", "world_fr" e "world_ch".For instance, to support English, French, and Mandarin, we would need three different tags for world news: "world_en", "world_fr", and "world_ch". È quindi necessario inviare una versione localizzata delle ultime notizie internazionali a ogni tag.We would then have to send a localized version of the world news to each of these tags. In questo argomento verranno utilizzati i modelli per evitare la proliferazione di tag e la necessità di inviare più messaggi.In this topic we use templates to avoid the proliferation of tags and the requirement of sending multiple messages.

In linea generale, i modelli consentono di specificare in che modo uno specifico dispositivo deve ricevere una notifica.At a high level, templates are a way to specify how a specific device should receive a notification. Il modello definisce lo specifico formato di payload da utilizzare, facendo riferimento alle proprietà del messaggio inviato dal back-end dell'app.The template specifies the exact payload format by referring to properties that are part of the message sent by your app back-end. In questo caso verrà inviato un messaggio indipendente dalle impostazioni locali, che contiene tutte le lingue supportate:In our case, we will send a locale-agnostic message containing all supported languages:

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

Si procederà quindi a verificare che i dispositivi effettuino la registrazione con un modello che faccia riferimento alla proprietà corretta.Then we will ensure that devices register with a template that refers to the correct property. Per un'app per iOS che deve essere registrata per le notizie in francese, ad esempio, si effettuerà la registrazione nel modo seguente:For instance, an iOS app that wants to register for French news will register the following:

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

I modelli rappresentano uno strumento particolarmente efficace. Per altre informazioni, vedere l'articolo Modelli.Templates are a very powerful feature you can learn more about in our Templates article.

Interfaccia utente dell'appThe app user interface

L'app Breaking News creata nell'argomento Utilizzo di Hub di notifica per inviare le e ultime notizie verrà ora modificata in modo da inviare notizie localizzate mediante modelli.We will now 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.

In MainStoryboard_iPhone.storyboard aggiungere un controllo Segmented con le tre lingue che saranno supportate: inglese, francese e mandarino.In your MainStoryboard_iPhone.storyboard, add a Segmented Control with the three languages which we will support: English, French, and Mandarin.

Assicurarsi quindi di aggiungere un elemento IBOutlet in ViewController.h come illustrato di seguito:Then make sure to add an IBOutlet in your ViewController.h as shown below:

Compilazione dell'app per iOSBuilding the iOS app

  1. In Notification.h aggiungere il metodo retrieveLocale , quindi modificare i metodi store e subscribe come illustrato di seguito:In your Notification.h add the retrieveLocale method, and modify the store and subscribe methods as shown below:

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

    In Notification.m modificare il metodo storeCategoriesAndSubscribe aggiungendo il parametro relativo alle impostazioni locali e archiviandolo nelle impostazioni predefinite dell'utente: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];
     }
    

    Modificare quindi il metodo subscribe in modo da includere le impostazioni locali: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];
     }
    

    Si noti che si sta ora usando il metodo registerTemplateWithDeviceToken anziché registerNativeWithDeviceToken.Note how we are now using the method registerTemplateWithDeviceToken, instead of registerNativeWithDeviceToken. Quando si effettua la registrazione per un modello, è necessario fornire il modello json e un nome per il modello. Questo perché l'app potrebbe richiedere la registrazione di modelli diversi.When we register for a template we have to provide the json template and also a name for the template (as our app might want to register different templates). Assicurarsi di registrare le categorie come tag, poiché è necessario ricevere notifiche per le notizie.Make sure to register your categories as tags, as we want to make sure to receive the notifciations for those news.

    Aggiungere un metodo per recuperare le impostazioni locali dalle impostazioni predefinite dell'utente: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. Ora che è stata modificata la classe Notifications, è necessario assicurarsi che ViewController utilizzi il nuovo UISegmentControl.Now that we modified our Notifications class, we have to make sure that our ViewController makes use of the new UISegmentControl. Aggiungere la riga seguente nel metodo viewDidLoad per assicurarsi che vengano mostrate le impostazioni locali attualmente selezionate:Add the following line in the viewDidLoad method to make sure to show the locale that is currently selected:

     self.Locale.selectedSegmentIndex = [notifications retrieveLocale];
    

    Nel metodo subscribe modificare quindi la chiamata a storeCategoriesAndSubscribe come segue:Then, in your subscribe method, change your call to the storeCategoriesAndSubscribe to the following:

     [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. Aggiornare infine il metodo didRegisterForRemoteNotificationsWithDeviceToken in AppDelegate.m, affinché sia possibile aggiornare correttamente la registrazione all'avvio dell'applicazione.Finally, you have to update the didRegisterForRemoteNotificationsWithDeviceToken method in your AppDelegate.m, so that you can correctly refresh your registration when your app starts. Modificare la chiamata al metodo subscribe delle notifiche come segue:Change your call to the subscribe method of notifications with the following:

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

(facoltativo) Invio di notifiche modello localizzate dall’app console .NET.(optional) Send localized template notifications from .NET console app.

Quando si inviano notifiche modello, è necessario solo fornire un set di proprietà. In questo caso verrà inviato il set di proprietà contenente la versione localizzata delle notizie correnti, ad esempio:When you send template notifications you only need to provide a set of properties, in our case we will send the set of properties containing the localized version of the current news, for instance:

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

In questa sezione viene illustrato come inviare notifiche tramite un’app consoleThis section shows how to send notifications using a console app

Il codice incluso trasmette le notifiche sia Windows Store che a dispositivi iOS, poiché il back-end è in grado di trasmettere a qualsiasi dispositivo supportato.The included code broadcasts to both Windows Store and iOS devices, since the backend can broadcast to any of the supported devices.

Per inviare notifiche tramite un'app console C#To send notifications using a C# console app

Modificare il metodo SendTemplateNotificationAsync nell'app console creata in precedenza con il codice seguente.Modify the SendTemplateNotificationAsync method in the console app you previously created with the following code. Si noti come in questo caso non sia necessario inviare più notifiche per impostazioni locali e piattaforme diverse.Notice how in this case there is no need to send multiple notifications for different locales and platforms.

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

Si noti che questa semplice chiamata distribuirà la notizia localizzata a tutti i dispositivi, indipendentemente dalla piattaforma, in quanto l'Hub di notifica crea il payload nativo corretto e lo distribuisce a tutti i dispositivi che hanno sottoscritto un tag specifico.Note that this simple call will deliver the localized piece of news to all your devices, irrespective of the platform, as your Notification Hub builds and delivers the correct native payload to all the devices subscribed to a specific tag.

Invio della notifica con Servizi mobiliSending the notification with Mobile Services

Nell'utilità di pianificazione di Servizi mobili, è possibile utilizzare lo script seguente:In your Mobile Service scheduler, you can 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");
    }
});

(facoltativo) Invio di notifiche modello localizzato dal dispositivo(optional) Send localized template notifications from the device

Se non si ha accesso a Visual Studio o si desidera solo l'invio di notifiche modello localizzato direttamente dall'app sul 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. È possibile aggiungere semplicemente i parametri di modello localizzato per il metodo SendNotificationRESTAPI definito nell'esercitazione precedente.You can simple 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];
    }

Fasi successiveNext Steps

Per altre informazioni sull'uso dei modelli, vedere:For more information on using templates, see: