Esercitazione: inviare notifiche push localizzate a iOS usando hub di notifica di AzureTutorial: Send localized push notifications to iOS using Azure Notification Hubs

In questa esercitazione viene illustrato come usare 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 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. In questa esercitazione verrà usata l'app di iOS creata in Uso di Hub di notifica per inviare le ultime notizie.In this tutorial, you start with the iOS app created in Use Notification Hubs to send breaking news. Al termine, è possibile registrarsi per le categorie a cui si è interessati, specificare una lingua in cui ricevere le notifiche e ricevere solo le notifiche push per le categorie selezionate in tale lingua.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.

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 features of Azure Notification Hubs.

In questa esercitazione vengono completati i passaggi seguenti:In this tutorial, you take the following steps:

  • Aggiornare l'interfaccia utente dell'appUpdate the app user interface
  • Compilare l'app iOSBuild the iOS app
  • Inviare notifiche modello localizzate dall'app console .NETSend localized template notifications from .NET console app
  • Inviare notifiche modello localizzate dal dispositivoSend localized template notifications from the device

PanoramicaOverview

In Uso di Hub di notifica per inviare le ultime notizie è stata creata un'app che usa 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 stesse deve essere localizzato e inviato al set di dispositivi corretto.It means that the content of the notifications themselves have to be localized and delivered to the correct set of devices. In questa esercitazione viene usata la funzionalità relativa ai modelli di Hub di notifica per inviare facilmente notifiche relative alle ultime notizie localizzate.This tutorial shows you 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.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, you 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.You would then have to send a localized version of the world news to each of these tags. In questo argomento verranno usati i modelli per evitare la proliferazione di tag e la necessità di inviare più messaggi.In this topic, you use templates to avoid the proliferation of tags and the requirement of sending multiple messages.

I modelli consentono di specificare il modo in cui un dispositivo specifico deve ricevere una notifica.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 your case, you send a locale-agnostic message containing all supported languages:

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

Si procede quindi a verificare che i dispositivi effettuino la registrazione con un modello che faccia riferimento alla proprietà corretta.Then you 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 con la sintassi seguente:For instance, an iOS app that wants to register for French news registers using the following syntax:

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

Per altre informazioni sui modelli, vedere l'articolo Modelli.For more information on templates, see Templates article.

PrerequisitiPrerequisites

Aggiornare l'interfaccia utente dell'appUpdate the app user interface

In questa sezione l'app Breaking News creata nell'argomento Uso di Hub di notifica per inviare le ultime notizie viene modificata in modo da inviare notizie localizzate mediante modelli.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.

Nel MainStoryboard_iPhone.storyboard aggiungere un controllo segmentato con le tre lingue seguenti: inglese, francese e mandarino.In your MainStoryboard_iPhone.storyboard, add a Segmented Control with the three languages: English, French, and Mandarin.

Creazione di storyboard dell'interfaccia utente iOS

Assicurarsi quindi di aggiungere un elemento IBOutlet in ViewController.h come illustrato nell'immagine seguente:Then make sure to add an IBOutlet in your ViewController.h as shown in the following image:

Creare outlet per le opzioni

Compilare l'app iOSBuild the iOS app

  1. Nel Notification.h aggiungere il metodo retrieveLocale e modificare i metodi di archiviazione e sottoscrizione come illustrato nel codice seguente: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;
    

    In Notification.m modificare il metodo storeCategoriesAndSubscribe aggiungendo il parametro locale e archiviandolo nelle impostazioni utente predefinite: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 usa il metodo registerTemplateWithDeviceToken, invece di registerNativeWithDeviceToken.You use 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 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). Assicurarsi di registrare le categorie come tag, perché è necessario ricevere notifiche per le notizie.Make sure to register your categories as tags, as you want to make sure to receive the notifications 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. Dopo aver modificato la classe Notifications, è necessario verificare che ViewController usi il nuovo UISegmentControl.Now that you modified the Notifications class, you have to make sure that the 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 sostituire quindi la chiamata a storeCategoriesAndSubscribe con il codice seguente: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. Aggiornare infine il metodo didRegisterForRemoteNotificationsWithDeviceToken in AppDelegate.m, per poter 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 con il codice seguente: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);
        }
    }];
    

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

Quando si inviano notifiche modello, è necessario fornire solo un set di proprietà.When you send template notifications, you only need to provide a set of properties. In questo scenario il set di proprietà contiene la versione localizzata delle notizie correnti.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!"
}

Inviare notifiche tramite un'app console C#Send notifications using a C# console app

Questa sezione illustra come inviare notifiche tramite un'app console.This section shows how to send notifications using a console app. Il codice trasmette le notifiche ai dispositivi iOS e Windows Store.The code broadcasts notifications to both Windows Store and iOS devices. 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:

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

Il metodo SendTemplateNotificationAsync distribuisce la notizia localizzata a tutti i dispositivi, indipendentemente dalla piattaforma.The SendTemplateNotificationAsync method delivers the localized piece of news to all your devices, irrespective of the platform. L'hub di notifica crea il payload nativo corretto e lo distribuisce a tutti i dispositivi che hanno sottoscritto un tag specifico.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 notification with Mobile Services

Nell'utilità di pianificazione di Servizi mobili usare lo script seguente: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");
    }
});

(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 i parametri di modello localizzato per il metodo SendNotificationRESTAPI definito nell'esercitazione precedente.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];
}

Passaggi successiviNext steps

In questa esercitazione le notifiche localizzate sono state inviate ai dispositivi iOS.In this tutorial, you sent localized notifications to iOS devices. Per informazioni sulle procedure per eseguire il push di notifiche a utenti specifici di app iOS, passare all'esercitazione seguente:To learn how to push notifications to specific users of iOS apps, advance to the following tutorial: