Invio di notifiche push a iOS con Hub di notifica di Azure

Panoramica

Nota

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 iOS vuota che riceve notifiche push tramite Apple Push Notification Service (servizio APN).

Al termine, sarà possibile usare l’hub di notifica per trasmettere le notifiche push a tutti i dispositivi che eseguono l'app.

Prima di iniziare

Obiettivo di questo articolo è consentire di iniziare a usare Hub di notifica di Azure il prima possibile. L'articolo presenta uno scenario di trasmissione molto semplice che illustra i concetti di base di Hub di notifica.

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

I commenti e suggerimenti inviati verranno presi seriamente in considerazione. Se si riscontrano difficoltà nel completare questo argomento o si hanno suggerimenti per migliorarne il contenuto, è possibile lasciare un commento alla fine dell'articolo.

Il codice completo per questa esercitazione è disponibile in GitHub.

Prerequisiti

Per completare questa esercitazione, è necessario disporre di:

  • Mobile Services iOS SDK versione 1.2.4
  • Ultima versione di Xcode
  • Un dispositivo con iOS 8 o versione successiva.
  • Apple Developer Program .

    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.

Il completamento di questa esercitazione costituisce un prerequisito per tutte le altre esercitazioni di Hub di notifica relative ad app per 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 per l'invio di notifiche push di iOS

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. Fare clic sul pulsante Servizi di notifica nel pannello Impostazioni e quindi selezionare Apple (servizio APN). Fare clic su Carica certificato e selezionare il file con estensione p12 esportato in precedenza. Assicurarsi di specificare anche la password corretta.

    Assicurarsi di selezionare la modalità Sandbox, destinata allo sviluppo. Usare la modalità Produzione solo se si vuole inviare notifiche push agli utenti che hanno acquistato l'app dallo Store.

    Configurare il servizio APN nel portale di Azure

    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.

Connettere l'app iOS all'hub di notifica

  1. In Xcode creare un nuovo progetto iOS e selezionare il modello Single View Application .

    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.

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

    Se il profilo di provisioning creato in Xcode non viene visualizzato, provare ad aggiornare i profili per l'identità di firma. 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.

    Xcode - Profilo di provisioning

  4. Scaricare laMobile Services iOS SDK versione 1.2.4 e decomprimere il 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. Selezionare Copy items if needed (Copia elementi se necessario) e fare clic su Add (Aggiungi).

    Nota

    Notification Hubs SDK non supporta attualmente bitcode Xcode 7. È necessario impostare Enable Bitcode (Abilita Bitcode) su No in Build Options (Opzioni di compilazione) per il progetto.

    Decomprimere Azure SDK

  5. Aggiungere un nuovo file di intestazione al progetto denominato HubInfo.h. Questo file includerà le costanti per l'hub di notifica. Aggiungere le definizioni seguenti e sostituire i segnaposto dei valori letterali stringa con il nome dell'hub e il valore DefaultListenSharedAccessSignature annotati in precedenza.

     #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:

      #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. Questo codice registra l'handle di dispositivo nel servizio APNS:

    Per 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:

      [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    
  8. Nello stesso file aggiungere i metodi seguenti. Questo codice si connette all'hub di notifica usando le informazioni di connessione specificate in HubInfo.h. Fornisce il token del dispositivo all'hub di notifica in modo che quest'ultimo possa inviare notifiche:

     - (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:

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

Inviare notifiche push di prova

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

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. È anche possibile utilizzare l'API REST direttamente per inviare messaggi di notifica se una libreria non è disponibile per il back-end.

Di seguito è riportato un elenco di altre esercitazioni, che è possibile esaminare per l'invio di notifiche:

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. Tutti i dispositivi registrati ricevono la notifica inviata da qualsiasi dispositivo.

(Facoltativo) Inviare notifiche push dall'app

Importante

Questo esempio di invio di notifiche dall'app client è descritto solo a scopo didattico. 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.

Questa sezione fornisce un esempio di invio di notifiche push dall'interno di un'app tramite l'interfaccia REST.

  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.

    • Etichetta senza testo. Sarà usata per segnalare errori di invio di notifiche. 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.
    • Campo di testo con testo segnaposto impostato su Enter Notification Message (Immetti messaggio di notifica). Vincolare il campo sotto l'etichetta, come illustrato di seguito. Impostare il controller di visualizzazione come delegato di uscita.
    • Pulsante denominato Send Notification vincolato, appena sotto il campo di testo e al centro nell'area orizzontale.

      La visualizzazione dovrebbe apparire come segue:

      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. Aggiungere le tre dichiarazioni di proprietà riportate di seguito per supportare la chiamata dell'API REST e l'analisi della risposta.

    Il file ViewController.h dovrebbe apparire come segue:

     #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. Sostituire il valore letterale stringa del segnaposto con la stringa di connessione DefaultFullSharedAccessSignature effettiva.

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

     #import <CommonCrypto/CommonHMAC.h>
     #import "HubInfo.h"
    
  5. In ViewController.m aggiungere il codice seguente all'implementazione dell'interfaccia. Questo codice analizzerà la stringa di connessione DefaultFullSharedAccessSignature . 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 .

     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. Aggiungere anche i metodi di utilità illustrati di seguito all'implementazione dell'interfaccia.

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

     -(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. Aggiornare il metodo con il codice seguente per inviare la notifica con l'API REST.

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

     //===[ 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.

    //===[ 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.

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. Notification Hubs SDK non supporta attualmente bitcode.

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

Verifica della ricezione di notifiche push nell'app

Per testare le notifiche push in iOS, è necessario distribuire l'app in un dispositivo fisico iOS. Non è possibile inviare notifiche push Apple con il simulatore iOS.

  1. Eseguire l'app e verificare che la registrazione riesca e quindi scegliere 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. Se è stato aggiunto codice per l'invio delle notifiche push nell'app, toccare nel campo di testo per immettere un messaggio di notifica. Usare il pulsante Send (Invia) sulla tastiera o il pulsante Send Notification (Invia notifica) nella visualizzazione per inviare il messaggio di notifica.

    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.

    Test di ricezione notifica push per app iOS

Passaggi successivi

In questo semplice esempio le notifiche push sono state trasmesse a tutti i dispositivi iOS registrati. 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.

Per segmentare gli utenti per gruppi di interesse, è possibile vedere anche l'esercitazione Usare Hub di notifica per inviare le ultime notizie .

Per informazioni generali su Hub di notifica, vedere Panoramica dell'Hub di notifica.