Invio di notifiche push a iOS con Hub di notifica di AzureSending push notifications to iOS with Azure Notification Hubs

PanoramicaOverview

Nota

Per completare l'esercitazione, è necessario disporre di un account Azure attivo.To complete this tutorial, you must have an active Azure account. Se non si dispone di un account, è possibile creare un account di valutazione gratuita in pochi minuti.If you don't have an account, you can create a free trial account in just a couple of minutes. Per informazioni dettagliate, vedere la pagina relativa alla versione di valutazione gratuita di Azure.For details, see Azure Free Trial.

Questa esercitazione illustra come usare Hub di notifica di Azure per inviare notifiche push a un'applicazione per iOS.This tutorial shows you how to use Azure Notification Hubs to send push notifications to an iOS application. Si creerà un'app iOS vuota che riceve notifiche push tramite Apple Push Notification Service (servizio APN).You'll create a blank iOS app that receives push notifications by using the 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.When you're finished, you'll be able to use your notification hub to broadcast push notifications to all the devices running your app.

Prima di iniziareBefore you begin

Obiettivo di questo articolo è consentire di iniziare a usare Hub di notifica di Azure il prima possibile.The goal of this article is to help you get started using Azure Notification Hubs as quickly as possible. L'articolo presenta uno scenario di trasmissione molto semplice che illustra i concetti di base di Hub di notifica.The article presents a very simple broadcast scenario that focuses on the basic concepts of Notification Hubs.

Se si ha già familiarità con Hub di notifica, è possibile selezionare un altro argomento nel riquadro di spostamento a sinistra o passare agli articoli pertinenti nella sezione "Passaggi successivi".If you are already familiar with Notification Hubs, you might want to select another topic from the left navigation or go to the relevant articles in the "Next steps" section.

I commenti e suggerimenti inviati verranno presi seriamente in considerazione.We take your feedback seriously. Se si riscontrano difficoltà nel completare questo argomento o si hanno suggerimenti per migliorarne il contenuto, è possibile lasciare un commento alla fine dell'articolo.If you have any difficulty completing this topic, or if you have recommendations for improving this content, we invite you to provide feedback at the end of the article.

Il codice completo per questa esercitazione è disponibile in GitHub.The completed code for this tutorial can be found on GitHub.

PrerequisitiPrerequisites

Per completare questa esercitazione, è necessario disporre di:This tutorial requires the following:

  • Mobile Services iOS SDK versione 1.2.4[Mobile Services iOS SDK version 1.2.4]
  • Ultima versione di XcodeLatest version of Xcode
  • Un dispositivo con iOS 8 o versione successiva.An iOS 8 (or later version)-capable device
  • Apple Developer Program .Apple Developer Program membership.

    Nota

    Considerati i requisiti di configurazione delle notifiche push, è necessario distribuire e testare le notifiche push in un dispositivo fisico con iOS, iPhone o iPad, anziché in un simulatore iOS.Because of configuration requirements for push notifications, you must deploy and test push notifications on a physical iOS device (iPhone or iPad) instead of the iOS Simulator.

Il completamento di questa esercitazione costituisce un prerequisito per tutte le altre esercitazioni di Hub di notifica relative ad app per iOS.Completing this tutorial is a prerequisite for all other Notification Hubs tutorials for iOS apps.

Generare il file di richiesta di firma del certificatoGenerate the Certificate Signing Request file

Il servizio Apple Push Notification Service (APNS) usa i certificati per autenticare le notifiche push.The Apple Push Notification Service (APNS) uses certificates to authenticate your push notifications. Seguire queste istruzioni per creare il certificato push necessario per inviare e ricevere notifiche.Follow these instructions to create the necessary push certificate to send and receive notifications. Per altre informazioni su questi concetti, vedere la documentazione ufficiale relativa al servizio Apple Push Notification Service .For more information on these concepts see the official Apple Push Notification Service documentation.

Generare il file della richiesta di firma del certificato usato da Apple per la generazione di un certificato push firmato.Generate the Certificate Signing Request (CSR) file, which is used by Apple to generate a signed push certificate.

  1. Sul Mac eseguire lo strumento Accesso Portachiavi.On your Mac, run the Keychain Access tool. Può essere aperto dalla cartella Utilities (Utility) o Other (Altro) nella finestra di avvio.It can be opened from the Utilities folder or the Other folder on the launch pad.
  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...).Click Keychain Access, expand Certificate Assistant, then click Request a Certificate from a Certificate Authority....

  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).Select your User Email Address and Common Name , make sure that Saved to disk is selected, and then click Continue. Lasciare vuoto il campo Indirizzo e-mail CA , in quanto non è obbligatorio.Leave the CA Email Address field blank as it is not required.

  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).Type a name for the Certificate Signing Request (CSR) file in Save As, select the location in Where, then click Save.

    Il file CSR viene salvato nel percorso selezionato. Il percorso predefinito è Scrivania.This saves the CSR file in the selected location; the default location is in the Desktop. Tenere a mente il percorso scelto per il file.Remember the location chosen for this file.

A questo punto registrare l'app con Apple, abilitare le notifiche push e caricare il file CSR esportato per creare un certificato push.Next, you will register your app with Apple, enable push notifications, and upload this exported CSR to create a push certificate.

Registrare l'app per le notifiche pushRegister your app for push notifications

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.To be able to send push notifications to an iOS app, you must register your application with Apple and also register for push notifications.

  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.If you have not already registered your app, navigate to the iOS Provisioning Portal at the Apple Developer Center, log on with your Apple ID, click Identifiers, then click App IDs, and finally click on the + sign to register a new app.

  2. Aggiornare i tre campi seguenti per la nuova app e quindi fare clic su Continue:Update the following three fields for your new app and then click Continue:

    • Name: digitare un nome descrittivo per l'app nel campo Name della sezione App ID Description.Name: Type a descriptive name for your app in the Name field in the App ID Description section.
    • 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.Bundle Identifier: Under the Explicit App ID section, enter a Bundle Identifier in the form <Organization Identifier>.<Product Name> as mentioned in the 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.The Organization Identifier and Product Name you use must match the organization identifier and product name you will use when you create your XCode project. Nella schermata seguente NotificationHubs viene usato come identificatore di organizzazione e GetStarted viene usato come nome del prodotto.In the screeshot below NotificationHubs is used as a organization idenitifier and GetStarted is used as the product name. Verificare che corrispondano ai valori che si useranno nel progetto XCode, in modo da usare il profilo di pubblicazione corretto con XCode.Making sure this matches the values you will use in your XCode project will allow you to use the correct publishing profile with XCode.
    • Notifiche Push: selezionare l'opzione Notifiche Push nella sezione Servizi app.Push Notifications: Check the Push Notifications option in the App Services section, .

      Verrà generato l'ID app e all'utente verrà chiesto di confermare le informazioni.This generates your App ID and requests you to confirm the information. Fare clic su Registra per confermare il nuovo ID app.Click Register to confirm the new App ID.

      Dopo aver fatto clic su Register (Registrazione) verrà visualizzata la schermata Registrazione completa, come illustrato di seguito.Once you click Register, you will see the Registration complete screen, as shown below. Fare clic su Done.Click Done.

  3. In Developer Center, sotto App IDs trovare l'ID app appena creato e fare clic sulla relativa riga.In the Developer Center, under App IDs, locate the app ID that you just created, and click on its row.

    Facendo clic sull'ID app verranno visualizzati i dettagli relativi all'app.Clicking on the app ID will display the app details. Fare clic sul pulsante Edit nella parte inferiore della schermata.Click the Edit button at the bottom.

  4. Scorrere fino alla fine della schermata e fare clic su Crea Certificato... nella sezione Development Push SSL Certificate.Scroll to the bottom of the screen, and click the Create Certificate... button under the section Development Push SSL Certificate.

    Verrà visualizzato l'assistente "Add iOS Certificate".This displays the "Add iOS Certificate" assistant.

    Nota

    Questa esercitazione usa un certificato di sviluppo.This tutorial uses a development certificate. La stessa procedura viene usata per registrare un certificato di produzione.The same process is used when registering a production certificate. Per l'invio delle notifiche, assicurarsi di usare lo stesso tipo di certificato.Just make sure that you use the same certificate type when sending notifications.

  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.Click Choose File, browse to the location where you saved the CSR file that you created in the first task, then click Generate.

  6. Al termine della creazione del certificato nel portale, fare clic su Download e quindi su Done.After the certificate is created by the portal, click the Download button, and click Done.

    Il certificato di firma verrà scaricato e salvato nel computer nella cartella Download.This downloads the certificate and saves it to your computer in your Downloads folder.

    Nota

    Per impostazione predefinita, il file scaricato di un certificato di sviluppo è denominato aps_development.cer.By default, the downloaded file a development certificate is named aps_development.cer.

  7. Fare doppio clic sul certificato push scaricato aps_development.cer.Double-click the downloaded push certificate aps_development.cer.

    Il nuovo certificato verrà installato nel Portachiavi, come mostrato di seguito:This installs the new certificate in the Keychain, as shown below:

    Nota

    Il nome del certificato potrebbe essere diverso, ma verrà preceduto da Apple Development iOS Push Services:.The name in your certificate might be different, but it will be prefixed with 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 .In Keychain Access, right-click the new push certificate that you created in the Certificates category. Fare clic su Esporta, assegnare un nome al file, selezionare il formato .p12 e quindi fare clic su Salva.Click Export, name the file, select the .p12 format, and then click Save.

    Prendere nota del nome del file e del percorso del certificato con estensione p12 esportato.Make a note of the file name and location of the exported .p12 certificate. Verrà usato per abilitare l'autenticazione con il servizio APN.It will be used to enable authentication with APNS.

    Nota

    In questa esercitazione viene creato un file QuickStart.p12.This tutorial creates a QuickStart.p12 file. Il nome e il percorso del file potrebbero essere diversi.Your file name and location might be different.

