Creazione di un'app Poke per iOS SDK con APNS - Parte 3

Questo tutorial è l'ultimo di una serie in tre parti su come lavorare con le funzionalità di notifica push di iOS 3.0+. Si concentra sull'utilizzo di alcune delle funzionalità più elaborate del servizio di notifica push di Apple (APNS). Questa rata si basa sul codice creato nel primo e secondo tutorial, quindi assicurati di leggerli prima se non lo hai già fatto.

Localizzazione

Alla fine dell'ultima puntata, abbiamo inviato la nostra prima spinta alla nostra app. Non era niente di speciale. Solo un semplice messaggio di avviso: "Sei stato colpito da Tyler." Non ci vuole un genio per capire che questo messaggio è in inglese, ma cosa sarebbe successo se l'avessimo inviato a milioni di persone che utilizzavano la nostra app in tutto il mondo? È probabile che alcuni di loro non avrebbero capito cosa abbiamo inviato. Ecco dove arriva la localizzazione.

Nota: per una spiegazione approfondita della localizzazione e di come funziona su iOS, consultare la documentazione per sviluppatori Apple. Immaginerò che tu capisca le basi ...

Cambiamenti alla spinta

Guarda di nuovo la console di notifica push di Urban Airship:

Noterai che mentre modifichi il contenuto dei campi superiori aggiorna il JSON nel campo "Payload". Puoi anche regolare manualmente il JSON, che è quello che faremo ora.

Ecco il JSON originale, riformattato per la leggibilità:

"aps": "alert": "Sei stato colpito da Tyler", "device_tokens": ["il token del tuo dispositivo va qui"]

Il dizionario "aps" è una parte necessaria di qualsiasi payload JSON di APNS. Indica a iOS cosa fare con la notifica. Attualmente, la chiave "alert" ha un valore stringa ("Sei stato colpito [...]"), ma l'APNS consente anche un valore di dizionario per questa chiave. Sarà necessario utilizzare un dizionario se si desidera supportare la localizzazione.

Per gli avvisi, è possibile localizzare il corpo del messaggio e il nome del pulsante di azione che appare sull'avviso (che per impostazione predefinita è "Visualizza"). Inoltre, puoi inviare il corpo del messaggio localizzato già come parte del payload del messaggio oppure puoi utilizzare stringhe pre-localizzate nel tuo pacchetto di app. Faremo quest'ultimo.

Aggiorniamo la chiave "alert" nel dizionario "aps" nel payload con i campi necessari:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "device_tokens": ["il token del dispositivo va qui"]

"loc-key" specifica il nome di una stringa nel nostro file Localizable.strings nel nostro pacchetto di app. Qualsiasi specificatore di formato nella nostra stringa di formato (PokeMessageFormat) verrà sostituito dalle stringhe in "loc-args". Così ora, invece di mostrare "Sei stato colpito da Tyler", iOS prenderà la stringa localizzata PokeMessageFormat dal nostro pacchetto, inserirà Tyler nella posizione appropriata e visualizzerà il messaggio localizzato nell'avviso. Ora abbiamo solo bisogno di aggiornare la nostra app per supportare la localizzazione.

Modifiche all'app

Apri il progetto dell'app in Xcode. Con "Risorse" selezionate dal riquadro Gruppi e File a sinistra, seleziona "Nuovo file ..." dal menu File. Sotto la sezione Mac OS X: risorse, seleziona "File di stringhe" e fai clic su "Avanti".

Denominare il file Localizable.strings e fare clic su "Fine".

Ora che il file è stato creato, dobbiamo renderlo localizzabile. Seleziona il file dal riquadro Gruppi e File a sinistra e fai clic su "Info" nella barra degli strumenti (o Comando-I). Nella parte inferiore della scheda Generale, dovrebbe esserci un pulsante intitolato "Rendi file localizzabile". Cliccalo. Quindi chiudi la finestra Informazioni.

Sebbene possa sembrare magia voodoo, tutto ciò che fa questo pulsante è creare una cartella English.lproj nella directory del progetto (se necessario) e spostare il file Localizable.strings al suo interno. Di nuovo, se vuoi maggiori informazioni sul "Perché?" di questo, leggi la documentazione per sviluppatori di Apple su internazionalizzazione e localizzazione - Aspetterò ...

Nessun acquirente? OK, andare avanti.

Ora che il nostro file di stringhe è stato creato, dobbiamo aggiungere la stringa a cui abbiamo fatto riferimento in precedenza - PokeMessageFormat:

// Localizable.strings "PokeMessageFormat" = "Sei stato colpito da% @";

Noterai che la nostra stringa ha lo stesso aspetto del nostro messaggio originale ma con un identificatore di formato al posto del nome. Ora, quando arriva la nuova spinta, iOS afferrerà la nostra stringa di localizzazione, inserirà il nome della persona che ci sta colpendo e mostrerà l'avviso. Viola! 10 milioni di utenti felici, proprio così.

OK OK, leggero semplificazione eccessiva. Devi ancora aggiungere localizzazioni per tutte le lingue che vuoi supportare e traduci il nostro messaggio in queste lingue. Ma le basi sono a posto - il resto lo lascio come esercizio per te, il lettore.

Suoni

Un altro ottimo modo per informare i tuoi utenti che la tua app ha nuove informazioni per loro è tramite audio. Questo può essere in aggiunta o al posto dell'avviso. Se hai intenzione di aggiungere suoni ai tuoi messaggi push, Apple ti incoraggia caldamente ad utilizzare suoni di marca - suoni che possono facilmente essere distinti come appartenenti alla tua app. Pensa al suono predefinito di SMS o e-mail: sai senza nemmeno capire cosa significano e a quali app appartengono. Questo è esattamente quello che vuoi che accada con i tuoi suoni.

Come indicato nella prima parte, i suoni devono essere inclusi nel pacchetto della tua app e devono essere in uno dei seguenti formati:

  • PCM lineare
  • MA4
  • μLaw
  • una legge

Se il tuo suono non è già in uno dei formati supportati, dovrai convertirlo con un'utilità audio. La documentazione per gli sviluppatori di Apple ha alcuni suggerimenti sulla conversione di file audio tramite la riga di comando.

Dopo aver aggiunto il nostro file audio opportunamente formattato al nostro progetto Xcode, siamo pronti ad aggiornare di nuovo il carico utile:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf", "device_tokens": [ "il token del dispositivo va qui"]

"suono" specifica il nome del nostro file audio personalizzato. Come notato dalla documentazione di Apple:

Se il file audio non esiste o il valore predefinito è specificato come valore, viene riprodotto il suono di avviso predefinito.

E con questi pochi e semplici cambiamenti ora abbiamo il suono!

Ulteriori informazioni sul carico utile

Il nostro payload di notifica push non è limitato alle sole informazioni specificate da Apple. Al di fuori del dizionario "aps" riservato, possiamo aggiungere qualsiasi altro JSON valido al nostro payload, fino al massimo di 256 byte. Nella nostra app Poke, ad esempio, potremmo includere l'id per il poke che è stato inviato, in modo che possiamo visualizzare più informazioni a riguardo se il destinatario sceglie di toccare "Visualizza" e apre l'app:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf", "device_tokens": [ "il token del dispositivo va qui"], "poke_id": "1234567890"

Riceviamo "poke_id" come parte delle opzioni di lancio nel nostro delegato dell'app:

// in PokeAppDelegate.m - Applicazione (BOOL): l'applicazione (UIApplication *) ha fattoFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Registra notifiche di avviso [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert]; // Controlla le informazioni di notifica push NSDictionary * pushInfo = [launchOptions valueForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; if (pushInfo) // TODO: estrai le informazioni del poke dal nostro server e aggiorna l'interfaccia utente per visualizzarlo NSLog (@ "Ecco il nostro id poke:% @", [pushInfo valueForKey: @ "poke_id"]);  // Aggiungi la vista del controller di visualizzazione alla finestra e visualizza. [window addSubview: viewController.view]; [window makeKeyAndVisible]; return YES;  

Come promemoria, i dati degli utenti sensibili dovrebbero mai essere inviato come parte di un carico utile di notifica push.

Tranquillo

Infine, c'è una caratteristica del servizio push di Urban Airship che vorrei mostrare: Quiet Time. Dai loro documenti dello sviluppatore:

Spesso gli utenti finali non vogliono ricevere notifiche push in determinati momenti, ad esempio quando dormono. Urban Airship supporta l'impostazione di un "tempo di tranquillità" tramite l'API di registrazione del dispositivo durante il quale nessuna notifica push per la tua app verrà inviata a quel token del dispositivo. Le notifiche push contenenti un aggiornamento del badge verranno comunque inviate durante il periodo di silenzio, ma l'avviso e il suono verranno rimossi.

Data la natura della nostra app, non penso sia irragionevole supporre che alcuni utenti potrebbero non voler essere scoperti alle tre del mattino e fare esplodere il nostro forte suono di marca. Quindi, procederemo e implementeremo rapidamente questa funzione.

Per fare ciò, tutto ciò che dobbiamo fare è aggiornare la chiamata di registrazione del dispositivo dell'app con Urban Airship. Eccolo nella sua forma originale:

// in PokeAppDelegate.m - (void) application: (applicazione UIApplication *) didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Passa il token a Urban Airship ** // Converti il ​​token in una stringa esadecimale e assicurati che sia tutto maiuscolo NSMutableString * tokenString = [NSMutableString stringWithString: [[deviceToken description] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" opzioni: 0 range: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" opzioni: 0 range: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Crea NSURL per la richiesta NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Crea la richiesta di registrazione NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alloc] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // E spegnerlo NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [inizio connessione];  

Abbiamo bisogno di passare l'ora di inizio e di fine così come il fuso orario a Dirigibile Urbano. Andiamo con i loro valori di esempio di 22:00 come ora di inizio (cioè 10:00 PM) e 8:00 (AM) come ora di fine. Prenderemo l'id del fuso orario corrente dell'utente dal sistema.

// in PokeAppDelegate.m - (void) application: (applicazione UIApplication *) didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Passa il token a Urban Airship ** // Converti il ​​token in una stringa esadecimale e assicurati che sia tutto maiuscolo NSMutableString * tokenString = [NSMutableString stringWithString: [[deviceToken description] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" opzioni: 0 range: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" opzioni: 0 range: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Crea NSURL per la richiesta NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Crea la richiesta di registrazione NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alloc] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Crea il corpo della richiesta JSON // Nota: non devi MAI generare manualmente JSON in questo modo ... NSString * startTime = @ "22:00"; NSString * endTime = @ "8:00"; NSString * timezoneName = [[NSTimeZone localTimeZone] name]; NSString * body = [NSString stringWithFormat: @ "\" quiettime \ ": \" start \ ": \"% @ \ ", \" end \ ": \"% @ \ "," \ "\" tz \ ": \"% @ \ "", startTime, endTime, timezoneName]; // Aggiungilo alla richiesta NSData * bodyData = [body dataUsingEncoding: NSUTF8StringEncoding]; [registrationRequest setHTTPBody: bodyData]; [registrationRequest setValue: [NSString stringWithFormat: @ "% u", [lunghezza bodyData]] perHTTPHeaderField: @ "Content-Length"]; [registrationRequest setValue: @ "application / json" forHTTPHeaderField: @ "Content-Type"]; // E via ... NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [inizio connessione];  

E ora i nostri utenti non saranno tenuti svegli da un bombardamento di 3 A.M. poke.

Bene, questo avvolge questa serie sull'uso delle funzionalità di notifica push di iOS 3.0+. Spero che ti abbia dato una buona panoramica del funzionamento del servizio e dei passaggi di base necessari per iniziare a sfruttarlo nella tua app. Se hai domande o rimani bloccato su qualcosa, fammelo sapere nei commenti.