Esercitazione: Eseguire il push di notifiche a dispositivi Windows Phone specifici con Hub di notifica di AzureTutorial: Push notifications to specific Windows Phone devices by using Azure Notification Hubs

Questa esercitazione descrive come usare Hub di notifica di Azure per inviare notifiche push a dispositivi Windows Phone 8 o Windows Phone 8.1 specifici.This tutorial shows you how to use Azure Notification Hubs to send push notifications to specific Windows Phone 8 or Windows Phone 8.1 devices. Se si usa Windows Phone 8.1 (non Silverlight), fare riferimento alla versione Windows Universal di questa esercitazione.If you are targeting Windows Phone 8.1 (non-Silverlight), see the Windows Universal version of this tutorial.

È possibile abilitare questo scenario includendo uno o più tag durante la creazione di una registrazione nell'hub di notifica.You enable this scenario by including one or more tags when creating a registration in the notification hub. Quando le notifiche vengono inviate a un tag, tutti i dispositivi che hanno effettuato la registrazione per il tag ricevono la notifica.When notifications are sent to a tag, all devices that have registered for the tag receive the notification. Per altre informazioni sui tag, vedere Tag nelle registrazioni.For more information about tags, see Tags in registrations.

Nota

L’SDK Hub di notifica per Windows Phone [AZURE.NOTE] non supporta l'uso di Windows Push Notification Service (WNS) con app per Windows Phone 8.1 Silverlight.The Notification Hubs Windows Phone SDK does not support using the Windows Push Notification Service (WNS) with Windows Phone 8.1 Silverlight apps. Per usare WNS (invece di MPNS) con le app di Windows Phone 8.1 Silverlight, completare l'[Esercitazione su Hub di notifica - Windows Phone Silverlight] seguente che usa le API REST.To use WNS (instead of MPNS) with Windows Phone 8.1 Silverlight apps, follow the [Notification Hubs - Windows Phone Silverlight tutorial], which uses REST APIs.

In questa esercitazione si apprenderà come:In this tutorial, you learn how to:

  • Aggiungere la selezione delle categorie all'app per dispositivi mobiliAdd category selection to the mobile app
  • Registrarsi per le notifiche con i tagRegister for notifications with tags
  • Inviare notifiche con tagSend tagged notifications
  • Testare l'appTest the app

prerequisitiPrerequisites

Completare l'Esercitazione: eseguire il push di notifiche alle app Windows Phone con Hub di notifica di Azure.Complete the Tutorial: Push notifications to Windows Phone apps by using Azure Notification Hubs. In questa esercitazione viene aggiornata l'applicazione per dispositivi mobili in modo da effettuare la registrazione alle categorie di ultime notizie desiderate e ricevere le notifiche push solo per tali categorie.In this tutorial, you update the mobile application so that you can register for breaking news categories you are interested in, and receive only push notifications for those categories.

Aggiungere la selezione delle categorie all'app per dispositivi mobiliAdd category selection to the mobile app

Il primo passaggio prevede l'aggiunta degli elementi dell'interfaccia utente alla pagina principale esistente per consentire all'utente di selezionare le categorie per le quali registrarsi.The first step is to add the UI elements to your existing main page that enable the user to select categories to register. Le categorie selezionate da un utente sono archiviate nel dispositivo.The categories selected by a user are stored on the device. All'avvio dell'app, viene creata una registrazione nell'hub di notifica con le categorie selezionate come tag.When the app starts, a device registration is created in your notification hub with the selected categories as tags.

  1. Aprire il file di progetto MainPage.xaml, quindi sostituire gli elementi Grid denominati TitlePanel e ContentPanel con il codice seguente:Open the MainPage.xaml project file, then replace the Grid elements named TitlePanel and ContentPanel with the following code:

     <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
         <TextBlock Text="Breaking News" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
         <TextBlock Text="Categories" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
     </StackPanel>
    
     <Grid Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
         <Grid.RowDefinitions>
             <RowDefinition Height="auto"/>
             <RowDefinition Height="auto" />
             <RowDefinition Height="auto" />
             <RowDefinition Height="auto" />
         </Grid.RowDefinitions>
         <Grid.ColumnDefinitions>
             <ColumnDefinition />
             <ColumnDefinition />
         </Grid.ColumnDefinitions>
         <CheckBox Name="WorldCheckBox" Grid.Row="0" Grid.Column="0">World</CheckBox>
         <CheckBox Name="PoliticsCheckBox" Grid.Row="1" Grid.Column="0">Politics</CheckBox>
         <CheckBox Name="BusinessCheckBox" Grid.Row="2" Grid.Column="0">Business</CheckBox>
         <CheckBox Name="TechnologyCheckBox" Grid.Row="0" Grid.Column="1">Technology</CheckBox>
         <CheckBox Name="ScienceCheckBox" Grid.Row="1" Grid.Column="1">Science</CheckBox>
         <CheckBox Name="SportsCheckBox" Grid.Row="2" Grid.Column="1">Sports</CheckBox>
         <Button Name="SubscribeButton" Content="Subscribe" HorizontalAlignment="Center" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Click="SubscribeButton_Click" />
     </Grid>
    
  2. Aggiungere al progetto una classe denominata Notifications.Add a class named Notifications to the project. Aggiungere il modificatore public alla definizione della classe.Add the public modifier to the class definition. Aggiungere quindi le istruzioni using seguenti al nuovo file di codice:Then, add the following using statements to the new code file:

    using Microsoft.Phone.Notification;
    using Microsoft.WindowsAzure.Messaging;
    using System.IO.IsolatedStorage;
    using System.Windows;
    
  3. Copiare il codice seguente nella nuova classe Notifications :Copy the following code into the new Notifications class:

    private NotificationHub hub;
    
    // Registration task to complete registration in the ChannelUriUpdated event handler
    private TaskCompletionSource<Registration> registrationTask;
    
    public Notifications(string hubName, string listenConnectionString)
    {
        hub = new NotificationHub(hubName, listenConnectionString);
    }
    
    public IEnumerable<string> RetrieveCategories()
    {
        var categories = (string)IsolatedStorageSettings.ApplicationSettings["categories"];
        return categories != null ? categories.Split(',') : new string[0];
    }
    
    public async Task<Registration> StoreCategoriesAndSubscribe(IEnumerable<string> categories)
    {
        var categoriesAsString = string.Join(",", categories);
        var settings = IsolatedStorageSettings.ApplicationSettings;
        if (!settings.Contains("categories"))
        {
            settings.Add("categories", categoriesAsString);
        }
        else
        {
            settings["categories"] = categoriesAsString;
        }
        settings.Save();
    
        return await SubscribeToCategories();
    }
    
    public async Task<Registration> SubscribeToCategories()
    {
        registrationTask = new TaskCompletionSource<Registration>();
    
        var channel = HttpNotificationChannel.Find("MyPushChannel");
    
        if (channel == null)
        {
            channel = new HttpNotificationChannel("MyPushChannel");
            channel.Open();
            channel.BindToShellToast();
            channel.ChannelUriUpdated += channel_ChannelUriUpdated;
    
            // This is optional, used to receive notifications while the app is running.
            channel.ShellToastNotificationReceived += channel_ShellToastNotificationReceived;
        }
    
        // If channel.ChannelUri is not null, complete the registrationTask here.  
        // If it is null, the registrationTask will be completed in the ChannelUriUpdated event handler.
        if (channel.ChannelUri != null)
        {
            await RegisterTemplate(channel.ChannelUri);
        }
    
        return await registrationTask.Task;
    }
    
    async void channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)
    {
        await RegisterTemplate(e.ChannelUri);
    }
    
    async Task<Registration> RegisterTemplate(Uri channelUri)
    {
        // Using a template registration to support notifications across platforms.
        // Any template notifications that contain messageParam and a corresponding tag expression
        // will be delivered for this registration.
    
        const string templateBodyMPNS = "<wp:Notification xmlns:wp=\"WPNotification\">" +
                                            "<wp:Toast>" +
                                                "<wp:Text1>$(messageParam)</wp:Text1>" +
                                            "</wp:Toast>" +
                                        "</wp:Notification>";
    
        // The stored categories tags are passed with the template registration.
    
        registrationTask.SetResult(await hub.RegisterTemplateAsync(channelUri.ToString(), 
            templateBodyMPNS, "simpleMPNSTemplateExample", this.RetrieveCategories()));
    
        return await registrationTask.Task;
    }
    
    // This is optional. It is used to receive notifications while the app is running.
    void channel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)
    {
        StringBuilder message = new StringBuilder();
        string relativeUri = string.Empty;
    
        message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());
    
        // Parse out the information that was part of the message.
        foreach (string key in e.Collection.Keys)
        {
            message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);
    
            if (string.Compare(
                key,
                "wp:Param",
                System.Globalization.CultureInfo.InvariantCulture,
                System.Globalization.CompareOptions.IgnoreCase) == 0)
            {
                relativeUri = e.Collection[key];
            }
        }
    
        // Display a dialog of all the fields in the toast.
        System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => 
        { 
            MessageBox.Show(message.ToString()); 
        });
    }
    

    Questa classe utilizza lo spazio di memorizzazione isolato per archiviare le categorie di notizie che il dispositivo deve ricevere.This class uses the isolated storage to store the categories of news that this device is to receive. Contiene inoltre i metodi di registrazione per queste categorie tramite una registrazione delle notifiche modello .It also contains methods to register for these categories using a template notification registration.

  4. Nel file di progetto App.xaml.cs aggiungere la proprietà seguente alla classe App.In the App.xaml.cs project file, add the following property to the App class. Sostituire i segnaposto <hub name> e <connection string with listen access> con il nome dell'hub di notifica e la stringa di connessione per DefaultListenSharedAccessSignature ottenuta in precedenza.Replace the <hub name> and <connection string with listen access> placeholders with your notification hub name and the connection string for DefaultListenSharedAccessSignature that you obtained earlier.

    public Notifications notifications = new Notifications("<hub name>", "<connection string with listen access>");
    

    Nota

    Poiché le credenziali che sono distribuite con un'app client in genere non sono sicure, distribuire solo la chiave per l'accesso Listen con l'app client.Because credentials that are distributed with a client app are not generally secure, you should only distribute the key for listen access with your client app. L'accesso Listen consente all'app di registrarsi per le notifiche ma le registrazioni esistenti non possono essere modificate e le notifiche non possono essere inviate.Listen access enables your app to register for notifications, but existing registrations cannot be modified and notifications cannot be sent. La chiave di accesso completo viene usata in un servizio back-end sicuro per l'invio delle notifiche e la modifica delle registrazioni esistenti.The full access key is used in a secured backend service for sending notifications and changing existing registrations.

  5. In MainPage.xaml.cs aggiungere la riga seguente:In your MainPage.xaml.cs, add the following line:

    using Windows.UI.Popups;
    
  6. Aggiungere quindi il metodo seguente nel file di progetto MainPage.xaml.cs:In the MainPage.xaml.cs project file, add the following method:

    private async void SubscribeButton_Click(object sender, RoutedEventArgs e)
    {
        var categories = new HashSet<string>();
        if (WorldCheckBox.IsChecked == true) categories.Add("World");
        if (PoliticsCheckBox.IsChecked == true) categories.Add("Politics");
        if (BusinessCheckBox.IsChecked == true) categories.Add("Business");
        if (TechnologyCheckBox.IsChecked == true) categories.Add("Technology");
        if (ScienceCheckBox.IsChecked == true) categories.Add("Science");
        if (SportsCheckBox.IsChecked == true) categories.Add("Sports");
    
        var result = await ((App)Application.Current).notifications.StoreCategoriesAndSubscribe(categories);
    
        MessageBox.Show("Subscribed to: " + string.Join(",", categories) + " on registration id : " +
            result.RegistrationId);
    }
    

    Questo metodo crea un elenco di categorie e utilizza la classe Notifications per archiviare l'elenco nell'archiviazione locale e registrare i tag corrispondenti nell'hub di notifica.This method creates a list of categories and uses the Notifications class to store the list in the local storage and register the corresponding tags with your notification hub. Se le categorie vengono modificate, la registrazione viene ricreata con le nuove categorie.When categories are changed, the registration is recreated with the new categories.

