Uso di Hub di notifica per inviare le ultime notizie

Panoramica

Questo argomento illustra come usare Hub di notifica di Azure per trasmettere le notifiche relative alle ultime notizie a un'app per Android. 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 all'attività 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 res/layout/activity_main.xml e sostituire il contenuto con il seguente:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:paddingBottom="@dimen/activity_vertical_margin"
         android:paddingLeft="@dimen/activity_horizontal_margin"
         android:paddingRight="@dimen/activity_horizontal_margin"
         android:paddingTop="@dimen/activity_vertical_margin"
         tools:context="com.example.breakingnews.MainActivity"
         android:orientation="vertical">
    
             <CheckBox
                 android:id="@+id/worldBox"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/label_world" />
             <CheckBox
                 android:id="@+id/politicsBox"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/label_politics" />
             <CheckBox
                 android:id="@+id/businessBox"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/label_business" />
             <CheckBox
                 android:id="@+id/technologyBox"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/label_technology" />
             <CheckBox
                 android:id="@+id/scienceBox"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/label_science" />
             <CheckBox
                 android:id="@+id/sportsBox"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="@string/label_sports" />
             <Button
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:onClick="subscribe"
                 android:text="@string/button_subscribe" />
     </LinearLayout>
    
  2. Aprire il file res/values/strings.xml e aggiungere le righe seguenti:

     <string name="button_subscribe">Subscribe</string>
     <string name="label_world">World</string>
     <string name="label_politics">Politics</string>
     <string name="label_business">Business</string>
     <string name="label_technology">Technology</string>
     <string name="label_science">Science</string>
     <string name="label_sports">Sports</string>
    

    A questo punto il layout grafico del file main_activity.xml dovrebbe essere simile al seguente:

  3. Creare una classe Notifications nello stesso pacchetto della classe MainActivity.

     import java.util.HashSet;
     import java.util.Set;
    
     import android.content.Context;
     import android.content.SharedPreferences;
     import android.os.AsyncTask;
     import android.util.Log;
     import android.widget.Toast;
    
     import com.google.android.gms.gcm.GoogleCloudMessaging;
     import com.microsoft.windowsazure.messaging.NotificationHub;
    
     public class Notifications {
         private static final String PREFS_NAME = "BreakingNewsCategories";
         private GoogleCloudMessaging gcm;
         private NotificationHub hub;
         private Context context;
         private String senderId;
    
         public Notifications(Context context, String senderId, String hubName, 
                                 String listenConnectionString) {
             this.context = context;
             this.senderId = senderId;
    
             gcm = GoogleCloudMessaging.getInstance(context);
             hub = new NotificationHub(hubName, listenConnectionString, context);
         }
    
         public void storeCategoriesAndSubscribe(Set<String> categories)
         {
             SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
             settings.edit().putStringSet("categories", categories).commit();
             subscribeToCategories(categories);
         }
    
         public Set<String> retrieveCategories() {
             SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
             return settings.getStringSet("categories", new HashSet<String>());
         }
    
         public void subscribeToCategories(final Set<String> categories) {
             new AsyncTask<Object, Object, Object>() {
                 @Override
                 protected Object doInBackground(Object... params) {
                     try {
                         String regid = gcm.register(senderId);
    
                         String templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}";
    
                         hub.registerTemplate(regid,"simpleGCMTemplate", templateBodyGCM, 
                             categories.toArray(new String[categories.size()]));
                     } catch (Exception e) {
                         Log.e("MainActivity", "Failed to register - " + e.getMessage());
                         return e;
                     }
                     return null;
                 }
    
                 protected void onPostExecute(Object result) {
                     String message = "Subscribed for categories: "
                             + categories.toString();
                     Toast.makeText(context, message,
                             Toast.LENGTH_LONG).show();
                 }
             }.execute(null, null, null);
         }
    
     }
    

    Questa classe utilizza l'archiviazione locale per archiviare le categorie di notizie che il dispositivo deve ricevere. Contiene inoltre i metodi per effettuare la registrazione per queste categorie.

  4. Nella classe MainActivity rimuovere i campi privati per NotificationHub e GoogleCloudMessaging e aggiungere un campo per Notifications:

     // private GoogleCloudMessaging gcm;
     // private NotificationHub hub;
     private Notifications notifications;
    
  5. A questo punto, nel metodo onCreate rimuovere l'inizializzazione del campo hub e il metodo registerWithNotificationHubs. Aggiungere quindi le righe seguenti, che inizializzano un'istanza della classe Notifications .

     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         MyHandler.mainActivity = this;
    
         NotificationsManager.handleNotifications(this, SENDER_ID,
                 MyHandler.class);
    
         notifications = new Notifications(this, SENDER_ID, HubName, HubListenConnectionString);
    
         notifications.subscribeToCategories(notifications.retrieveCategories());
     }
    

    HubName e HubListenConnectionString dovrebbero già essere impostati con i segnaposto <hub name> e <connection string with listen access> con il nome dell’hub di notifica e la stringa di connessione per DefaultListenSharedAccessSignature impostata in precedenza.

    [AZURE.NOTE] 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 completa viene utilizzata in un servizio back-end sicuro per l'invio delle notifiche e la modifica delle registrazioni esistenti.

  6. Quindi, aggiungere le seguenti importazioni e metodo subscribe per gestire l’evento clic del pulsante sottoscrivi:

     import android.widget.CheckBox;
     import java.util.HashSet;
     import java.util.Set;
    
     public void subscribe(View sender) {
         final Set<String> categories = new HashSet<String>();
    
         CheckBox world = (CheckBox) findViewById(R.id.worldBox);
         if (world.isChecked())
             categories.add("world");
         CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
         if (politics.isChecked())
             categories.add("politics");
         CheckBox business = (CheckBox) findViewById(R.id.businessBox);
         if (business.isChecked())
             categories.add("business");
         CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
         if (technology.isChecked())
             categories.add("technology");
         CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
         if (science.isChecked())
             categories.add("science");
         CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
         if (sports.isChecked())
             categories.add("sports");
    
         notifications.storeCategoriesAndSubscribe(categories);
     }
    

    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é il valore di registrationId assegnato da Google Cloud Messaging (GCM) può cambiare in qualsiasi momento, è necessario ripetere la registrazione per le notifiche di frequente 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, 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. Aggiungere questo codice alla fine del metodo onCreate nella classe MainActivity:

     notifications.subscribeToCategories(notifications.retrieveCategories());
    

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

  2. Aggiornare quindi il metodo onStart() della classe MainActivity come indicato di seguito:

    @Override protected void onStart() {

     super.onStart();
     isVisible = true;
    
     Set<String> categories = notifications.retrieveCategories();
    
     CheckBox world = (CheckBox) findViewById(R.id.worldBox);
     world.setChecked(categories.contains("world"));
     CheckBox politics = (CheckBox) findViewById(R.id.politicsBox);
     politics.setChecked(categories.contains("politics"));
     CheckBox business = (CheckBox) findViewById(R.id.businessBox);
     business.setChecked(categories.contains("business"));
     CheckBox technology = (CheckBox) findViewById(R.id.technologyBox);
     technology.setChecked(categories.contains("technology"));
     CheckBox science = (CheckBox) findViewById(R.id.scienceBox);
     science.setChecked(categories.contains("science"));
     CheckBox sports = (CheckBox) findViewById(R.id.sportsBox);
     sports.setChecked(categories.contains("sports"));
    

    }

    L'attività 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

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

Se si usa la funzionalità App per dispositivi mobili di Servizio app di Microsoft Azure, vedere l'esercitazione Add push notifications for Mobile Apps e selezionare la piattaforma in uso nella parte superiore della pagina.

Se si vuole usare Java o PHP, vedere How to use Notification Hubs from Java or PHP. È possibile inviare notifiche da qualsiasi back-end tramite l'interfaccia REST di Hub di notifica.

Se è stata creata l'app console per l'invio di notifiche al termine dell'esercitazione Get started with Notification Hubs, ignorare i passaggi da 1 a 3.

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

    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:

     Install-Package Microsoft.Azure.NotificationHubs
    
  3. Selezionare Enter (Invio).
    Questa azione aggiunge un riferimento ad Azure Notification Hubs SDK usando il pacchetto NuGet Microsoft.Azure.NotificationHubs.

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

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

  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.

  7. Nel metodo Main aggiungere le righe seguenti:

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

Eseguire l'app e generare notifiche

  1. In Android Studio, compilare l'app e avviarla in un dispositivo o emulatore.

    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 notifica di tipo avviso popup.

  3. Inviare una nuova notifica eseguendo l'app .NET Console. In alternativa, è possibile inviare notifiche modello con tag usando la scheda debug dell'hub di notifica nel portale di Azure classico.

    Le notifiche per le categorie selezionate vengono visualizzate come notifiche di tipo avviso popup.

Passaggi successivi

In questa esercitazione si è appreso a trasmettere le ultime novità per categoria. Per informazioni su altri scenari avanzati di Hub di notifica, provare a completare le seguenti esercitazioni: