Uso di Hub di notifica per inviare le ultime notizie

Panoramica

Questo argomento descrive come usare Hub di notifica di Azure per trasmettere le notifiche relative alle ultime notizie a un'app per Windows Phone 8.0/8.1 Silverlight. Se si sviluppano app per Windows Store o Windows Phone 8.1, fare riferimento alla versione Windows Universal . Al termine dell'esercitazione, si sarà appreso a effettuare la registrazione alle categorie di ultime notizie desiderate e ricevere le notifiche push solo da tali categorie. Questo scenario è un modello comune per molte app nelle quali le notifiche devono essere inviate a gruppi di utenti che hanno dichiarato un interesse, ad esempio lettori di feed RSS, app per fan di musica e così via.

È possibile abilitare gli scenari di trasmissione includendo 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 che hanno effettuato la registrazione al tag riceveranno la notifica. Poiché i tag sono costituiti da stringhe, non è necessario eseguire il provisioning anticipatamente. Per ulteriori informazioni sui tag, vedere Espressioni di routing e tag per hub di notifica.

Prerequisiti

Questo argomento si basa sull'app creata nell'esercitazione Introduzione ad Hub di notifica. Prima di iniziare questa esercitazione, è necessario completare le procedure illustrate in Introduzione ad Hub di notifica.

Aggiungere la selezione delle categorie all'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. Le categorie selezionate da un utente sono archiviate nel dispositivo. All'avvio dell'app, viene creata una registrazione nell'hub di notifica con le categorie selezionate come tag.

  1. Aprire il file di progetto MainPage.xaml, quindi sostituire gli elementi Grid denominati TitlePanel e ContentPanel con il codice seguente:

     <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. Nel progetto creare una nuova classe denominata Notifications, aggiungere il modificatore public alla definizione della classe e quindi aggiungere le istruzioni using seguenti al nuovo file di codice:

     using Microsoft.Phone.Notification;
     using Microsoft.WindowsAzure.Messaging;
     using System.IO.IsolatedStorage;
     using System.Windows;
    
  3. Copiare il codice seguente nella nuova classe Notifications :

     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, we will 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. Contiene inoltre i metodi di registrazione per queste categorie tramite una registrazione delle notifiche modello .

  4. Nel file di progetto App.xaml.cs aggiungere la proprietà seguente alla classe App. 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.

     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. 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. La chiave di accesso completo viene usata in un servizio back-end sicuro per l'invio delle notifiche e la modifica delle registrazioni esistenti.

  5. In MainPage.xaml.cs aggiungere la riga seguente:

     using Windows.UI.Popups;
    
  6. Aggiungere quindi il metodo seguente nel file di progetto MainPage.xaml.cs:

     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. Se le categorie vengono modificate, la registrazione viene ricreata con le nuove categorie.

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.

Registrazione per le notifiche

Questa procedura consente di effettuare la registrazione con l'hub di notifica all'avvio usando le categorie archiviate nella risorsa di archiviazione locale.

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. Questo esempio esegue la registrazione per le notifiche a ogni avvio dell'app. Per le app che vengono eseguite di frequente, oltre una volta al giorno, è possibile ignorare la registrazione per conservare la larghezza di banda qualora sia trascorso meno di un giorno dalla registrazione precedente.

  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:

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

    In questo modo, ogni volta che l'app viene avviata vengono recuperate le categorie dall'archiviazione locale e viene richiesta una registrazione per tali categorie.

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

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

    La pagina principale viene aggiornata in base allo stato delle categorie salvate in precedenza.

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. Verrà ora definito un back-end per l'invio delle notifiche delle categorie all'app.

Invio di notifiche con tag

Questa sezione mostra come inviare le ultime notizie come notifiche modello con tag da un'app console .NET e di qualsiasi altro tipo.

Se si usano le app per dispositivi mobili, vedere l'esercitazione Aggiungere notifiche push alle app per dispositivi mobili e selezionare la piattaforma in uso nella parte superiore.

Se si preferisce usare Java o PHP, vedere Come usare Hub di notifica da Java/PHP. È possibile inviare notifiche da qualsiasi back-end tramite l'interfaccia REST degli Hub di notifica.

Se è stata creata l'app console per l’invio di notifiche quando è stata completata l'esercitazione Introduzione agli Hub di notifica, ignorare i passaggi da 1 a 3.

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

    ![][13]
    
  2. Nel menu principale di Visual Studio fare clic su Strumenti, Gestione pacchetti libreria, e Console di Gestione pacchetti, quindi nella finestra di tipo console digitare quanto segue e premere INVIO:

     Install-Package Microsoft.Azure.NotificationHubs
    

    Verrà aggiunto un riferimento all’SDK dell’Hub di notifica di Azure mediante il pacchetto NuGet Microsoft.Azure.NotificationHubs.

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

     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>");
    
         // Create an array of breaking news categories.
         var categories = new string[] { "World", "Politics", "Business",
                                         "Technology", "Science", "Sports"};
    
         // Sending 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. Con i tag è possibile assicurarsi che i dispositivi ricevano 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. Aggiungere le righe seguenti nel metodo Main :

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

Eseguire l'app e generare notifiche

  1. In Visual Studio premere F5 per compilare e avviare l'app.

    Si noti che l'interfaccia utente dell'app fornisce un set di interruttori che consentono di scegliere le categorie per le quali effettuare la sottoscrizione.

  2. Abilitare uno o più interruttori di categorie e quindi fare clic su Subscribe.

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

  3. Dopo aver ricevuto una conferma di completamento della sottoscrizione delle categorie, eseguire l'app console per l'invio di notifiche per ogni categoria. Verificare di ricevere una notifica solo per le categorie sottoscritte.

L'argomento è stato completato.