Creare un profilo di provisioning per l'appCreate a provisioning profile for the app

  1. Nel portale di provisioning iOS selezionare Provisioning Profiles, quindi All e infine fare clic sul pulsante + per creare un nuovo profilo.Back in the iOS Provisioning Portal, select Provisioning Profiles, select All, and then click the + button to create a new profile. Verrà avviata la procedura guidata Add iOS Provisiong ProfileThis launches the Add iOS Provisiong Profile Wizard

  2. Selezionare iOS App Development in Development come tipo di profilo di provisioning e fare clic su Continue.Select iOS App Development under Development as the provisiong profile type, and click Continue.
  3. Selezionare quindi l'ID app appena creato nell'elenco a discesa App IDe fare clic su Continue.Next, select the app ID you just created from the App ID drop-down list, and click Continue

  4. Nella schermata Select certificates selezionare il solito certificato di sviluppo usato per la firma del codice e fare clic su Continue.In the Select certificates screen, select your usual development certificate used for code signing, and click Continue. Questo non è il certificato push appena creato.This is not the push certificate you just created.

  5. In Devices selezionare i dispositivi da usare per il test e fare clic su Continue.Next, select the Devices to use for testing, and click Continue

  6. Scegliere infine un nome per il profilo in Profile Name e fare clic su Generate.Finally, pick a name for the profile in Profile Name, click Generate.

  7. Una volta creato il nuovo profilo di provisioning, fare clic per scaricarlo e installarlo nel computer di sviluppo Xcode.When the new provisioning profile is created click to download it and install it on your Xcode development machine. Fare quindi clic su Done.Then click Done.

Configurare l'hub di notifica per l'invio di notifiche push di iOSConfigure your Notification Hub for iOS push notifications

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.This section walks you through creating a new notification hub and configuring authentication with APNS using the .p12 push certificate that you created. Se si vuole usare un hub di notifica che è già stato creato, è possibile ignorare il passaggio 5.If you want to use a notification hub that you have already created, you can skip to step 5.

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

  2. Selezionare Nuovo > Web e dispositivi mobili > Hub di notifica.Select New > 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 si ha già un spazio dei nomi del bus di servizio in cui si vuole creare l'hub, seguire questa procedura:If you already have a service bus namespace that you want to create the hub in, do the following:

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

    b.b. Selezionare Crea.Select Create.

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

    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.After you've created the namespace and notification hub, the Azure portal opens.

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

  4. Selezionare Impostazioni > Criteri di accesso.Select Settings > Access Policies. Prendere nota delle due stringhe di connessione disponibili.Note the two connection strings that are available to you. Saranno necessarie in un secondo momento per gestire le notifiche push.You will need them to handle push notifications later.

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

  1. Fare clic sul pulsante Servizi di notifica nel pannello Impostazioni e quindi selezionare Apple (servizio APN).Click the Notification Services button in the Settings blade, then select Apple (APNS). Fare clic su Carica certificato e selezionare il file con estensione p12 esportato in precedenza.Click on Upload Certificate and select the .p12 file that you exported earlier. Assicurarsi di specificare anche la password corretta.Make sure you also specify the correct password.

    Assicurarsi di selezionare la modalità Sandbox, destinata allo sviluppo.Make sure to select Sandbox mode since this is for development. Usare la modalità Produzione solo se si vuole inviare notifiche push agli utenti che hanno acquistato l'app dallo Store.Only use the Production if you want to send push notifications to users who purchased your app from the store.

    Configurare il servizio APN nel portale di Azure    Configure APNS in Azure Portal

    Configurare il certificato APN nel portale di Azure

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.Your notification hub is now configured to work with APNS, and you have the connection strings to register your app and send push notifications.

Connettere l'app iOS all'hub di notificaConnect your iOS app to Notification Hubs

  1. In Xcode creare un nuovo progetto iOS e selezionare il modello Single View Application .In Xcode, create a new iOS project and select the Single View Application template.

    Xcode - Single View Application

  2. Quando si configurano le opzioni per il nuovo progetto, assicurarsi di usare gli stessi valori per Product Name (Nome prodotto) e Organization Identifier (Identificatore organizzazione) specificati in precedenza durante l'impostazione dell'ID del bundle nel portale per sviluppatori Apple.When setting the options for your new project, make sure to use the same Product Name and Organization Identifier that you used when you previously set the bundle ID on the Apple Developer portal.

    Xcode - Opzioni di progetto

  3. In Targets (Destinazioni) fare clic sul nome del progetto, quindi scegliere la scheda Build Settings (Impostazioni compilazione) ed espandere Code Signing Identity (Identità di firma del codice) e quindi in Debug impostare l'identità di firma del codice.Under Targets, click your project name, click the Build Settings tab and expand Code Signing Identity, and then under Debug, set your code-signing identity. Modificare l'impostazione di Levels (Livelli) da Basic (Base) a All (Tutto) e quindi impostare Provisioning Profile (Profili di provisioning) sul profilo di provisioning creato in precedenza.Toggle Levels from Basic to All, and set Provisioning Profile to the provisioning profile that you created previously.

    Se il profilo di provisioning creato in Xcode non viene visualizzato, provare ad aggiornare i profili per l'identità di firma.If you don't see the new provisioning profile that you created in Xcode, try refreshing the profiles for your signing identity. Fare clic su Xcode nella barra dei menu, fare clic su Preferences (Preferenze), selezionare la scheda Account, fare clic sul pulsante View Details (Visualizza dettagli), selezionare la propria identità di firma e infine fare clic sul pulsante di aggiornamento nell'angolo in basso a destra.Click Xcode on the menu bar, click Preferences, click the Account tab, click the View Details button, click your signing identity, and then click the refresh button in the bottom-right corner.

    Xcode - Profilo di provisioning

  4. Scaricare laMobile Services iOS SDK versione 1.2.4 e decomprimere il file.Download the [Mobile Services iOS SDK version 1.2.4] and unzip the file. In Xcode fare clic con il pulsante destro del mouse sul progetto e scegliere l'opzione Add Files to (Aggiungi file a) per aggiungere la cartella WindowsAzureMessaging.framework al progetto Xcode.In Xcode, right-click your project and click the Add Files to option to add the WindowsAzureMessaging.framework folder to your Xcode project. Selezionare Copy items if needed (Copia elementi se necessario) e fare clic su Add (Aggiungi).Select Copy items if needed, and then click Add.

    Nota

    Notification Hubs SDK non supporta attualmente bitcode Xcode 7.The notification hubs SDK does not currently support bitcode on Xcode 7. È necessario impostare Enable Bitcode (Abilita Bitcode) su No in Build Options (Opzioni di compilazione) per il progetto.You must set Enable Bitcode to No in the Build Options for your project.

    Decomprimere Azure SDK

  5. Aggiungere un nuovo file di intestazione al progetto denominato HubInfo.h.Add a new header file to your project named HubInfo.h. Questo file includerà le costanti per l'hub di notifica.This file will hold the constants for your notification hub. Aggiungere le definizioni seguenti e sostituire i segnaposto dei valori letterali stringa con il nome dell'hub e il valore DefaultListenSharedAccessSignature annotati in precedenza.Add the following definitions and replace the string literal placeholders with your hub name and the DefaultListenSharedAccessSignature that you noted earlier.

     #ifndef HubInfo_h
     #define HubInfo_h
    
         #define HUBNAME @"<Enter the name of your hub>"
         #define HUBLISTENACCESS @"<Enter your DefaultListenSharedAccess connection string"
    
     #endif /* HubInfo_h */
    
  6. Aprire il file AppDelegate.h e aggiungere le direttive import seguenti:Open your AppDelegate.h file add the following import directives:

      #import <WindowsAzureMessaging/WindowsAzureMessaging.h> 
      #import "HubInfo.h"
    
  7. Nel file AppDelegate.m file aggiungere il codice seguente nel metodo didFinishLaunchingWithOptions, in base alla versione di iOS.In your AppDelegate.m file, add the following code in the didFinishLaunchingWithOptions method based on your version of iOS. Questo codice registra l'handle di dispositivo nel servizio APNS:This code registers your device handle with APNs:

    Per iOS 8:For iOS 8:

      UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeSound |
                                             UIUserNotificationTypeAlert | UIUserNotificationTypeBadge categories:nil];
    
     [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
     [[UIApplication sharedApplication] registerForRemoteNotifications];
    

    Per versioni di iOS precedenti alla 8:For iOS versions prior to 8:

      [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    
  8. Nello stesso file aggiungere i metodi seguenti.In the same file, add the following methods. Questo codice si connette all'hub di notifica usando le informazioni di connessione specificate in HubInfo.h.This code connects to the notification hub using the connection information you specified in HubInfo.h. Fornisce il token del dispositivo all'hub di notifica in modo che quest'ultimo possa inviare notifiche:It then gives the device token to the notification hub so that the notification hub can send notifications:

     - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *) deviceToken {
         SBNotificationHub* hub = [[SBNotificationHub alloc] initWithConnectionString:HUBLISTENACCESS
                                     notificationHubPath:HUBNAME];
    
         [hub registerNativeWithDeviceToken:deviceToken tags:nil completion:^(NSError* error) {
             if (error != nil) {
                 NSLog(@"Error registering for notifications: %@", error);
             }
             else {
                 [self MessageBox:@"Registration Status" message:@"Registered"];
             }
         }];
     }
    
     -(void)MessageBox:(NSString *)title message:(NSString *)messageText
     {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:messageText delegate:self
             cancelButtonTitle:@"OK" otherButtonTitles: nil];
         [alert show];
     }
    
  9. Nello stesso file aggiungere il metodo seguente per visualizzare un avviso UIAlert se la notifica viene ricevuta mentre l'app è attiva:In the same file, add the following method to display a UIAlert if the notification is received while the app is active:

     - (void)application:(UIApplication *)application didReceiveRemoteNotification: (NSDictionary *)userInfo {
         NSLog(@"%@", userInfo);
         [self MessageBox:@"Notification" message:[[userInfo objectForKey:@"aps"] valueForKey:@"alert"]];
     }
    
  10. Compilare ed eseguire l'app sul dispositivo per assicurarsi che non si verifichino errori.Build and run the app on your device to verify that there are no failures.

Inviare notifiche push di provaSend test push notifications

È possibile testare la ricezione delle notifiche push nell'app inviandole tramite il portale di Azure. Cercare la sezione Risoluzione dei problemi nel pannello dell'hub e usare l'opzione Invio di prova.You can test receiving notifications in your app by sending push notifications in the [Azure Portal] via the Troubleshooting section in the hub blade (use the Test Send option).

Portale di Azure - Invio di prova

Le notifiche push vengono in genere inviate in un servizio back-end come App per dispositivi mobili o ASP.NET usando una libreria compatibile.Push notifications are normally sent in a back-end service like Mobile Apps or ASP.NET using a compatible library. È anche possibile utilizzare l'API REST direttamente per inviare messaggi di notifica se una libreria non è disponibile per il back-end.You can also use the REST API directly to send notification messages if a library is not available for your back-end.

Di seguito è riportato un elenco di altre esercitazioni, che è possibile esaminare per l'invio di notifiche:Here is a list of some other tutorials you may want to review for sending notifications:

Nella sezione successiva dell'esercitazione si apprenderà come usare l' interfaccia REST di Hub di notifica per inviare il messaggio di notifica direttamente nell'applicazione.In the next section of the tutorial, you will learn how to use the Notification Hub REST interface to send the notification message directly in your app. Tutti i dispositivi registrati ricevono la notifica inviata da qualsiasi dispositivo.All registered devices receive the notification sent by any device.

(Facoltativo) Inviare notifiche push dall'app(Optional) Send push notifications from the app

Importante

Questo esempio di invio di notifiche dall'app client è descritto solo a scopo didattico.This example of sending notifications from the client app is provided for learning purposes only. Essendo necessario l'elemento DefaultFullSharedAccessSignature nell'app client, l'hub di notifica viene esposto al rischio che un utente acceda per inviare notifiche non autorizzate ai client.Since this will require the DefaultFullSharedAccessSignature to be present on the client app, it exposes your notification hub to the risk that a user may gain access to send unauthorized notifications to your clients.

Questa sezione fornisce un esempio di invio di notifiche push dall'interno di un'app tramite l'interfaccia REST.If you want to send push notifications from within an app, this section provides an example of how to do this using the REST interface.

  1. In Xcode aprire Main.storyboard e aggiungere i componenti dell'interfaccia utente riportati di seguito dalla libreria di oggetti, per consentire all'utente di inviare notifiche push nell'app.In Xcode, open Main.storyboard and add the following UI components from the object library to allow the user to send push notifications in the app:

    • Etichetta senza testo.A label with no label text. Sarà usata per segnalare errori di invio di notifiche.It will be used to report errors in sending notifications. La proprietà Lines deve essere impostata su 0, in modo da limitare automaticamente le dimensioni ai margini destro e sinistro e alla parte superiore della visualizzazione.The Lines property should be set to 0 so that it will automatically size constrained to the right and left margins and the top of the view.
    • Campo di testo con testo segnaposto impostato su Enter Notification Message (Immetti messaggio di notifica).A text field with Placeholder text set to Enter Notification Message. Vincolare il campo sotto l'etichetta, come illustrato di seguito.Constrain the field just below the label as shown below. Impostare il controller di visualizzazione come delegato di uscita.Set the View Controller as the outlet delegate.
    • Pulsante denominato Send Notification vincolato, appena sotto il campo di testo e al centro nell'area orizzontale.A button titled Send Notification constrained just below the text field and in the horizontal center.

      La visualizzazione dovrebbe apparire come segue:The view should look as follows:

      Finestra di progettazione Xcode

  2. Aggiungere punti di uscita per l'etichetta e i campi di testo connessi alla visualizzazione e aggiornare la definizione di interface per supportare UITextFieldDelegate e NSXMLParserDelegate.Add outlets for the label and text field connected your view, and update your interface definition to support UITextFieldDelegate and NSXMLParserDelegate. Aggiungere le tre dichiarazioni di proprietà riportate di seguito per supportare la chiamata dell'API REST e l'analisi della risposta.Add the three property declarations shown below to help support calling the REST API and parsing the response.

    Il file ViewController.h dovrebbe apparire come segue:Your ViewController.h file should look as follows:

     #import <UIKit/UIKit.h>
    
     @interface ViewController : UIViewController <UITextFieldDelegate, NSXMLParserDelegate>
     {
         NSXMLParser *xmlParser;
     }
    
     // Make sure these outlets are connected to your UI by ctrl+dragging
     @property (weak, nonatomic) IBOutlet UITextField *notificationMessage;
     @property (weak, nonatomic) IBOutlet UILabel *sendResults;
    
     @property (copy, nonatomic) NSString *statusResult;
     @property (copy, nonatomic) NSString *currentElement;
    
     @end
    
  3. Aprire HubInfo.h e aggiungere le costanti seguenti che verranno usate per inviare notifiche all'hub.Open HubInfo.h and add the following constants which will be used for sending notifications to your hub. Sostituire il valore letterale stringa del segnaposto con la stringa di connessione DefaultFullSharedAccessSignature effettiva.Replace the placeholder string literal with your actual DefaultFullSharedAccessSignature connection string.

     #define API_VERSION @"?api-version=2015-01"
     #define HUBFULLACCESS @"<Enter Your DefaultFullSharedAccess Connection string>"
    
  4. Aggiungere le istruzioni #import seguenti al file ViewController.h.Add the following #import statements to your ViewController.h file.

     #import <CommonCrypto/CommonHMAC.h>
     #import "HubInfo.h"
    
  5. In ViewController.m aggiungere il codice seguente all'implementazione dell'interfaccia.In ViewController.m add the following code to the interface implementation. Questo codice analizzerà la stringa di connessione DefaultFullSharedAccessSignature .This code will parse your DefaultFullSharedAccessSignature connection string. Come indicato nel riferimento all'API REST, queste informazioni analizzate verranno usate per generare un token di firma di accesso condiviso per l'intestazione della richiesta Authorization .As mentioned in the REST API reference, this parsed information will be used to generate a SaS token for the Authorization request header.

     NSString *HubEndpoint;
     NSString *HubSasKeyName;
     NSString *HubSasKeyValue;
    
     -(void)ParseConnectionString
     {
         NSArray *parts = [HUBFULLACCESS componentsSeparatedByString:@";"];
         NSString *part;
    
         if ([parts count] != 3)
         {
             NSException* parseException = [NSException exceptionWithName:@"ConnectionStringParseException"
                 reason:@"Invalid full shared access connection string" userInfo:nil];
    
             @throw parseException;
         }
    
         for (part in parts)
         {
             if ([part hasPrefix:@"Endpoint"])
             {
                 HubEndpoint = [NSString stringWithFormat:@"https%@",[part substringFromIndex:11]];
             }
             else if ([part hasPrefix:@"SharedAccessKeyName"])
             {
                 HubSasKeyName = [part substringFromIndex:20];
             }
             else if ([part hasPrefix:@"SharedAccessKey"])
             {
                 HubSasKeyValue = [part substringFromIndex:16];
             }
         }
     }
    
  6. In ViewController.m aggiornare il metodo viewDidLoad per analizzare la stringa di connessione quando viene caricata la visualizzazione.In ViewController.m, update the viewDidLoad method to parse the connection string when the view loads. Aggiungere anche i metodi di utilità illustrati di seguito all'implementazione dell'interfaccia.Also add the utility methods, shown below, to the interface implementation.

     - (void)viewDidLoad
     {
         [super viewDidLoad];
         [self ParseConnectionString];
         [_notificationMessage setDelegate:self];
     }
    
     -(NSString *)CF_URLEncodedString:(NSString *)inputString
     {
        return (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)inputString,
             NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
     }
    
     -(void)MessageBox:(NSString *)title message:(NSString *)messageText
     {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:messageText delegate:self
             cancelButtonTitle:@"OK" otherButtonTitles: nil];
         [alert show];
     }
    
  7. In ViewController.maggiungere il codice seguente all'implementazione dell'interfaccia per generare il token di autorizzazione della firma di accesso condiviso che verrà fornito nell'intestazione Authorization , come indicato nel riferimento all'API REST.In ViewController.m, add the following code to the interface implementation to generate the SaS authorization token that will be provided in the Authorization header, as mentioned in the REST API Reference.

     -(NSString*) generateSasToken:(NSString*)uri
     {
         NSString *targetUri;
         NSString* utf8LowercasedUri = NULL;
         NSString *signature = NULL;
         NSString *token = NULL;
    
         @try
         {
             // Add expiration
             uri = [uri lowercaseString];
             utf8LowercasedUri = [self CF_URLEncodedString:uri];
             targetUri = [utf8LowercasedUri lowercaseString];
             NSTimeInterval expiresOnDate = [[NSDate date] timeIntervalSince1970];
             int expiresInMins = 60; // 1 hour
             expiresOnDate += expiresInMins * 60;
             UInt64 expires = trunc(expiresOnDate);
             NSString* toSign = [NSString stringWithFormat:@"%@\n%qu", targetUri, expires];
    
             // Get an hmac_sha1 Mac instance and initialize with the signing key
             const char *cKey  = [HubSasKeyValue cStringUsingEncoding:NSUTF8StringEncoding];
             const char *cData = [toSign cStringUsingEncoding:NSUTF8StringEncoding];
             unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
             CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
             NSData *rawHmac = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];
             signature = [self CF_URLEncodedString:[rawHmac base64EncodedStringWithOptions:0]];
    
             // Construct authorization token string
             token = [NSString stringWithFormat:@"SharedAccessSignature sig=%@&se=%qu&skn=%@&sr=%@",
                 signature, expires, HubSasKeyName, targetUri];
         }
         @catch (NSException *exception)
         {
             [self MessageBox:@"Exception Generating SaS Token" message:[exception reason]];
         }
         @finally
         {
             if (utf8LowercasedUri != NULL)
                 CFRelease((CFStringRef)utf8LowercasedUri);
             if (signature != NULL)
             CFRelease((CFStringRef)signature);
         }
    
         return token;
     }
    
  8. Premere CTRL e trascinare dal pulsante Send Notification (Invia notifica) a ViewController.m per aggiungere un'azione denominata SendNotificationMessage per l'evento Touch Down.Ctrl+drag from the Send Notification button to ViewController.m to add an action named SendNotificationMessage for the Touch Down event. Aggiornare il metodo con il codice seguente per inviare la notifica con l'API REST.Update method with the following code to send the notification using the REST API.

     - (IBAction)SendNotificationMessage:(id)sender
     {
         self.sendResults.text = @"";
         [self SendNotificationRESTAPI];
     }
    
     - (void)SendNotificationRESTAPI
     {
         NSURLSession* session = [NSURLSession
                          sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
                          delegate:nil delegateQueue:nil];
    
         // Apple Notification format of the notification message
         NSString *json = [NSString stringWithFormat:@"{\"aps\":{\"alert\":\"%@\"}}",
                             self.notificationMessage.text];
    
         // Construct the message's REST endpoint
         NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@/messages/%@", HubEndpoint,
                                             HUBNAME, API_VERSION]];
    
         // Generate the token to be used in the authorization header
         NSString* authorizationToken = [self generateSasToken:[url absoluteString]];
    
         //Create the request to add the APNs notification message to the hub
         NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
         [request setHTTPMethod:@"POST"];
         [request setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
         // Signify Apple notification format
         [request setValue:@"apple" forHTTPHeaderField:@"ServiceBusNotification-Format"];
    
         //Authenticate the notification message POST request with the SaS token
         [request setValue:authorizationToken forHTTPHeaderField:@"Authorization"];
    
         //Add the notification message body
         [request setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]];
    
         // Send the REST request
         NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
             completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
         {
             NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
             if (error || (httpResponse.statusCode != 200 && httpResponse.statusCode != 201))
             {
                 NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
             }
             if (data != NULL)
             {
                 xmlParser = [[NSXMLParser alloc] initWithData:data];
                 [xmlParser setDelegate:self];
                    [xmlParser parse];
             }
         }];
         [dataTask resume];
     }
    
  9. In ViewController.maggiungere il metodo delegato seguente per supportare la chiusura della tastiera per il campo di testo.In ViewController.m, add the following delegate method to support closing the keyboard for the text field. Premere CTRL e trascinare dal campo di testo all'icona del controller di visualizzazione nella finestra di progettazione di interfaccia per impostare il controller di visualizzazione del delegato di uscita.Ctrl+drag from the text field to the View Controller icon in the interface designer to set the view controller as the outlet delegate.

     //===[ Implement UITextFieldDelegate methods ]===
    
     -(BOOL)textFieldShouldReturn:(UITextField *)textField
     {
         [textField resignFirstResponder];
         return YES;
     }
    
  10. In ViewController.m aggiungere i metodi delegati seguenti per supportare l'analisi della risposta con NSXMLParser.In ViewController.m, add the following delegate methods to support parsing the response by using NSXMLParser.

    //===[ Implement NSXMLParserDelegate methods ]===
    
    -(void)parserDidStartDocument:(NSXMLParser *)parser
    {
        self.statusResult = @"";
    }
    
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
        namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
        attributes:(NSDictionary *)attributeDict
    {
        NSString * element = [elementName lowercaseString];
        NSLog(@"*** New element parsed : %@ ***",element);
    
        if ([element isEqualToString:@"code"] | [element isEqualToString:@"detail"])
        {
            self.currentElement = element;
        }
    }
    
    -(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)parsedString
    {
        self.statusResult = [self.statusResult stringByAppendingString:
            [NSString stringWithFormat:@"%@ : %@\n", self.currentElement, parsedString]];
    }
    
    -(void)parserDidEndDocument:(NSXMLParser *)parser
    {
        // Set the status label text on the UI thread
        dispatch_async(dispatch_get_main_queue(),
        ^{
            [self.sendResults setText:self.statusResult];
        });
    }
    
  11. Compilare il progetto e verificare che non siano presenti errori.Build the project and verify that there are no errors.

Nota

Se si verifica un errore di compilazione in Xcode7 relativo al supporto per Bitcode, è necessario modificare Build Settings (Impostazioni compilazione) > Enable Bitcode (ENABLE_BITCODE) (Abilita Bitcode) impostandolo su NO in Xcode.If you encounter a build error in Xcode7 about bitcode support, you should change the Build Settings > Enable Bitcode (ENABLE_BITCODE) to NO in Xcode. Notification Hubs SDK non supporta attualmente bitcode.The Notification Hubs SDK does not currently support bitcode.

È possibile trovare tutti i payload di notifica disponibili nella guida alla programmazione di notifiche push e localidi Apple.You can find all the possible notification payloads in the Apple [Local and Push Notification Programming Guide].

Verifica della ricezione di notifiche push nell'appChecking if your app can receive push notifications

Per testare le notifiche push in iOS, è necessario distribuire l'app in un dispositivo fisico iOS.To test push notifications on iOS, you must deploy the app to a physical iOS device. Non è possibile inviare notifiche push Apple con il simulatore iOS.You cannot send Apple push notifications by using the iOS Simulator.

  1. Eseguire l'app e verificare che la registrazione riesca e quindi scegliere OK.Run the app and verify that registration succeeds, and then press OK.

    Test di registrazione notifica push per app iOS

  2. È possibile inviare una notifica push di prova dal portale di Azure, come illustrato in precedenza.You can send a test push notification from the [Azure Portal], as described above. Se è stato aggiunto codice per l'invio delle notifiche push nell'app, toccare nel campo di testo per immettere un messaggio di notifica.If you added code for sending push notifications in the app, touch inside the text field to enter a notification message. Usare il pulsante Send (Invia) sulla tastiera o il pulsante Send Notification (Invia notifica) nella visualizzazione per inviare il messaggio di notifica.Then press the Send button on the keyboard or the Send Notification button in the view to send the notification message.

    Test di invio notifica push per app iOS

  3. La notifica push viene inviata a tutti i dispositivi registrati per la ricezione di notifiche dall'hub di notifica specifico.The push notification is sent to all devices that are registered to receive the notifications from the particular Notification Hub.

    Test di ricezione notifica push per app iOS

Passaggi successiviNext steps

In questo semplice esempio le notifiche push sono state trasmesse a tutti i dispositivi iOS registrati.In this simple example, you broadcasted push notifications to all your registered iOS devices. Come passaggio successivo nella formazione, vedere l'esercitazione Uso di Hub di notifica di Azure per inviare notifiche agli utenti per iOS con back-end .NET , che illustra la creazione di un back-end per l'invio di notifiche push tramite tag.We suggest as a next step in your learning that you proceed to the [Azure Notification Hubs Notify Users for iOS with .NET backend] tutorial, which will walk you through creating a backend to send push notifications using tags.

Per segmentare gli utenti per gruppi di interesse, è possibile vedere anche l'esercitazione Usare Hub di notifica per inviare le ultime notizie .If you want to segment your users by interest groups, you can additionally move on to the [Use Notification Hubs to send breaking news] tutorial.

Per informazioni generali su Hub di notifica, vedere Panoramica dell'Hub di notifica.For general information about Notification Hubs, see [Notification Hubs Guidance].