L'app può quindi archiviare un set di categorie nell'archiviazione locale del dispositivo ed effettuare la registrazione con l'hub di notifica ogni volta che l'utente modifica la selezione di categorie.Your app is now able to store a set of categories in local storage on the device and register with the notification hub whenever the user changes the selection of categories.

Registrazione per le notificheRegister for notifications

Questa procedura consente di effettuare la registrazione con l'hub di notifica all'avvio usando le categorie archiviate nella risorsa di archiviazione locale.These steps register with the notification hub on startup using the categories that have been stored in local storage.

Nota

Poiché l'URI di canale assegnato dal Servizio notifica push Microsoft può cambiare in qualsiasi momento, è necessario ripetere la registrazione per le notifiche di frequente per evitare errori di notifica.Because the channel URI assigned by the Microsoft Push Notification Service (MPNS) can change at any time, you should register for notifications frequently to avoid notification failures. Questo esempio esegue la registrazione per le notifiche a ogni avvio dell'app.This example registers for notifications every time that the app starts. Per le app che vengono eseguite con una frequenza maggiore di una volta al giorno, è possibile ignorare la registrazione per conservare la larghezza di banda qualora sia trascorso meno di un giorno dalla registrazione precedente.For apps that are run frequently, more than once a day, you can probably skip registration to preserve bandwidth if less than a day has passed since the previous registration.

  1. Aprire il file App.xaml.cs e aggiungere il modificatore async al metodo Application_Launching e sostituire il codice di registrazione di Hub di notifica aggiunto in Introduzione ad Hub di notifica con il codice seguente:Open the App.xaml.cs file and add the async modifier to Application_Launching method and replace the Notification Hubs registration code that you added in Get started with Notification Hubs with the following code:

    private async void Application_Launching(object sender, LaunchingEventArgs e)
    {
        var result = await notifications.SubscribeToCategories();
    
        if (result != null)
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                MessageBox.Show("Registration Id :" + result.RegistrationId, "Registered", MessageBoxButton.OK);
            });
    }
    

    Con questo codice, ogni volta che l'app viene avviata vengono recuperate le categorie dall'archiviazione locale e viene richiesta una registrazione per tali categorie.This code makes sure that every time the app starts it retrieves the categories from local storage and requests a registration for these categories.

  2. Nel file di progetto MainPage.xaml.cs aggiungere il codice seguente che implementa il metodo OnNavigatedTo :In the MainPage.xaml.cs project file, add the following code that implements the OnNavigatedTo method:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var categories = ((App)Application.Current).notifications.RetrieveCategories();
    
        if (categories.Contains("World")) WorldCheckBox.IsChecked = true;
        if (categories.Contains("Politics")) PoliticsCheckBox.IsChecked = true;
        if (categories.Contains("Business")) BusinessCheckBox.IsChecked = true;
        if (categories.Contains("Technology")) TechnologyCheckBox.IsChecked = true;
        if (categories.Contains("Science")) ScienceCheckBox.IsChecked = true;
        if (categories.Contains("Sports")) SportsCheckBox.IsChecked = true;
    }
    

    Questo codice aggiorna la pagina principale in base allo stato delle categorie salvate in precedenza.This code updates the main page based on the status of previously saved categories.

Ora l'app è completa e può quindi archiviare un set di categorie nell'archiviazione locale del dispositivo ed effettuare la registrazione con l'hub di notifica ogni volta che l'utente modifica la selezione di categorie.The app is now complete and can store a set of categories in the device local storage used to register with the notification hub whenever the user changes the selection of categories. Definire quindi un back-end per l'invio delle notifiche delle categorie all'app.Next, define a backend that can send category notifications to this app.

Inviare notifiche con tagSend tagged notifications

In questa sezione si invieranno notizie aggiornate come notifiche modello con tag da un'app console .NET.In this section, you send breaking news as tagged template notifications from a .NET console app.

  1. In Visual Studio creare una nuova applicazione console in Visual C#:In Visual Studio, create a new Visual C# console application:

    Collegamento all'app console

  2. Dal menu principale di Visual Studio scegliere Strumenti, > Gestione pacchetti libreria > Console di Gestione pacchetti e quindi immettere la stringa seguente nella finestra della console:On the Visual Studio main menu, select Tools > Library Package Manager > Package Manager Console and then, in the console window, enter the following string:

     Install-Package Microsoft.Azure.NotificationHubs
    
  3. Selezionare Enter (Invio).Select Enter.
    Questa azione aggiunge un riferimento ad Azure Notification Hubs SDK usando il pacchetto NuGet Microsoft.Azure.NotificationHubs.This action adds a reference to the Azure Notification Hubs SDK by using the Microsoft.Azure.Notification Hubs NuGet package.

  4. Aprire il file Program.cs e aggiungere l'istruzione using seguente:Open the Program.cs file, and add the following using statement:

    using Microsoft.Azure.NotificationHubs;
    
  5. Nella classe Program aggiungere il metodo seguente oppure sostituirlo se esiste già:In the Program class, add the following method, or replace it if it already exists:

    private static async void SendTemplateNotificationAsync()
    {
        // Define the notification hub.
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
    
        // Create an array of breaking news categories.
        var categories = new string[] { "World", "Politics", "Business", "Technology", "Science", "Sports"};
    
        // Send the notification as a template notification. All template registrations that contain
        // "messageParam" 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>();
    
        foreach (var category in categories)
        {
            templateParams["messageParam"] = "Breaking " + category + " News!";
            await hub.SendTemplateNotificationAsync(templateParams, category);
        }
    }
    

    Questo codice invia una notifica modello per ognuno dei sei tag nella matrice di stringhe.This code sends a template notification for each of the six tags in the string array. L'uso di tag garantisce che i dispositivi ricevano le notifiche solo per le categorie registrate.The use of tags ensures that devices receive notifications only for the registered categories.

  6. Nel codice precedente sostituire i segnaposto <hub name> e <connection string with full access> con il nome dell'hub di notifica e la stringa di connessione per DefaultFullSharedAccessSignature dal dashboard dell'hub di notifica.In the preceding code, replace the <hub name> and <connection string with full access> placeholders with your notification hub name and the connection string for DefaultFullSharedAccessSignature from the dashboard of your notification hub.

  7. Nel metodo Main aggiungere le righe seguenti:In the Main method, add the following lines:

    SendTemplateNotificationAsync();
    Console.ReadLine();
    
  8. Creare l'app console.Build the console app.

Testare l'appTest the app

  1. In Visual Studio premere F5 per compilare e avviare l'app.In Visual Studio, press F5 to compile and start the app.

    App per dispositivi mobili con categorie

    L'interfaccia utente dell'app fornisce un insieme di interruttori che permettono di scegliere le categorie per le quali registrarsi.The app UI provides a set of toggles that lets you choose the categories to subscribe to.

  2. Abilitare uno o più interruttori di categorie e quindi fare clic su Subscribe.Enable one or more categories toggles, then click Subscribe.

    L'app converte le categorie selezionate in tag e richiede una nuova registrazione del dispositivo per i tag selezionati dall'hub di notifica.The app converts the selected categories into tags and requests a new device registration for the selected tags from the notification hub. Le categorie registrate vengono restituite e visualizzate in una finestra di dialogo.The registered categories are returned and displayed in a dialog.

    Messaggio sottoscritto

  3. Dopo aver ricevuto una conferma di completamento della sottoscrizione delle categorie, eseguire l'app console per l'invio di notifiche per ogni categoria.After receiving a confirmation that your categories were subscription completed, run the console app to send notifications for each category. Verificare di ricevere una notifica solo per le categorie sottoscritte.Verify you only receive a notification for the categories you have subscribed to.

    Messaggio di notifica

Passaggi successiviNext steps

In questa esercitazione è stato descritto come inviare notifiche push a dispositivi specifici che hanno tag associati alle loro registrazioni.In this tutorial, you learned how to push notifications to specific devices that have tags associated with their registrations. Per informazioni sulle procedure per eseguire il push di notifiche a utenti specifici, che possono usare diversi dispositivi, passare all'esercitazione seguente:To learn how to push notifications to specific users who may be using multiple devices, advance to the following tutorial: