Esercitazione: effettuare il push di notifiche alle app Xamarin.Android con Hub di notifica di AzureTutorial: Push notifications to Xamarin.Android apps using Azure Notification Hubs

PanoramicaOverview

In questa esercitazione viene illustrato come usare Hub di notifica di Azure per inviare notifiche push a un'applicazione di Xamarin.Android.This tutorial shows you how to use Azure Notification Hubs to send push notifications to a Xamarin.Android application. Viene creata un'app di Xamarin.Android vuota che riceve notifiche push tramite Firebase Cloud Messaging (FCM).You create a blank Xamarin.Android app that receives push notifications by using Firebase Cloud Messaging (FCM). È possibile usare l'hub di notifica per trasmettere le notifiche push a tutti i dispositivi che eseguono l'app.You use your notification hub to broadcast push notifications to all the devices running your app. Il codice compilato è disponibile nell'esempio di app NotificationHubs.The finished code is available in the NotificationHubs app sample.

In questa esercitazione vengono completati i passaggi seguenti:In this tutorial, you take the following steps:

  • Creare un progetto Firebase e attivare Firebase Cloud MessagingCreate a Firebase project and enable Firebase Cloud Messaging
  • Creare un hub di notificaCreate a notificaiton hub
  • Creare un'app Xamarin.Android e connetterla all'hub di notificaCreate a Xamarin.Android app and connect it to the notification hub
  • Inviare notifiche di prova dal portale di AzureSend test notifications from the Azure portal

prerequisitiPrerequisites

Creare un progetto Firebase e attivare Firebase Cloud MessagingCreate a Firebase project and enable 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, selezionare Add Firebase to your Android app (Aggiungi Firebase all'app Android).After you create your project, select Add Firebase to your Android app. Seguire quindi le istruzioni visualizzate.Then follow the instructions that are provided. Scaricare il file google-services.json.Download google-services.json file.

    Aggiungere Firebase all'app Android

  3. Nella console di Firebase selezionare il file COG per il progetto.In the Firebase console, select the cog for your project. Selezionare quindi Project Settings (Impostazioni progetto).Then select Project Settings.

    Selezionare Project Settings (Impostazioni progetto)

  4. Selezionare la scheda General (Generale) nelle impostazioni del progetto.Select the General tab in your project settings. Scaricare quindi il file google-services.json che contiene la chiave API del server e l'ID client.Then download the google-services.json file that contains the Server API key and Client ID.
  5. Selezionare la scheda Cloud Messaging nelle impostazioni del progetto e quindi copiare il valore di Legacy server key (Chiave server legacy).Select the Cloud Messaging tab in your project settings, and then copy the value of the Legacy server key. Questo valore verrà usato per configurare i criteri di accesso all'hub di notifica.You use this value to configure the notification hub access policy.

Creare un hub di notificaCreate a notification hub

  1. Accedere al portale di Azure.Sign in to the Azure portal.

  2. Selezionare Crea una risorsa > Web e dispositivi mobili > Hub di notifica.Select Create a resource > Web + Mobile > Notification Hub.

    Portale di Azure: creare un hub di notifica

  3. Nella casella Hub di notifica digitare un nome univoco.In the Notification Hub box, type a unique name. Selezionare l'area, la sottoscrizione e il gruppo di risorse (se già disponibili).Select your Region, Subscription, and Resource Group (if you have one already).

    Se non si ha già uno spazio dei nomi del bus di servizio, è possibile usare il nome predefinito, che viene creato in base al nome dell'hub (se lo spazio dei nomi è disponibile).If you don't already have a service bus namespace, you can use the default name, which is created based on the hub name (if the namespace name is available).

    Se si ha già un spazio dei nomi del bus di servizio in cui si vuole creare l'hub, seguire questa proceduraIf you already have a service bus namespace that you want to create the hub in, follow these steps

    a.a. Nell'area Spazio dei nomi selezionare il collegamento Seleziona esistente.In the Namespace area, select the Select Existing link.

    b.b. Selezionare Create.Select Create.

    Portale di Azure: impostare le proprietà dell'hub di notifica

  4. Selezionare Notifiche (icona a forma di campanello) e selezionare Vai alla risorsa.Select Notifications (Bell icon), and select Go to resource.

    Portale di Azure - Notifiche -> Vai alla risorsa

  5. Selezionare Criteri di accesso dall'elenco.Select Access Policies from the list. Prendere nota delle due stringhe di connessione disponibili.Note the two connection strings that are available to you. Sono necessarie in un secondo momento per gestire le notifiche push.You need them to handle push notifications later.

    Importante

    NON usare DefaultFullSharedAccessSignature nell'applicazione.Do NOT use the DefaultFullSharedAccessSignature in your application. Deve essere usato solo nel back-end.This is meant to be used in your back-end only.

    Portale di Azure: stringhe di connessione dell'hub di notifica

Configurare le impostazioni di GCM per l'hub di notificaConfigure GCM settings for the notification hub

  1. Selezionare Google (GCM) nella sezione IMPOSTAZIONI DI NOTIFICA.Select Google (GCM) in the NOTIFICATION SETTINGS section.
  2. Immettere la chiave del server legacy annotata dalla Google Firebase Console.Enter the Legacy server key you noted down from the Google Firebase Console.
  3. Sulla barra degli strumenti selezionare Salva.Select Save on the toolbar.

L'hub di notifica è configurato per l'uso con FCM e sono disponibili le stringhe di connessione per registrare l'app in modo da ricevere notifiche e inviare notifiche push.Your notification hub is configured to work with FCM, and you have the connection strings to both register your app to receive notifications and to send push notifications.

Creare un'app Xamarin.Android e connetterla all'hub di notificaCreate Xamain.Android app and connect it to notification hub

Creare un progetto di Visual Studio e aggiungere i pacchetti NuGetCreate Visual Studio project and add NuGet packages

  1. In Visual Studio andare su File, selezionare New (Nuovo), quindi fare clic su Project (Progetto).In Visual Studio, point to File, select New, and then select Project.

    Visual Studio - Creare un nuovo progetto Android

  2. Nella finestra Esplora soluzioni espandere Proprietà e fare clic su AndroidManifest.xml.In the Solution Explorer window, expand Properties, and click AndroidManifest.xml. Aggiornare il nome del pacchetto in modo che corrisponda al nome del pacchetto immesso durante l'aggiunta di Firebase Cloud Messaging al progetto in Google Firebase Console.Update the package name to match the package name you entered when adding Firebase Cloud Messaging to your project in the Google Firebase Console.

    Nome del pacchetto in GCM

  3. Fare clic con il pulsante destro del mouse sul progetto e selezionare Gestisci pacchetti NuGet.Right-click your project, and select Manage NuGet Packages....
  4. Selezionare la scheda Sfoglia. Cercare Xamarin.GooglePlayServices.Base.Select the Browse tab. Search for Xamarin.GooglePlayServices.Base. Selezionare Xamarin.GooglePlayServices.Base nell'elenco dei risultati.Select Xamarin.GooglePlayServices.Base in the result list. Quindi, selezionare Installa.Then, select Install.

    NuGet Google Play Services

  5. Nella finestra Gestione pacchetti NuGet cercare il pacchetto Xamarin.Firebase.Messaging.In the NuGet Package Manager window, search for Xamarin.Firebase.Messaging. Selezionare Xamarin.Firebase.Messaging nell'elenco dei risultati.Select Xamarin.Firebase.Messaging in the result list. Quindi, selezionare Installa.Then, select Install.
  6. A questo punto, cercare Xamarin.Azure.NotificationHubs.Android.Now, search for Xamarin.Azure.NotificationHubs.Android. Selezionare Xamarin.Azure.NotificationHubs.Android nell'elenco dei risultati.Select Xamarin.Azure.NotificationHubs.Android in the result list. Quindi, selezionare Installa.Then, select Install.

Aggiungere il file JSON di Google ServicesAdd the Google Services JSON File

  1. Copia google services.json scaricato da Google Firebase Console nella cartella del progetto.Copy google-services.json that you downloaded from the Google Firebase Console to the project folder.
  2. Aggiungere google-services.json al progetto.Add google-services.json to the project.
  3. Selezionare google-services.json nella finestra Esplora soluzioni.Select google-services.json in the Solution Explorer window.
  4. Nel riquadro Proprietà impostare l'azione di compilazione GoogleServicesJson.In the Properties pane, set the Build Action to GoogleServicesJson. Se non viene visualizzato GoogleServicesJson, chiudere Visual Studio, riavviarlo, riaprire il progetto e riprovare.If you don't see GoogleServicesJson, close Visual Studio, relaunch it, reopen the project, and retry.

    Azione di compilazione GoogleServicesJson

Configurare Hub di notifica nel progettoSet up notification hubs in your project

Registrazione con Firebase Cloud MessagingRegistering with Firebase Cloud Messaging

Aprire il file AndroidManifest.xml e inserire gli elementi <receiver> seguenti nell'elemento <application>:Open the AndroidManifest.xml file and insert the following <receiver> elements into the <application> element:

    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
      </intent-filter>
    </receiver>
  1. Raccogliere le informazioni seguenti per l'app Android e l'hub di notifica:Gather the following information for your Android app and notification hub:

    • Stringa di connessione Listen: nel dashboard del portale di Azure scegliere Visualizza stringhe di connessione.Listen connection string: On the dashboard in the Azure portal, choose View connection strings. Copiare la stringa di connessione DefaultListenSharedAccessSignature per questo valore.Copy the DefaultListenSharedAccessSignature connection string for this value.
    • Nome hub: nome dell'hub indicato nel portale di Azure.Hub name: Name of your hub from the Azure portal. Ad esempio, mynotificationhub2.For example, mynotificationhub2.
  2. Fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni, scegliere Aggiungi e selezionare Classe.Right-click your project in the Solution Explorer window, point to Add, and select Class.

  3. Creare una classe Constants.cs per il progetto Xamarin e definire i valori costanti seguenti nella classe.Create a Constants.cs class for your Xamarin project and define the following constant values in the class. Sostituire i segnaposto con i valori.Replace the placeholders with your values.

        public static class Constants
        {
           public const string ListenConnectionString = "<Listen connection string>";
           public const string NotificationHubName = "<hub name>";
        }
    
  4. Aggiungere le istruzioni using seguenti a MainActivity.cs:Add the following using statements to MainActivity.cs:

        using Android.Util;
    
  5. Aggiungere a MainActivity.cs una variabile di istanza che verrà usata per visualizzare una finestra di dialogo di avviso quando l'app è in esecuzione:Add an instance variable to MainActivity.cs that will be used to show an alert dialog when the app is running:

        public const string TAG = "MainActivity";
    
  6. Aggiungere il codice seguente a OnCreate in MainActivity.cs dopo base.OnCreate(savedInstanceState):Add the following code to OnCreate in MainActivity.cs after base.OnCreate(savedInstanceState):

        if (Intent.Extras != null)
        {
            foreach (var key in Intent.Extras.KeySet())
            {
                if(key!=null)
                {
                    var value = Intent.Extras.GetString(key);
                    Log.Debug(TAG, "Key: {0} Value: {1}", key, value);
                }
            }
        }
    
  7. Creare una nuova classe MyFirebaseIIDService come è stata creata la classe Costanti.Create a new class, MyFirebaseIIDService like you created the Constants class.
  8. Aggiungere le istruzioni using seguenti a MyFirebaseIIDService.cs:Add the following using statements to MyFirebaseIIDService.cs:

    using Android.Util;
    using WindowsAzure.Messaging;
    using Firebase.Iid;
    
  9. In MyFirebaseIIDService.cs aggiungere la dichiarazione class seguente e definire la classe in modo che erediti da FirebaseInstanceIdService:In MyFirebaseIIDService.cs, add the following class declaration, and have your class inherit from FirebaseInstanceIdService:

        [Service]
        [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
        public class MyFirebaseIIDService : FirebaseInstanceIdService
    
  10. In MyFirebaseIIDService.cs aggiungere il codice seguente:In MyFirebaseIIDService.cs, add the following code:

        const string TAG = "MyFirebaseIIDService";
        NotificationHub hub;
    
        public override void OnTokenRefresh()
        {
            var refreshedToken = FirebaseInstanceId.Instance.Token;
            Log.Debug(TAG, "FCM token: " + refreshedToken);
            SendRegistrationToServer(refreshedToken);
        }
    
        void SendRegistrationToServer(string token)
        {
            // Register with Notification Hubs
            hub = new NotificationHub(Constants.NotificationHubName,
                                      Constants.ListenConnectionString, this);
    
            var tags = new List<string>() { };
            var regID = hub.Register(token, tags.ToArray()).RegistrationId;
    
            Log.Debug(TAG, $"Successful registration of ID {regID}");
        }
    
  11. Creare un'altra nuova classe per il progetto e assegnarle il nome MyFirebaseMessagingService.Create another new class for your project, name it MyFirebaseMessagingService.
  12. Aggiungere le istruzioni using seguenti a MyFirebaseMessagingService.cs.Add the following using statements to MyFirebaseMessagingService.cs.

        using Android.Util;
        using Firebase.Messaging;
    
  13. Aggiungere il codice seguente sopra la dichiarazione class e definire la classe in modo che erediti da FirebaseMessagingService:Add the following above your class declaration, and have your class inherit from FirebaseMessagingService:

        [Service]
        [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
        public class MyFirebaseMessagingService : FirebaseMessagingService
    
  14. Aggiungere il codice seguente a MyFirebaseMessagingService.cs:Add the following code to MyFirebaseMessagingService.cs:

        const string TAG = "MyFirebaseMsgService";
        public override void OnMessageReceived(RemoteMessage message)
        {
            Log.Debug(TAG, "From: " + message.From);
            if(message.GetNotification()!= null)
            {
                //These is how most messages will be received
                Log.Debug(TAG, "Notification Message Body: " + message.GetNotification().Body);
                SendNotification(message.GetNotification().Body);
            }
            else 
            {
                //Only used for debugging payloads sent from the Azure portal
                SendNotification(message.Data.Values.First());
    
            }
    
        }
    
        void SendNotification(string messageBody)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            var pendingIntent = PendingIntent.GetActivity(this, 0, intent, PendingIntentFlags.OneShot);
    
            var notificationBuilder = new Notification.Builder(this)
                        .SetContentTitle("FCM Message")
                        .SetSmallIcon(Resource.Drawable.ic_launcher)
                        .SetContentText(messageBody)
                        .SetAutoCancel(true)
                        .SetContentIntent(pendingIntent);
    
            var notificationManager = NotificationManager.FromContext(this);
    
            notificationManager.Notify(0, notificationBuilder.Build());
        }
    
  15. Compilare il progetto.Build your project.
  16. Eseguire l'app nel dispositivo o nell'emulatore caricatoRun your app on your device or loaded emulator

Inviare notifiche di prova dal portale di AzureSend test notification from the Azure portal

È possibile testare rapidamente la ricezione di notifiche nell'app con l'opzione Invio di prova nel portale di Azure.You can test receiving notifications in your app with the Test Send option in the Azure portal. Verrà inviata una notifica push di prova al dispositivo.It sends a test push notification to your device.

Portale di Azure - Invio di prova

Le notifiche push vengono in genere inviate in un servizio back-end come Servizi mobili o ASP.NET usando una libreria compatibile.Push notifications are normally sent in a back-end service like Mobile Services or ASP.NET through a compatible library. Se non è disponibile una libreria per il back-end è anche possibile usare direttamente l'API REST per inviare messaggi di notifica.If a library is not available for your back-end, you can also use the REST API directly to send notification messages.

Passaggi successiviNext steps

In questa esercitazione, le notifiche sono state trasmesse a tutti i dispositivi Android registrati con il back-end.In this tutorial, you sent broadcast notifications to all your Android devices registered with the backend. Per informazioni sulle procedure per eseguire il push di notifiche a dispositivi Android specifici, passare all'esercitazione seguente:To learn how to push notifications to specific Android devices, advance to the following tutorial: