Esercitazione: Inviare notifiche a dispositivi specifici che eseguono applicazioni piattaforma UWP (Universal Windows Platform)

Nota

Microsoft Push Notification Service (MPNS) è stato deprecato e non è più supportato.

Panoramica

Questa esercitazione illustra come usare Hub di notifica di Azure per trasmettere notifiche relative alle ultime notizie. L'esercitazione riguarda applicazioni di Windows Store o di Windows Phone 8.1 (non Silverlight). Se la destinazione è Windows Phone 8.1 Silverlight, vedere Inviare notifiche push a specifici dispositivi Windows Phone con Hub di notifica di Azure.

Questa esercitazione illustra come usare Hub di notifica di Azure per inviare notifiche push a specifici dispositivi Windows che eseguono un'applicazione della piattaforma UWP (Universal Windows Platform). Dopo aver completato l'esercitazione, è possibile registrarsi alle categorie di notizie a cui si è interessati. Si riceveranno notifiche push solo per tali categorie.

Per abilitare scenari di trasmissione, includere uno o più tag durante la creazione di una registrazione nell'hub di notifica. Quando le notifiche vengono inviate a un tag, tutti i dispositivi registrati per il tag le riceveranno. Per altre informazioni sui tag, vedere Routing ed espressioni tag.

Nota

I progetti creati con Windows Store e Windows Phone versione 8.1 e precedenti non sono supportati in Visual Studio 2019. Per altre informazioni, vedere Selezione della piattaforma e compatibilità di Visual Studio 2019.

In questa esercitazione si eseguiranno le attività seguenti:

  • Aggiungere la selezione delle categorie all'app per dispositivi mobili
  • Registrazione per le notifiche
  • Inviare notifiche con tag
  • Eseguire l'app e generare notifiche

Prerequisiti

Completare l'Esercitazione: inviare notifiche alle app della piattaforma UWP (Universal Windows Platform) con Hub di notifica di Azure prima di iniziare questa esercitazione.

Aggiungere la selezione delle categorie all'app

Il primo passaggio consiste nell'aggiunta degli elementi dell'interfaccia utente alla pagina principale esistente per permettere agli utenti di selezionare le categorie per le quali registrarsi. Le categorie selezionate vengono archiviate nel dispositivo. All'avvio dell'app, viene creata una registrazione del dispositivo nell'hub di notifica, con le categorie selezionate come tag.

  1. Aprire il file di progetto MainPage.xaml e quindi copiare il codice seguente nell'elemento Grid :

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"  TextWrapping="Wrap" Text="Breaking News" FontSize="42" VerticalAlignment="Top" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="World" Name="WorldToggle" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Politics" Name="PoliticsToggle" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Business" Name="BusinessToggle" Grid.Row="3" Grid.Column="0" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Technology" Name="TechnologyToggle" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Science" Name="ScienceToggle" Grid.Row="2" Grid.Column="1" HorizontalAlignment="Center"/>
        <ToggleSwitch Header="Sports" Name="SportsToggle" Grid.Row="3" Grid.Column="1" HorizontalAlignment="Center"/>
        <Button Name="SubscribeButton" Content="Subscribe" HorizontalAlignment="Center" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Click="SubscribeButton_Click"/>
    </Grid>
    
  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto e scegliere Aggiungi>Classe. In Aggiungi nuovo elemento assegnare alla classe il nome Notifications e selezionare Aggiungi. Se necessario, aggiungere il modificatore public alla definizione della classe.

  3. Aggiungere le istruzioni using seguenti al nuovo file:

    using Windows.Networking.PushNotifications;
    using Microsoft.WindowsAzure.Messaging;
    using Windows.Storage;
    using System.Threading.Tasks;
    
  4. Copiare il codice seguente nella nuova classe Notifications:

    private NotificationHub hub;
    
    public Notifications(string hubName, string listenConnectionString)
    {
        hub = new NotificationHub(hubName, listenConnectionString);
    }
    
    public async Task<Registration> StoreCategoriesAndSubscribe(IEnumerable<string> categories)
    {
        ApplicationData.Current.LocalSettings.Values["categories"] = string.Join(",", categories);
        return await SubscribeToCategories(categories);
    }
    
    public IEnumerable<string> RetrieveCategories()
    {
        var categories = (string) ApplicationData.Current.LocalSettings.Values["categories"];
        return categories != null ? categories.Split(','): new string[0];
    }
    
    public async Task<Registration> SubscribeToCategories(IEnumerable<string> categories = null)
    {
        var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
        if (categories == null)
        {
            categories = RetrieveCategories();
        }
    
        // 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 templateBodyWNS = "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">$(messageParam)</text></binding></visual></toast>";
    
        return await hub.RegisterTemplateAsync(channel.Uri, templateBodyWNS, "simpleWNSTemplateExample",
                categories);
    }
    

    Questa classe usa l'archiviazione locale per archiviare le categorie di notizie che devono essere ricevute dal dispositivo. Invece di chiamare il metodo RegisterNativeAsync, chiamare RegisterTemplateAsync per effettuare la registrazione per le categorie usando la registrazione di modelli.

    Se si vogliono registrare più modelli, specificare un nome di modello, ad esempio simpleWNSTemplateExample. È necessario denominare i modelli in modo da poterli aggiornare o eliminare. Si potrebbe scegliere di registrare più modelli per averne uno per gli avvisi popup e un altro per i riquadri.

    Nota

    Con Hub di notifica, un dispositivo può registrare più modelli con lo stesso tag. In questo caso, un messaggio in arrivo destinato a tale tag determina il recapito di più notifiche al dispositivo, una per ogni modello. Questo processo consente di visualizzare lo stesso messaggio in più notifiche visive, ad esempio sia come notifica che come avviso popup in un'app di Windows Store.

    Per altre informazioni, vedere Modelli.

  5. Nel file di progetto App.xaml.cs aggiungere la proprietà seguente alla classe App:

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

    Usare questa proprietà per creare e accedere a un'istanza di Notifications.

    Nel codice 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, ottenuti in precedenza.

    Nota

    Poiché le credenziali distribuite con un'app client in genere non sono sicure, distribuire solo la chiave per l'accesso in ascolto con l'app client. L'accesso in ascolto permette all'app di registrarsi per le notifiche, ma le registrazioni esistenti non possono essere modificate e le notifiche non possono essere inviate. La chiave di accesso completo viene usata in un servizio back-end sicuro per l'invio delle notifiche e la modifica delle registrazioni esistenti.

  6. Nel file MainPage.xaml.cs aggiungere la riga seguente:

    using Windows.UI.Popups;
    
  7. Nel file MainPage.xaml.cs aggiungere il metodo seguente:

    private async void SubscribeButton_Click(object sender, RoutedEventArgs e)
    {
        var categories = new HashSet<string>();
        if (WorldToggle.IsOn) categories.Add("World");
        if (PoliticsToggle.IsOn) categories.Add("Politics");
        if (BusinessToggle.IsOn) categories.Add("Business");
        if (TechnologyToggle.IsOn) categories.Add("Technology");
        if (ScienceToggle.IsOn) categories.Add("Science");
        if (SportsToggle.IsOn) categories.Add("Sports");
    
        var result = await ((App)Application.Current).notifications.StoreCategoriesAndSubscribe(categories);
    
        var dialog = new MessageDialog("Subscribed to: " + string.Join(",", categories) + " on registration Id: " + result.RegistrationId);
        dialog.Commands.Add(new UICommand("OK"));
        await dialog.ShowAsync();
    }
    

    Questo metodo crea un elenco di categorie e usa la classe Notifications per archiviare l'elenco nell'archiviazione locale. Registra inoltre i tag corrispondenti con l'hub di notifica. Se le categorie cambiano, la registrazione viene ricreata con le nuove categorie.

L'app può ora archiviare un insieme di categorie nell'archiviazione locale del dispositivo. L'app si registra con l'hub di notifica ogni volta che gli utenti modificano la selezione delle categorie.

Registrazione per le notifiche

In questa sezione si effettuerà la registrazione con l'hub di notifica all'avvio usando le categorie archiviate nell'archiviazione locale.

Nota

Poiché l'URI di canale assegnato dal servizio di notifica Windows può cambiare in qualsiasi momento, è consigliabile ripetere spesso la registrazione per le notifiche per evitare errori di notifica. In questo esempio viene effettuata la registrazione per le notifiche a ogni avvio dell'app. Per le app che vengono eseguite di frequente, ad esempio più di una volta al giorno, probabilmente è possibile ignorare la registrazione per conservare la larghezza di banda nei casi in cui è trascorso meno di un giorno dalla registrazione precedente.

  1. Per usare la classe notifications per una sottoscrizione basata su categorie, aprire il file App.xaml.cs e quindi aggiornare il metodo InitNotificationsAsync.

    // *** Remove or comment out these lines ***
    //var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    //var hub = new NotificationHub("your hub name", "your listen connection string");
    //var result = await hub.RegisterNativeAsync(channel.Uri);
    
    var result = await notifications.SubscribeToCategories();
    

    Questo processo fa sì che quando viene avviata, l'app recupera le categorie dall'archiviazione locale e quindi richiede la registrazione per tali categorie. Il metodo InitNotificationsAsync è stato creato nell'ambito dell'esercitazione Inviare notifiche alle app della piattaforma UWP (Universal Windows Platform) con Hub di notifica di Azure.

  2. Nel file di progetto MainPage.xaml.cs aggiungere il codice seguente nel metodo OnNavigatedTo:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        var categories = ((App)Application.Current).notifications.RetrieveCategories();
    
        if (categories.Contains("World")) WorldToggle.IsOn = true;
        if (categories.Contains("Politics")) PoliticsToggle.IsOn = true;
        if (categories.Contains("Business")) BusinessToggle.IsOn = true;
        if (categories.Contains("Technology")) TechnologyToggle.IsOn = true;
        if (categories.Contains("Science")) ScienceToggle.IsOn = true;
        if (categories.Contains("Sports")) SportsToggle.IsOn = true;
    }
    

    Questo codice aggiorna la pagina principale in base allo stato delle categorie salvate in precedenza.

L'app è ora completa. Può archiviare un insieme di categorie nello spazio di archiviazione locale del dispositivo. Quando gli utenti cambiano la selezione di categorie, quelle salvate vengono usate per la registrazione nell'hub di notifica. Nella sezione seguente verrà definito un back-end per l'invio di notifiche delle categorie all'app.

Eseguire l'app UWP

  1. In Visual Studio premere F5 per compilare e avviare l'app. L'interfaccia utente dell'app fornisce un insieme di interruttori che permettono di scegliere le categorie per le quali registrarsi.

    App delle ultime notizie

  2. Abilitare uno o più interruttori delle categorie e quindi selezionare Sottoscrivi.

    L'app converte le categorie selezionate in tag e richiede una nuova registrazione del dispositivo per i tag selezionati dall'hub di notifica. L'app visualizza le categorie registrate in una finestra di dialogo.

    Interruttori delle categorie e pulsante di sottoscrizione

Creare un'app console per inviare notifiche con tag

In questa sezione si invieranno notizie aggiornate come notifiche modello con tag da un'app console .NET.

  1. In Visual Studio creare una nuova applicazione console in Visual C#:

    1. Scegliere File>Nuovo>progetto dal menu.
    2. In Crea un nuovo progetto selezionare App console (.NET Framework) per C# nell'elenco di modelli e scegliere Avanti.
    3. Immettere un nome per l'app.
    4. Per Soluzione scegliere Aggiungi a soluzione e selezionare Crea per creare il progetto.
  2. Selezionare Strumenti> console diGestione>pacchetti NuGet equindi, nella finestra della console, eseguire il comando seguente:

    Install-Package Microsoft.Azure.NotificationHubs
    

    Questa azione aggiunge un riferimento ad Azure Notification Hubs SDK usando il pacchetto Microsoft.Azure.NotificationHubs.

  3. Aprire il file Program.cs e aggiungere l'istruzione seguente using :

    using Microsoft.Azure.NotificationHubs;
    
  4. Nella classe Program aggiungere il metodo seguente oppure sostituirlo se esiste già:

    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"}};
    
        // 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/FCM, 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. L'uso di tag garantisce che i dispositivi ricevano le notifiche solo per le categorie registrate.

  5. 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.

  6. Nel metodo Main() aggiungere le righe seguenti:

     SendTemplateNotificationAsync();
     Console.ReadLine();
    
  7. Creare l'app console.

Eseguire l'app console per inviare notifiche con tag

Eseguire l'app creata nella sezione precedente. Le notifiche per le categorie selezionate vengono visualizzate come notifiche di tipo avviso popup.

Passaggi successivi

In questo articolo si è appreso come trasmettere le ultime notizie divise per categoria. L'applicazione back-end effettua il push delle notifiche con tag ai dispositivi registrati per ricevere le notifiche per tale tag. Per informazioni su come inviare notifiche push a specifici utenti indipendentemente dal dispositivo che usano, passare all'esercitazione seguente: