Notifiche push di iOS con Hub di notifica per app Xamarin

Panoramica

Importante

Per completare l'esercitazione, è necessario disporre di un account Azure attivo. Se non si dispone di un account, è possibile creare un account di valutazione gratuita in pochi minuti. Per informazioni dettagliate, vedere la pagina relativa alla versione di valutazione gratuita di Azure.

Questa esercitazione illustra come usare Hub di notifica di Azure per inviare notifiche push a un'applicazione per iOS. Si creerà un'app Xamarin.iOS vuota che riceve notifiche push attraverso Apple Push Notification Service (APNS). Al termine, sarà possibile usare l’hub di notifica per trasmettere le notifiche push a tutti i dispositivi che eseguono l'app. Il codice compilato è disponibile nell'esempio di app NotificationHubs.

Questa esercitazione illustra un semplice scenario di trasmissione di un messaggio push con Hub di notifica.

Prerequisiti

Per completare questa esercitazione, è necessario disporre di:

  • Xcode 6.0
  • Dispositivo compatibile con iOS 7.0 o versione successiva
  • Iscrizione a iOS Developer Program
  • Xamarin Studio

    Nota

    Considerati i requisiti di configurazione delle notifiche push di iOS, è necessario distribuire e testare l'applicazione di esempio in un dispositivo iOS, iPhone o iPad, anziché in un simulatore.

Il completamento di questa esercitazione costituisce un prerequisito per tutte le altre esercitazioni di Hub di notifica relative ad app per Xamarin.iOS.

Generare il file di richiesta di firma del certificato

Il servizio Apple Push Notification Service (APNS) usa i certificati per autenticare le notifiche push. Seguire queste istruzioni per creare il certificato push necessario per inviare e ricevere notifiche. Per altre informazioni su questi concetti, vedere la documentazione ufficiale relativa al servizio Apple Push Notification Service .

Generare il file della richiesta di firma del certificato usato da Apple per la generazione di un certificato push firmato.

  1. Sul Mac eseguire lo strumento Accesso Portachiavi. Può essere aperto dalla cartella Utilities (Utility) o Other (Altro) nella finestra di avvio.
  2. Fare clic su Keychain Access (Accesso Portachiavi), espandere Certificate Assistant (Assistente Certificato), quindi fare clic su Request a Certificate from a Certificate Authority... (Richiedi un certificato da una Autorità di Certificazione...).

  3. Selezionare User Email Address (Indirizzo e-mail utente) e Common Name (Nome comune), assicurarsi che l'opzione Saved to disk (Salvata sul disco) sia selezionata, quindi fare clic su Continue (Continua). Lasciare vuoto il campo Indirizzo e-mail CA , in quanto non è obbligatorio.

  4. Digitare un nome per il file della richiesta di firma del certificato (CSR) in Save As, (Salva col nome), selezionare il percorso in Where (Posizione), quindi fare clic su Save (Salva).

    Il file CSR viene salvato nel percorso selezionato. Il percorso predefinito è Scrivania. Tenere a mente il percorso scelto per il file.

A questo punto registrare l'app con Apple, abilitare le notifiche push e caricare il file CSR esportato per creare un certificato push.

Registrare l'app per le notifiche push

Per poter inviare notifiche push a un'app per iOS, è necessario registrare l'applicazione con Apple ed eseguire un'altra registrazione per abilitare le notifiche push.

  1. Se l'app non è ancora stata registrata, accedere al portale di provisioning iOS su Apple Developer Center, eseguire l'accesso con il proprio ID Apple, fare clic su Identifiers, quindi su App IDs e infine fare clic sul segno + per registrare una nuova app.

  2. Aggiornare i tre campi seguenti per la nuova app e quindi fare clic su Continue:

    • Name: digitare un nome descrittivo per l'app nel campo Name della sezione App ID Description.
    • Bundle Identifier: nella sezione Explicit App ID immettere un valore in Bundle Identifier nel formato <Organization Identifier>.<Product Name>, come indicato nel documento App Distribution Guide. Organization Identifier e Product Name devono corrispondere all'identificatore dell'organizzazione e al nome del prodotto che verranno usati quando si crea il progetto XCode. Nella schermata seguente NotificationHubs viene usato come identificatore di organizzazione e GetStarted viene usato come nome del prodotto. Verificare che corrispondano ai valori che si useranno nel progetto XCode, in modo da usare il profilo di pubblicazione corretto con XCode.
    • Notifiche Push: selezionare l'opzione Notifiche Push nella sezione Servizi app.

      Verrà generato l'ID app e all'utente verrà chiesto di confermare le informazioni. Fare clic su Registra per confermare il nuovo ID app.

      Dopo aver fatto clic su Register (Registrazione) verrà visualizzata la schermata Registrazione completa, come illustrato di seguito. Fare clic su Done.

  3. In Developer Center, sotto App IDs trovare l'ID app appena creato e fare clic sulla relativa riga.

    Facendo clic sull'ID app verranno visualizzati i dettagli relativi all'app. Fare clic sul pulsante Edit nella parte inferiore della schermata.

  4. Scorrere fino alla fine della schermata e fare clic su Crea Certificato... nella sezione Development Push SSL Certificate.

    Verrà visualizzato l'assistente "Add iOS Certificate".

    Nota

    Questa esercitazione usa un certificato di sviluppo. La stessa procedura viene usata per registrare un certificato di produzione. Per l'invio delle notifiche, assicurarsi di usare lo stesso tipo di certificato.

  5. Fare clic su Choose File, passare al percorso in cui è stato salvato il file CSR creato durante la prima attività, quindi fare clic su Generate.

  6. Al termine della creazione del certificato nel portale, fare clic su Download e quindi su Done.

    Il certificato di firma verrà scaricato e salvato nel computer nella cartella Download.

    Nota

    Per impostazione predefinita, il file scaricato di un certificato di sviluppo è denominato aps_development.cer.

  7. Fare doppio clic sul certificato push scaricato aps_development.cer.

    Il nuovo certificato verrà installato nel Portachiavi, come mostrato di seguito:

    Nota

    Il nome del certificato potrebbe essere diverso, ma verrà preceduto da Apple Development iOS Push Services:.

  8. In Accesso portachiavi fare clic con il pulsante destro del mouse sul nuovo certificato push creato nella categoria Certificati . Fare clic su Esporta, assegnare un nome al file, selezionare il formato .p12 e quindi fare clic su Salva.

    Prendere nota del nome del file e del percorso del certificato con estensione p12 esportato. Verrà usato per abilitare l'autenticazione con il servizio APN.

    Nota

    In questa esercitazione viene creato un file QuickStart.p12. Il nome e il percorso del file potrebbero essere diversi.

Creare un profilo di provisioning per l'app

  1. Nel portale di provisioning iOS selezionare Provisioning Profiles, quindi All e infine fare clic sul pulsante + per creare un nuovo profilo. Verrà avviata la procedura guidata Add iOS Provisiong Profile

  2. Selezionare iOS App Development in Development come tipo di profilo di provisioning e fare clic su Continue.
  3. Selezionare quindi l'ID app appena creato nell'elenco a discesa App IDe fare clic su Continue.

  4. Nella schermata Select certificates selezionare il solito certificato di sviluppo usato per la firma del codice e fare clic su Continue. Questo non è il certificato push appena creato.

  5. In Devices selezionare i dispositivi da usare per il test e fare clic su Continue.

  6. Scegliere infine un nome per il profilo in Profile Name e fare clic su Generate.

  7. Una volta creato il nuovo profilo di provisioning, fare clic per scaricarlo e installarlo nel computer di sviluppo Xcode. Fare quindi clic su Done.

Configurare l'hub di notifica

Questa sezione illustra come creare un nuovo hub di notifica e configurare l'autenticazione con il servizio APN usando il certificato push .p12 creato in precedenza. Se si vuole usare un hub di notifica che è già stato creato, è possibile ignorare il passaggio 5.

  1. Accedere al portale di Azure.

  2. Selezionare Nuovo > Web e dispositivi mobili > Hub di notifica.

    Portale di Azure: creare un hub di notifica

  3. Nella casella Hub di notifica digitare un nome univoco. Selezionare l'area, la sottoscrizione e il gruppo di risorse (se già disponibili).

    Se si ha già un spazio dei nomi del bus di servizio in cui si vuole creare l'hub, seguire questa procedura:

    a. Nell'area Spazio dei nomi selezionare il collegamento Seleziona esistente.

    b. Selezionare Crea.

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

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

    Dopo avere creato lo spazio dei nomi e l'hub di notifica, viene aperto il portale di Azure.

    Portale di Azure: pagina del portale dell'hub di notifica

  4. Selezionare Impostazioni > Criteri di accesso. Prendere nota delle due stringhe di connessione disponibili. Saranno necessarie in un secondo momento per gestire le notifiche push.

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

  1. Per configurare la connessione del servizio APN, nel portale di Azure aprire le impostazioni dell'hub di notifica, fare clic su Notification Services e quindi fare clic sull'elemento Apple (APNS) nell'elenco. Successivamente, fare clic su Carica certificato e selezionare il certificato con estensione p12 esportato in precedenza, nonché la password per tale certificato.

    Assicurarsi di selezionare la modalità Sandbox perché verranno inviati messaggi push in un ambiente di sviluppo. Usare l'impostazione Produzione solo se si vogliono inviare notifiche push agli utenti che hanno già acquistato l'app dallo Store.

  

  

L'hub di notifica è ora configurato per l'uso con il servizio APN e sono disponibili le stringhe di connessione per la registrazione dell'app e l'invio di notifiche push.

Connettere l'app all'hub di notifica

Creare un nuovo progetto

  1. In Xamarin Studio creare un nuovo progetto iOS e selezionare il modello Unified API > Single View Application.

    Xamarin Studio: selezionare il tipo di applicazione

  2. È necessario aggiungere un riferimento al componente di messaggistica di Azure. Nella visualizzazione Solution fare clic con il pulsante destro del mouse sulla cartella Components del progetto e scegliere Get More Components. Cercare il componente Messaggistica di Azure e aggiungerlo al progetto.
  3. In AppDelegate.csaggiungere l'istruzione using seguente:

     using WindowsAzure.Messaging;
    
  4. Dichiarare un'istanza di SBNotificationHub:

     private SBNotificationHub Hub { get; set; }
    
  5. Creare una classe Constants.cs con le variabili seguenti:

     // Azure app-specific connection string and hub path
     public const string ConnectionString = "<Azure connection string>";
     public const string NotificationHubPath = "<Azure hub path>";
    
  6. In AppDelegate.cs aggiornare FinishedLaunching() in base all'esempio seguente:

     public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
     {
         if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
             var pushSettings = UIUserNotificationSettings.GetSettingsForTypes (
                    UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                    new NSSet ());
    
             UIApplication.SharedApplication.RegisterUserNotificationSettings (pushSettings);
             UIApplication.SharedApplication.RegisterForRemoteNotifications ();
         } else {
             UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
             UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);
         }
    
         return true;
     }
    
  7. Eseguire l'override del metodo RegisteredForRemoteNotifications() in AppDelegate.cs:

     public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
     {
         Hub = new SBNotificationHub(Constants.ConnectionString, Constants.NotificationHubPath);
    
         Hub.UnregisterAllAsync (deviceToken, (error) => {
             if (error != null)
             {
                 Console.WriteLine("Error calling Unregister: {0}", error.ToString());
                 return;
             }
    
             NSSet tags = null; // create tags if you want
             Hub.RegisterNativeAsync(deviceToken, tags, (errorCallback) => {
                 if (errorCallback != null)
                     Console.WriteLine("RegisterNativeAsync error: " + errorCallback.ToString());
             });
         });
     }
    
  8. Eseguire l'override del metodo ReceivedRemoteNotification() in AppDelegate.cs:

     public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
     {
         ProcessNotification(userInfo, false);
     }
    
  9. Creare il metodo ProcessNotification() seguente in AppDelegate.cs:

     void ProcessNotification(NSDictionary options, bool fromFinishedLaunching)
     {
         // Check to see if the dictionary has the aps key.  This is the notification payload you would have sent
         if (null != options && options.ContainsKey(new NSString("aps")))
         {
             //Get the aps dictionary
             NSDictionary aps = options.ObjectForKey(new NSString("aps")) as NSDictionary;
    
             string alert = string.Empty;
    
             //Extract the alert text
             // NOTE: If you're using the simple alert by just specifying
             // "  aps:{alert:"alert msg here"}  ", this will work fine.
             // But if you're using a complex alert with Localization keys, etc.,
             // your "alert" object from the aps dictionary will be another NSDictionary.
             // Basically the JSON gets dumped right into a NSDictionary,
             // so keep that in mind.
             if (aps.ContainsKey(new NSString("alert")))
                 alert = (aps [new NSString("alert")] as NSString).ToString();
    
             //If this came from the ReceivedRemoteNotification while the app was running,
             // we of course need to manually process things like the sound, badge, and alert.
             if (!fromFinishedLaunching)
             {
                 //Manually show an alert
                 if (!string.IsNullOrEmpty(alert))
                 {
                     UIAlertView avAlert = new UIAlertView("Notification", alert, null, "OK", null);
                     avAlert.Show();
                 }
             }
         }
     }
    

    Nota

    È possibile scegliere di eseguire l'override di FailedToRegisterForRemoteNotifications() per gestire situazioni quali l'assenza di una connessione di rete. Questo risulta particolarmente importante nei casi in cui l'utente può avviare l'applicazione in modalità offline, ad esempio in aereo, e si vuole gestire scenari di messaggistica push specifici per l'applicazione.

  10. Eseguire l'app sul dispositivo.

Invio di notifiche push

È possibile testare la ricezione delle notifiche push nell'app inviando notifiche nel portale di Azure con la funzionalità Invio di prova nel set di strumenti Risoluzione dei problemi, nella pagina dell'hub di notifica, come illustrato nella schermata seguente.

Le notifiche push vengono in genere inviate attraverso un servizio back-end come Servizi mobili o ASP.NET usando una libreria compatibile. È anche possibile usare direttamente l'API REST per l'invio di messaggi push se non è disponibile una libreria nello scenario.

In questa esercitazione verrà usata un'app semplice e verrà illustrato solo il test dell'app client mediante l'invio di notifiche tramite .NET SDK per gli hub di notifica in un'applicazione console, invece che in un servizio back-end. Come passaggio successivo per l'invio di notifiche da un back-end ASP.NET, è consigliabile vedere l'esercitazione Uso di Hub di notifica di Azure per inviare notifiche agli utenti . Si possono tuttavia usare gli approcci seguenti per l'invio di notifiche:

App per dispositivi mobili: per un esempio di come inviare notifiche da un back-end di app per dispositivi mobili del servizio app di Azure integrato in Hub di notifica, vedere Aggiungere notifiche push all'app iOS.

(Facoltativo) Inviare notifiche push da un'app console .NET.

In questa sezione si invieranno notifiche push con una semplice app console .NET. Ai fini di questo esempio, si passerà a un ambiente di sviluppo Windows in cui Visual Studio è già installato.

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

    ![Visual Studio - Create a new console application][213]
    
  2. In Visual Studio fare clic su Strumenti, selezionare Gestione pacchetti NuGet e quindi Console di Gestione pacchetti.

    La console di gestione pacchetti viene visualizzata ancorata alla parte inferiore dell'area di lavoro di Visual Studio.

  3. Nella finestra Console di Gestione pacchetti impostare Progetto predefinito sul nuovo progetto di applicazione console, quindi eseguire il comando seguente nella finestra della console:

     Install-Package Microsoft.Azure.NotificationHubs
    

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

  4. Aprire il file Program.cs e aggiungere l'istruzione using seguente, assicurandosi che sia possibile usare le classi e le funzioni di Azure all'interno della classe principale:

     using Microsoft.Azure.NotificationHubs;
    
  5. Nella classe Program aggiungere il metodo seguente senza tralasciare di sostituire la stringa di connessione e il nome dell'hub:

     private static async void SendNotificationAsync()
     {
         NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString("<connection string with full access>", "<hub name>");
         var alert = "{\"aps\":{\"alert\":\"Hello from .NET!\"}}";
         await hub.SendAppleNativeNotificationAsync(alert);
     }
    
  6. Aggiungere le righe seguenti nel metodo Main :

      SendNotificationAsync();
      Console.ReadLine();
    
  7. Premere F5 per eseguire l'app. Entro pochi secondi dovrebbe essere visualizzata una notifica push nel dispositivo. Se si usa una rete dati cellulare o il Wi-Fi, assicurarsi di avere una connessione Internet attiva nel dispositivo.

È possibile trovare tutti i payload disponibili nella guida alla programmazione di notifiche push e localidi Apple.

(Facoltativo) Inviare notifiche da un servizio mobile

In questa sezione si invieranno notifiche push usando un servizio mobile con uno script node.

Per inviare una notifica tramite un servizio mobile, vedere Introduzione a Servizi mobilie quindi seguire questa procedura:

  1. Accedere al portale di Azure classicoe selezionare il servizio mobile.
  2. Selezionare la scheda Utilità di pianificazione in alto.

    ![Azure Classic Portal - Scheduler][215]
    
  3. Creare un nuovo processo pianificato, immettere un nome, quindi scegliere On demand.

    ![Azure Classic Portal - Create new job][216]
    
  4. Una volta creato il processo, fare clic sul relativo nome. Fare quindi clic sulla scheda Script nella barra superiore.
  5. Inserire lo script seguente all'interno della funzione dell'utilità di pianificazione. Assicurarsi di sostituire i segnaposto con il nome dell'hub di notifica e la stringa di connessione associata a DefaultFullSharedAccessSignature ottenuti nel passaggio precedente. Fare clic su Save.

     var azure = require('azure');
     var notificationHubService = azure.createNotificationHubService('<Hubname>', '<SAS Full access >');
     notificationHubService.apns.send(
         null,
         {"aps":
             {
               "alert": "Hello from Mobile Services!"
             }
         },
         function (error)
         {
             if (!error) {
                 console.warn("Notification successful");
             }
         }
     );
    
  6. Fare clic su Run Once sulla barra inferiore. Si dovrebbe ricevere un avviso sul dispositivo.

Passaggi successivi

In questo semplice esempio le notifiche push vengono trasmesse a tutti i dispositivi iOS. Per rivolgersi a utenti specifici, fare riferimento all'esercitazione Usare Hub di notifica per inviare notifiche push agli utenti. Se si desidera segmentare gli utenti per gruppi di interesse, consultare Uso di Hub di notifica per inviare le ultime notizie. Per altre informazioni sull'uso di Hub di notifica, vedere Panoramica dell'Hub di notifica e Procedure di Hub di notifica per iOS.