Construirea unui App iOS SDK Poke cu APNS - Partea 3

Acest tutorial este ultima dintr-o serie de trei părți în care se lucrează cu funcțiile de notificare push de iOS 3.0+. Se concentrează pe utilizarea unor caracteristici mai detaliate ale serviciului de notificare prin strike (APNS) al Apple. Această tranșă se bazează pe codul pe care l-am creat în primul și al doilea tutorial, așa că citiți-le mai întâi dacă nu ați făcut-o deja.

Localizare

La sfârșitul ultimei tranșe, am trimis primul nostru apel către aplicația noastră. Nu era nimic fantezist. Doar un mesaj de avertizare simplu: "Ai fost împușcat de Tyler." Nu este nevoie de un geniu pentru a realiza că acest mesaj este în limba engleză, dar ce s-ar fi întâmplat dacă l-am fi trimis la milioane de oameni care folosesc aplicația noastră din întreaga lume? Sunt șanse, unele dintre ele nu ar fi înțeles ceea ce am trimis. Aici intră localizarea.

Notă: Pentru o explicație detaliată a localizării și modul în care funcționează în iOS, consultați documentația dezvoltatorului Apple. O să presupun că înțelegi elementele de bază ...

Modificări la împingere

Uită-te din nou la testul Urban Airship Test Push Notificări consola:

Veți observa că pe măsură ce schimbați conținutul câmpurilor superioare, acesta actualizează JSON-ul în câmpul "Câmpul de sarcină". De asemenea, puteți ajusta manual JSON-ul, ceea ce vom face acum.

Iată originalul JSON, reformatat pentru lizibilitate:

"aps": "alert": "Ați fost împușcat de Tyler", "device_tokens": ["jetonul dispozitivului dvs. merge aici"]

Dicționarul "aps" este o parte necesară a oricărei sarcini utile APNS JSON. Se spune iOS ce să facă cu notificarea. În prezent, cheia "alertă" are o valoare de șir ("Ai fost poked [...]"), dar APNS permite și o valoare a dicționarului pentru această cheie. Va trebui să utilizați un dicționar dacă doriți să sprijiniți localizarea.

Pentru alerte, puteți localiza corpul mesajului, precum și numele butonului de acțiune care apare în alertă (care este implicit la "Vizualizare"). În plus, puteți trimite corpul mesajului localizat deja ca parte a încărcăturii utile sau puteți folosi șiruri pre-localizate în pachetul de aplicații. O să facem asta din urmă.

Să actualizăm cheia "alertă" din dicționarul "aps" din sarcina utilă cu câmpurile necesare:

"aps": "alert": "loc -key": "PokeMessageFormat", "loc-args": ["Tyler"], "device_tokens"

"loc-cheie" specifică numele unui șir în fișierul Localizable.strings din pachetul nostru de aplicații. Orice specificator de format în șirul format (PokeMessageFormat) va fi înlocuit cu șirurile din "loc-args". Deci, acum, în loc să afișezi "Ai fost împușcat de Tyler", iOS va prinde șirul localizat PokeMessageFormat din pachetul nostru, îl va introduce pe Tyler în locul potrivit și va afișa mesajul localizat în alertă. Acum trebuie doar să ne actualizăm aplicația pentru a sprijini localizarea.

Modificări la aplicație

Deschideți proiectul aplicației în Xcode. Dacă ați selectat "Resurse" din panoul Grupuri și fișiere din stânga, selectați "Fișier nou ..." din meniul Fișier. Sub secțiunea Mac OS X: Resurse, selectați "File Strings" și faceți clic pe "Next".

Denumiți fișierul Localizable.strings și faceți clic pe "Finish".

Acum, că fișierul este creat, trebuie să îl facem localizabil. Selectați fișierul din panoul Grupuri și fișiere din stânga și faceți clic pe "Info" din bara de instrumente (sau Command-I). În partea de jos a filei Generale, ar trebui să existe un buton intitulat "Faceți fișierul localizabil". Apasă-l. Apoi închideți fereastra Info.

Deși poate părea ca o voodoo magic, tot ce face acest buton este să creeze un director English.lproj în directorul proiectului (dacă este necesar) și să mutați fișierul Localizable.strings în el. Din nou, dacă doriți mai multe informații despre "De ce?" de aici, citiți documentația dezvoltatorului Apple privind internaționalizarea și localizarea - voi aștepta ...

Nu-i așa? OK, mergi mai departe.

Acum că fișierul nostru de fișiere a fost creat, trebuie să adăugăm șirul pe care l-am referit mai devreme - PokeMessageFormat:

// Localizable.strings "PokeMessageFormat" = "Ați fost bătuți de% @";

Veți observa că șirul nostru arată la fel ca mesajul nostru original, dar cu un specificator de format în locul numelui. Acum, când apare noua împingere, iOS va atrage șirul de coșuri localizate, va introduce numele persoanei care ne-a atacat și vom afișa alerta. VIOLA! 10 milioane de utilizatori fericiți, la fel.

BINE BINE, ușor suprasimplificare. Trebuie să adăugați localizări pentru toate limbile pe care doriți să le acceptați și traduce mesajul nostru în aceste limbi. Dar elementele de bază sunt în loc - restul pe care-l părăsesc ca un exercițiu pentru tine, cititorul.

Sunete

O altă modalitate excelentă de a notifica utilizatorilor că aplicația dvs. are informații noi pentru ei este via sunet. Acest lucru poate fi în plus față de sau în locul alertei. Dacă intenționați să adăugați sunet la mesajele dvs. push, Apple vă încurajează cu tărie să utilizați sunete de marcă - sunete care pot fi ușor diferențiate ca aparținând aplicației dvs. Gândiți-vă la sunetele implicite prin SMS sau e-mail - știți fără să arătați chiar ce înseamnă acestea și la ce aplicații aparțin. Asta e exact ceea ce vrei să se întâmple cu sunetele tale.

După cum sa menționat în prima tranșă, sunetele trebuie să fie incluse în pachetul de aplicații și trebuie să fie în unul din următoarele formate:

  • Linear PCM
  • MA4
  • μLaw
  • o lege

Dacă sunetul dvs. nu este deja în unul dintre formatele acceptate, va trebui să utilizați un utilitar audio pentru ao converti. Documentația dezvoltatorului de la Apple are unele indicii privind conversia fișierelor audio prin linia de comandă.

După adăugarea fișierului audio format în mod corespunzător în proiectul nostru Xcode, suntem gata să actualizăm din nou încărcătura:

"alert": "loc -key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf" "jetonul dispozitivului dvs. merge aici"]

"sunet" specifică numele fișierului nostru personalizat de sunet. După cum se menționează în documentația Apple:

Dacă fișierul de sunet nu există sau valoarea implicită este specificată ca valoare, este redat sunetul de alertă implicit.

Și odată cu aceste schimbări simple, avem acum sunet!

Informații despre încărcături suplimentare

Noastra de sarcină utilă notificare push nu se limitează doar la informațiile specificate de Apple. În afara dicționarului rezervat "aps", putem adăuga orice alt JSON valid pentru sarcina utilă, până la maximul de 256 de octeți. În aplicația noastră Poke, de exemplu, am putea include id-ul pentru punga trimisă, astfel încât să putem afișa mai multe informații despre el dacă receptorul alege să atingă "View" și să deschidă aplicația:

"alert": "loc -key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf" "jetonul dispozitivului dvs."], "poke_id": "1234567890"

Primim "poke_id" ca parte a opțiunilor de lansare în delegatul nostru de aplicații:

// în aplicația PokeAppDelegate.m - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Înregistrați pentru notificări de alertă [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert]; // Verificați pentru informații de notificare push NSDictionary * pushInfo = [launchOptions valueForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; if (pushInfo) // TODO: Trageți informații despre server din serverul nostru și actualizați interfața utilizator pentru a-l afișa pe NSLog (@ "Aici este codul nostru:% @", [pushInfo valueForKey: @ poke_id]);  // Adăugați vizualizarea controlerului de vedere la fereastră și afișaj. [fereastra addSubview: viewController.view]; [fereastra makeKeyAndVisible]; reveniți DA;  

Ca o reamintire, datele de utilizator sensibile ar trebui nu să fie trimise ca parte a unei sarcini utile de notificare push.

Timp liniștit

În cele din urmă, există o caracteristică a serviciului de împingere Urban Airship pe care aș vrea să-l arăt: Timp liniștit. Din docs-ul dezvoltatorului:

Adesea, utilizatorii finali nu doresc să primească notificări push în anumite momente, cum ar fi atunci când sunt adormiți. Urban Airship acceptă setarea unui "interval de timp liniștit" prin API-ul de înregistrare a dispozitivului, timp în care nu vor fi transmise notificări push pentru aplicația dvs. la jetonul respectiv. Comunicările de notificare care conțin o actualizare a insignei vor fi în continuare trimise în timpul liniștit, dar alerta și sunetul vor fi eliminate.

Având în vedere natura aplicației noastre, nu cred că este nerezonabil să presupunem că unii utilizatori ar putea să nu vrea să se dărâme la ora trei dimineața și să aibă sunetul tare și marcat. Deci, vom continua și vom implementa rapid această caracteristică.

Pentru a face acest lucru, trebuie doar să actualizăm convorbirea de înregistrare a dispozitivului cu dispozitivul Urban Airship. Aici este în forma sa originală:

// în aplicația PokeAppDelegate.m - (void): aplicație (UIApplication *) didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Treceți token-ul la Urban Airship ** // Convertiți tokenul la un șir hexagonal și asigurați-vă că este toate capacele NSMutableString * tokenString = [NSMutableString șirWithString: [[deviceToken description] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" cuString: @ "" opțiuni: 0 interval: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" cuString: @ "" opțiuni: 0 interval: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Creați NSURL pentru cererea NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString șirWithFormat: urlFormat, tokenString]]; // Creați cererea de înregistrare NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alocare] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Și declanșați conexiunea NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [start conexiune];  

Trebuie să trecem timpul de începere și oprire, precum și fusul orar la Urban Airship. Să mergem cu valorile lor de exemplu de la 22:00 ca ora de începere (adică ora 22:00) și 8:00 (AM) ca timp de oprire. Vom lua din sistem ID-ul fusului orar curent al utilizatorului.

// în aplicația PokeAppDelegate.m - (void): aplicație (UIApplication *) didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Treceți token-ul la Urban Airship ** // Convertiți tokenul la un șir hexagonal și asigurați-vă că este toate capacele NSMutableString * tokenString = [NSMutableString șirWithString: [[deviceToken description] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" cuString: @ "" opțiuni: 0 interval: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" cuString: @ "" opțiuni: 0 interval: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Creați NSURL pentru cererea NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString șirWithFormat: urlFormat, tokenString]]; // Creați cererea de înregistrare NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alocare] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Crearea corpului cererii JSON // Nota: NU trebuie sa generati NICIODAT JSON manual asa ca ... NSString * startTime = @ "22:00"; NSString * endTime = @ "8:00"; NSString * timezoneName = nume [NSTimeZone localTimeZone]; NSString * body = [NSString stringWithFormat: @ "\" siletime \ ": \" start \ ": \"% @ \ " tz \ ": \"% @ \ "", startTime, endTime, timezoneName]; // Adăugați-l la cerere NSData * bodyData = [data corpuluiUsingEncoding: NSUTF8StringEncoding]; [registrationRequest setHTTPBody: bodyData]; [registrationRequest setValue: [NSString șirWithFormat: @ "% u", [bodyData length]] pentruHTTPHeaderField: @ "Content-Length"]; [registrationRequest setValue: @ "application / json" pentruHTTPHeaderField: @ "Content-Type"]; // Și departe merge ... NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [start conexiune];  

Și acum utilizatorii noștri nu vor fi păstrați treaz de la un bombardament de 3 A.M. Înghiontelile.

Ei bine, asta împachetează această serie cu ajutorul capabilităților Push Notification de iOS 3.0+. Sper că vă oferă o imagine de ansamblu asupra modului în care funcționează serviciul și despre etapele de bază necesare pentru a începe să îl utilizați în aplicația dvs. Dacă aveți întrebări sau vă rămâneți blocat, anunțați-ne în comentarii.

Cod