Aggiungere notifiche push all'app AndroidAdd push notifications to your Android app

PanoramicaOverview

In questa esercitazione vengono aggiunte notifiche push al progetto avvio rapido di Android, in modo che una notifica push venga inviata al dispositivo a ogni inserimento di record.In this tutorial, you add push notifications to the [Android quick start] project so that a push notification is sent to the device every time a record is inserted.

Se non si usa il progetto server di avvio rapido scaricato, è necessario aggiungere il pacchetto di estensione di notifica push.If you do not use the downloaded quick start server project, you need the push notification extension package. Per altre informazioni, vedere Usare l'SDK del server back-end .NET per App per dispositivi mobili di Azure.For more information, see Work with the .NET backend server SDK for Azure Mobile Apps.

PrerequisitiPrerequisites

Sono necessari gli elementi seguenti:You need the following:

  • Un IDE, in base al back-end del progetto:An IDE, depending on your project's back end:

  • Android 2.3 o versione successiva, Google Repository 27 o versione successiva e Google Play Services 9.0.2 o versione successiva per Firebase Cloud Messaging.Android 2.3 or later, Google Repository revision 27 or later, and Google Play Services 9.0.2 or later for Firebase Cloud Messaging.
  • Completare l'avvio rapido di Android.Complete the [Android quick start].

Creare un progetto che supporta Google Cloud MessagingCreate a project that supports Firebase Cloud Messaging

  1. Accedere alla console di Firebase.Sign in to the Firebase console. Creare un nuovo progetto Firebase se non è già disponibile.Create a new Firebase project if you don't already have one.
  2. Dopo aver creato il progetto, fare clic su Add Firebase to your Android app (Aggiungi Firebase all'app Android) e seguire le istruzioni fornite.After your project is created, click Add Firebase to your Android app and follow the instructions provided.

  3. Nella console di Firebase fare clic sul file cog per il progetto e quindi fare clic su Impostazioni progetto.In the Firebase console, click the cog for your project and then click Project Settings.

  4. Fare clic sulla scheda Cloud Messaging nelle impostazioni del progetto e copiare il valore di Chiave server e ID mittente.Click the Cloud Messaging tab in your project settings, and copy the value of the Server key and Sender ID. Questi valori verranno usati in un secondo momento per configurare i criteri di accesso dell'hub di notifica de e il gestore delle notifiche nell'app.These values will be used later to configure the notification hub access policy, and your notification handler in the app.

Configurare un hub di notificaConfigure a notification hub

Poiché le funzioni delle app per dispositivi mobili del Servizio app di Azure usano Hub di notifica di Azure per inviare push, si dovrà configurare un hub di notifica per l'app per dispositivi mobili.The Mobile Apps feature of Azure App Service uses [Azure Notification Hubs] to send pushes, so you will be configuring a notification hub for your mobile app.

  1. Nel Portale di Azure andare in Servizi app, quindi fare clic sul back-end dell'app.In the [Azure portal], go to App Services, and then click your app back end. In Impostazioni fare clic su Push.Under Settings, click Push.
  2. Fare clic su Connetti per aggiungere una risorsa dell'hub di notifica all'app.Click Connect to add a notification hub resource to the app. È possibile creare un hub o connettersi a uno esistente.You can either create a hub or connect to an existing one.

A questo punto un hub di notifica è stato connesso al progetto di back-end dell'app per dispositivi mobili.Now you have connected a notification hub to your Mobile Apps back-end project. In seguito si configurerà l'hub di notifica per la connessione a un Platform Notification System (PNS) per effettuare il push ai dispositivi.Later you will configure this notification hub to connect to a platform notification system (PNS) to push to devices.

Configurare Azure per l'invio di notifiche pushConfigure Azure to send push notifications

  1. Nel Portale di Azure fare clic su Browse All (Esplora tutto) > Servizi app e quindi scegliere il back-end dell'app per dispositivi mobili.In the Azure portal, click Browse All > App Services, and then click your Mobile Apps back end. In Impostazioni fare clic su App Service Push (Push servizio app), quindi fare clic sul nome dell'hub di notifica.Under Settings, click App Service Push, and then click your notification hub name.
  2. Passare a Google (GCM), immettere il valore Chiave server ottenuto da Firebase nella procedura precedente, quindi fare clic su Salva.Go to Google (GCM), enter the Server Key value that you obtained from Firebase in the previous procedure, and then click Save.

    Impostare la chiave API di GCM nel portale

Il back-end dell'app per dispositivi mobili è ora configurato per l'uso di Firebase Cloud Messaging.The Mobile Apps back end is now configured to use Firebase Cloud Messaging. Questo consente di inviare notifiche push all'app in esecuzione su un dispositivo Android usando l'hub di notifica.This enables you to send push notifications to your app running on an Android device, by using the notification hub.

Abilitare le notifiche push per il progetto serverEnable push notifications for the server project

Usare la procedura corrispondente al tipo di progetto di back-end che sia — back-end .NET o back-end Node.js.Use the procedure that matches your back-end project type—either .NET back end or Node.js back end.

Progetto di back-end .NET.NET back-end project

  1. In Visual Studio fare clic con il pulsante destro del mouse sul progetto server, quindi scegliere Gestisci pacchetti NuGet.In Visual Studio, right-click the server project, and click Manage NuGet Packages. Cercare Microsoft.Azure.NotificationHubs, quindi fare clic su Installa.Search for Microsoft.Azure.NotificationHubs, and then click Install. Verrà installata la libreria client dell'Hub di notifica.This installs the Notification Hubs client library.
  2. Nella cartella Controller aprire TodoItemController.cs e aggiungere le istruzioni using seguenti:In the Controllers folder, open TodoItemController.cs and add the following using statements:

     using Microsoft.Azure.Mobile.Server.Config;
     using Microsoft.Azure.NotificationHubs;
    
  3. Sostituire il metodo PostTodoItem con il codice seguente:Replace the PostTodoItem method with the following code:

     public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
     {
         TodoItem current = await InsertAsync(item);
         // Get the settings for the server project.
         HttpConfiguration config = this.Configuration;
    
         MobileAppSettingsDictionary settings =
             this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
         // Get the Notification Hubs credentials for the Mobile App.
         string notificationHubName = settings.NotificationHubName;
         string notificationHubConnection = settings
             .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
         // Create a new Notification Hub client.
         NotificationHubClient hub = NotificationHubClient
         .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
         // Android payload
         var androidNotificationPayload = "{ \"data\" : {\"message\":\"" + item.Text + "\"}}";
    
         try
         {
             // Send the push notification and log the results.
             var result = await hub.SendGcmNativeNotificationAsync(androidNotificationPayload);
    
             // Write the success result to the logs.
             config.Services.GetTraceWriter().Info(result.State.ToString());
         }
         catch (System.Exception ex)
         {
             // Write the failure result to the logs.
             config.Services.GetTraceWriter()
                 .Error(ex.Message, null, "Push.SendAsync Error");
         }
         return CreatedAtRoute("Tables", new { id = current.Id }, current);
     }
    
  4. Pubblicare di nuovo il progetto server.Republish the server project.

Progetto di back-end Node.jsNode.js back-end project

  1. Scaricare il progetto di avvio rapido, se non è ancora stato scaricato, oppure usare l'editor online del Portale di Azure.If you haven't already done so, download the quickstart project, or else use the online editor in the Azure portal.
  2. Sostituire il codice esistente nel file todoitem.js file con il codice seguente:Replace the existing code in the todoitem.js file with the following:

     var azureMobileApps = require('azure-mobile-apps'),
     promises = require('azure-mobile-apps/src/utilities/promises'),
     logger = require('azure-mobile-apps/src/logger');
    
     var table = azureMobileApps.table();
    
     table.insert(function (context) {
     // For more information about the Notification Hubs JavaScript SDK,
     // see http://aka.ms/nodejshubs
     logger.info('Running TodoItem.insert');
    
     // Define the GCM payload.
     var payload = {
         "data": {
             "message": context.item.text
         }
     };   
    
     // Execute the insert.  The insert returns the results as a Promise,
     // Do the push as a post-execute action within the promise flow.
     return context.execute()
         .then(function (results) {
             // Only do the push if configured
             if (context.push) {
                 // Send a GCM native notification.
                 context.push.gcm.send(null, payload, function (error) {
                     if (error) {
                         logger.error('Error while sending push notification: ', error);
                     } else {
                         logger.info('Push notification sent successfully!');
                     }
                 });
             }
             // Don't forget to return the results from the context.execute()
             return results;
         })
         .catch(function (error) {
             logger.error('Error while running context.execute: ', error);
         });
     });
    
     module.exports = table;  
    

    Ogni volta che viene inserito un nuovo elemento Todo, viene inviata una notifica GCM contenente l'elemento item.text.This sends a GCM notification that contains the item.text when a new todo item is inserted.

  3. Quando si modifica il file nel computer locale, ripubblicare il progetto server.When editing the file in your local computer, republish the server project.

Aggiungere notifiche push all'appAdd push notifications to your app

In questa sezione l'app del client Android viene aggiornata in modo da gestire le notifiche push.In this section, you update your client Android app to handle push notifications.

Verificare la versione di Android SDKVerify Android SDK version

Poiché lo sviluppo è ancora in corso, la versione di Android SDK installata in Android Studio potrebbe non corrispondere a quella del codice.Because of ongoing development, the Android SDK version installed in Android Studio might not match the version in the code. In questa esercitazione si fa riferimento alla versione 26 di Android SDK, ovvero la più recente al momento della stesura di questo documento.The Android SDK referenced in this tutorial is version 26, the latest at the time of writing. Il numero di versione dell'SDK può aumentare nel corso del tempo ed è consigliabile usare la versione più recente disponibile.The version number may increase as new releases of the SDK appear, and we recommend using the latest version available.

Due sintomi di una mancata corrispondenza delle versioni sono i seguenti:Two symptoms of version mismatch are:

  • Quando si compila o ricompila il progetto, è possibile che vengano visualizzati messaggi di errore Gradle come Gradle sync failed: Failed to find target with hash string 'android-XX'.When you build or rebuild the project, you may get Gradle error messages like Gradle sync failed: Failed to find target with hash string 'android-XX'.
  • Gli oggetti Android standard nel codice che dovrebbero risolversi in base a istruzioni import potrebbero generare messaggi di errore.Standard Android objects in code that should resolve based on import statements may be generating error messages.

Se si manifesta uno di questi sintomi, la versione di Android SDK installata in Android Studio potrebbe non corrispondere alla destinazione dell'SDK del progetto scaricato.If either of these appears, the version of the Android SDK installed in Android Studio might not match the SDK target of the downloaded project. Per verificare la versione, apportare le modifiche seguenti:To verify the version, make the following changes:

  1. In Android Studio fare clic su Tools (Strumenti) > Android > SDK Manager.In Android Studio, click Tools > Android > SDK Manager. Se la versione più recente della piattaforma SDK non è installata, fare clic per installarla.If you have not installed the latest version of the SDK Platform, then click to install it. Prendere nota del numero di versione.Make a note of the version number.

  2. Nella scheda Esplora progetti in Gradle Scripts (Script Gradle) aprire il file build.gradle (Module: app).On the Project Explorer tab, under Gradle Scripts, open the file build.gradle (Module: app). Assicurarsi che i valori di compileSdkVersion e targetSdkVersion siano impostati sull'ultima versione dell'SDK installata.Ensure that the compileSdkVersion and targetSdkVersion are set to the latest SDK version installed. build.gradle potrebbe essere simile al seguente:The build.gradle might look like this:

    android {
        compileSdkVersion 26
        defaultConfig {
            targetSdkVersion 26
        }
    }
    

Il passaggio successivo comporta l'installazione di Google Play Services.Your next step is to install Google Play services. Firebase Cloud Messaging prevede alcuni requisiti minimi a livello di API per lo sviluppo e i test. È necessario che la proprietà minSdkVersion nel manifesto sia conforme a tali requisiti.Firebase Cloud Messaging has some minimum API level requirements for development and testing, which the minSdkVersion property in the manifest must conform to.

In caso di test con un dispositivo meno recente, vedere Add Firebase to Your Android Project per determinare il livello minimo su cui è possibile impostare tale valore e applicare l'impostazione corretta.If you are testing with an older device, consult Add Firebase to Your Android Project to determine how low you can set this value, and set it appropriately.

Aggiungere Firebase Cloud Messaging al progettoAdd Firebase Cloud Messaging to the project

  1. Aggiungere Firebase al progetto AndroidAdd Firebase to your Android project

  2. In Android Studio scegliere File > Struttura progetto.In Android Studio, choose File > Project Structure. Selezionare Notifiche, selezionare Firebase Cloud Messaging e fare clic su OK.Select Notifications, select Firebase Cloud Messaging, and then click OK.

Aggiungere codiceAdd code

  1. Nel progetto di app aprire il file AndroidManifest.xml.In your app project, open the file AndroidManifest.xml. Aggiungere il codice seguente dopo il tag di apertura application :Add the following code after the application opening tag:

    <service android:name=".ToDoMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service android:name=".ToDoInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    
  2. Aprire il file ToDoActivity.java e apportare le modifiche seguenti:Open the file ToDoActivity.java, and make following changes:

    • Aggiungere l'istruzione import:Add the import statement:

      import com.google.firebase.iid.FirebaseInstanceId;
      
    • Modificare la definizione di MobileServiceClient da private a private static in modo che sia simile alla seguente:Change the definition of MobileServiceClient from private to private static, so it now looks like this:

      private static MobileServiceClient mClient;
      
    • Aggiungere il metodo registerPush:Add registerPush method:

      public static void registerPush() {
          final String token = FirebaseInstanceId.getInstance().getToken();
          if (token != null) {
              new AsyncTask<Void, Void, Void>() {
                  protected Void doInBackground(Void... params) {
                      mClient.getPush().register(token);
                      return null;
                  }
              }.execute();
          }
      }
      
    • Aggiornare il metodo onCreate della classe ToDoActivity.Update the onCreate method of the ToDoActivity class. Assicurarsi di aggiungere il codice dopo la creazione di un'istanza di MobileServiceClient.Make sure to add this code after the MobileServiceClient is instantiated.

      registerPush();
      
  3. Aggiungere una nuova classe per gestire le notifiche.Add a new class to handle notifications. In Esplora progetti aprire i nodi app > java > spazio-dei-nomi-progetto-corrente e fare clic con il pulsante destro del mouse sul nodo del nome del pacchetto.In Project Explorer, open the app > java > your-project-namespace nodes, and right-click the package name node. Fare clic su Nuovo e quindi su Java Class (Classe Java).Click New, and then click Java Class. In Nome digitare ToDoMessagingService e fare clic su OK.In Name, type ToDoMessagingService, and then click OK. Sostituire quindi la dichiarazione di classe con:Then, replace the class declaration with:

    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    
    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    public class ToDoMessagingService extends FirebaseMessagingService {
    
        private static final int NOTIFICATION_ID = 1;
    
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            String message = remoteMessage.getData().get("message");
            if (message != null) {
                sendNotification("Notification Hub Demo", message);
            }
        }
    
        private void sendNotification(String title, String messageBody) {
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ToDoActivity.class), 0);
            Notification.Builder notificationBuilder = new Notification.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(title)
                    .setContentText(messageBody)
                    .setContentIntent(contentIntent);
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            if (notificationManager != null) {
                notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
            }
        }
    }
    
  4. Aggiungere un'altra classe per gestire gli aggiornamenti dei token.Add another class to handle token updates. Creare una classe Java ToDoInstanceIdService e sostituire la dichiarazione di classe con:Create ToDoInstanceIdService java class and replace the class declaration with:

    import com.google.firebase.iid.FirebaseInstanceIdService;
    
    public class ToDoInstanceIdService extends FirebaseInstanceIdService {
    
        @Override
        public void onTokenRefresh() {
            ToDoActivity.registerPush();
        }
    }
    

L'app è ora aggiornata per il supporto delle notifiche push.Your app is now updated to support push notifications.

Eseguire il test dell'app sul servizio mobile pubblicatoTest the app against the published mobile service

È possibile eseguire il test dell'app collegando direttamente un telefono Android con un cavo USB oppure usando un dispositivo virtuale nell'emulatore.You can test the app by directly attaching an Android phone with a USB cable, or by using a virtual device in the emulator.

Passaggi successiviNext steps

Dopo aver completato questa esercitazione, continuare con una delle esercitazioni seguenti:Now that you completed this tutorial, consider continuing on to one of the following tutorials:

  • Aggiungere l'autenticazione all'app Android.Add authentication to your Android app. Questa esercitazione spiega come aggiungere l'autenticazione al progetto introduttivo TodoList in Android tramite un provider di identità supportato.Learn how to add authentication to the todolist quickstart project on Android using a supported identity provider.
  • Attivare la sincronizzazione offline per l'app Android.Enable offline sync for your Android app. Informazioni su come aggiungere il supporto offline all'app usando il back-end di App per dispositivi mobili.Learn how to add offline support to your app by using a Mobile Apps back end. Con la sincronizzazione offline è possibile interagire con un'app per dispositivi mobili —visualizzando, aggiungendo e modificando i dati— anche quando non è disponibile una connessione di rete.With offline sync, users can interact with a mobile app—viewing, adding, or modifying data—even when there is no network connection.