Een iOS SDK Poke -app bouwen met APNS - deel 3

Deze tutorial is de laatste in een driedelige serie over het werken met de push-notificatiefuncties van iOS 3.0+. Het richt zich op het gebruik van enkele van de meer uitgebreide functies van Apple's Push Notification Service (APNS). Deze aflevering bouwt voort op de code die we hebben gemaakt in de eerste en tweede zelfstudie, dus lees deze als eerste als je dat nog niet hebt gedaan.

Localization

Aan het einde van de laatste aflevering hebben we onze eerste push naar onze app gestuurd. Het was niets bijzonders. Gewoon een eenvoudig waarschuwingsbericht: "U bent gepord door Tyler." Er is geen genie voor nodig om te beseffen dat deze boodschap in het Engels is, maar wat zou er gebeurd zijn als we het hadden uitgezonden naar de miljoenen mensen die onze app over de hele wereld gebruikten? De kans is groot dat sommigen van hen niet begrepen hebben wat we verzonden hebben. Dat is waar lokalisatie binnenkomt.

Opmerking: voor een uitgebreide uitleg over lokalisatie en hoe het werkt op iOS, raadpleegt u de documentatie van Apple voor ontwikkelaars. Ik ga ervan uit dat je de basis begrijpt ...

Wijzigingen in de push

Kijk nog eens naar de Test Push Notifications-console van Urban Airship:

U zult merken dat wanneer u de inhoud van de bovenste velden wijzigt, het JSON wordt bijgewerkt in het veld "Payload". U kunt de JSON ook handmatig aanpassen, wat we nu gaan doen.

Hier is de originele JSON, opnieuw geformatteerd voor de leesbaarheid:

"aps": "alert": "U bent geprovoceerd door Tyler", "device_tokens": ["uw apparaattoken gaat hier naartoe"]

Het woordenboek "aps" is een verplicht onderdeel van elke APNS JSON-payload. Het vertelt iOS wat te doen met de melding. Momenteel heeft de "alert" -sleutel een stringwaarde ("U bent gepord [...]"), maar APNS biedt ook een woordenboekwaarde voor deze sleutel. U moet een woordenboek gebruiken als u de lokalisatie wilt ondersteunen.

Voor meldingen kunt u de berichttekst en de naam van de actieknop die op de waarschuwing verschijnt (standaard "Weergave") lokaliseren. Bovendien kunt u de gelokaliseerde berichttekst al verzenden als onderdeel van de payload van het bericht of u kunt vooraf gelokaliseerde strings gebruiken in uw app-bundel. We gaan het laatste doen.

Laten we de "alert" -sleutel in het woordenboek "aps" bijwerken in de payload met de nodige velden:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "device_tokens": ["uw apparaattoken gaat hier naartoe"]

"loc-key" specificeert de naam van een string in ons Localizable.strings bestand in onze app-bundel. Alle indelingsspecificaties in onze opmaakreeks (PokeMessageFormat) worden vervangen door de tekenreeksen in "loc-args." Dus nu, in plaats van 'Je bent door Tyler gepord', zal iOS de gelokaliseerde PokeMessageFormat-reeks uit onze bundel halen, Tyler op de juiste plaats plaatsen en het gelokaliseerde bericht in de waarschuwing weergeven. Nu moeten we gewoon onze app updaten om de lokalisatie te ondersteunen.

Wijzigingen in de app

Open het project van de app in Xcode. Selecteer "Resources" in het deelvenster Groepen en bestanden aan de linkerkant en selecteer "Nieuw bestand ..." in het menu Bestand. Selecteer onder het gedeelte Mac OS X: Resource "Strings File" en klik op "Volgende".

Noem het bestand Localizable.strings en klik op "Finish".

Nu het bestand is gemaakt, moeten we het lokaliseren. Selecteer het bestand in het deelvenster Groepen en bestanden aan de linkerkant en klik op "Info" in de werkbalk (of Command-I). Helemaal onder aan het tabblad Algemeen moet er een knop zijn met de titel 'Maak bestand lokaliseerbaar'. Klik Het. Sluit vervolgens het Info-venster.

Hoewel het lijkt op voodoo-magie, is het enige dat deze knop doet om een ​​map English.lproj aan te maken in je projectdirectory (indien nodig) en daarin het bestand Localizable.strings te verplaatsen. Nogmaals, als u meer informatie wilt over het "Waarom?" Lees hier de ontwikkelaarsdocumentatie van Apple over internationalisering en lokalisatie - ik zal wachten ...

Geen afnemers? OK, verder gaan.

Nu ons stringsbestand is gemaakt, moeten we de string toevoegen waarnaar we eerder hebben verwezen - PokeMessageFormat:

// Localizable.strings "PokeMessageFormat" = "U bent gepest door% @";

U zult opmerken dat onze string er ongeveer hetzelfde uitziet als onze originele boodschap, maar met een formaatspecificatie in plaats van de naam. Nu, wanneer de nieuwe push binnenkomt, grijpt iOS onze gelokaliseerde snaarreeks, voegt de naam van de persoon in die ons opjaagt en geeft de waarschuwing weer. Altviool! 10 miljoen gelukkige gebruikers, zomaar.

OKE OKE, gering oversimplificatie. U moet nog steeds lokalisaties toevoegen voor alle talen die u wilt ondersteunen en vertaal onze poke-boodschap in die talen. Maar de basis is aanwezig - de rest laat ik als een oefening voor u, de lezer.

Sounds

Een andere geweldige manier om uw gebruikers te laten weten dat uw app nieuwe informatie voor hen heeft, is via geluid. Dit kan een aanvulling zijn op of in plaats van de waarschuwing. Als u van plan bent geluid toe te voegen aan uw pushberichten, moedigt Apple u sterk aan om merkgeluiden te gebruiken - geluiden die gemakkelijk te onderscheiden zijn als behorend tot uw app. Denk aan de standaard SMS- of e-mailgeluiden - dat weet je, zelfs zonder te kijken wat ze bedoelen en tot welke apps ze behoren. Dat is precies wat je wilt dat er gebeurt met je geluiden.

Zoals opgemerkt in de eerste aflevering, moeten geluiden worden opgenomen in uw app-bundel en moeten ze in een van de volgende indelingen zijn:

  • Lineaire PCM
  • MA4
  • p-wet
  • een wet

Als je geluid al niet in een van de ondersteunde indelingen staat, moet je een audiotoepassing gebruiken om het te converteren. De ontwikkelaarsdocumentatie van Apple bevat enkele aanwijzingen voor het converteren van audiobestanden via de opdrachtregel.

Na het toevoegen van ons geschikt geformatteerd audiobestand aan ons Xcode-project, zijn we klaar om de payload opnieuw bij te werken:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf", "device_tokens": [ "uw apparaattoken gaat hier"]

"geluid" specificeert de naam van ons aangepaste geluidsbestand. Zoals opgemerkt door de documentatie van Apple:

Als het geluidsbestand niet bestaat of als standaardwaarde wordt opgegeven, wordt het standaard waarschuwingsgeluid afgespeeld.

En met deze paar eenvoudige veranderingen hebben we nu geluid!

Extra payload-informatie

Onze push-notificatie-payload is niet beperkt tot alleen de door Apple opgegeven informatie. Buiten het gereserveerde woordenboek 'aps' kunnen we elke andere geldige JSON aan onze payload toevoegen, tot maximaal 256 bytes. In onze Poke-app kunnen we bijvoorbeeld de ID voor de verzonden poke opnemen, zodat we er meer informatie over kunnen weergeven als de ontvanger op 'View' tikt en de app opent:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf", "device_tokens": [ "your device token goes here"], "poke_id": "1234567890"

We ontvangen de "poke_id" als onderdeel van de startopties in onze app-deelnemer:

// in PokeAppDelegate.m - (BOOL) toepassing: (UIApplication *) toepassing didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Registreren voor alarmmeldingen [toepassingsregisterForRemoteNotificationTypes: UIRemoteNotificationTypeAlert]; // Controleer of er push-notificatie-info is NSDictionary * pushInfo = [launchOptions valueForKey: UIApplicationLaunchOptionsRemoteNotificationkey]; if (pushInfo) // TODO: trek de info van de poke van onze server en update de gebruikersinterface om deze weer te geven NSLog (@ "Here's our poke id:% @", [pushInfo valueForKey: @ "poke_id"]);  // Voeg de weergave van de weergavecontroller toe aan het venster en op het scherm. [window addSubview: viewController.view]; [window makeKeyAndVisible]; terugkeer JA;  

Ter herinnering, gevoelige gebruikersgegevens zouden dat wel moeten zijn nooit worden verzonden als onderdeel van een payload.

Stilte tijd

Ten slotte is er een functie van de push-service van Urban Airship die ik graag wil laten zien: Quiet Time. Uit hun ontwikkelaardocumenten:

Vaak willen eindgebruikers op bepaalde momenten geen pushmeldingen ontvangen, bijvoorbeeld wanneer ze slapen. Urban Airship ondersteunt het instellen van een "stille tijd" via de API voor apparaatregistratie, gedurende welke tijd geen pushmeldingen voor uw app bij dat token worden afgeleverd. Pushmeldingen met een badge-update worden nog steeds verzonden tijdens stille tijd, maar de waarschuwing en het geluid worden verwijderd.

Gezien de aard van onze app, vind ik het niet onredelijk om ervan uit te gaan dat sommige gebruikers misschien niet om drie uur 's morgens willen poken en ons luide, gebrande geluid laten afgaan. Dus we gaan door en implementeren deze functie snel.

Om dit te doen, hoeven we de apparaatregistratie-oproep van onze app alleen bij Urban Airship te updaten. Hier is het in zijn oorspronkelijke vorm:

// in PokeAppDelegate.m - (ongeldige) toepassing: (UIApplication *) applicatie didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Geef het token door aan Urban Airship ** // Converteer het token naar een hex-string en zorg ervoor dat het is all caps NSMutableString * tokenString = [NSMutableString stringWithString: [[deviceToken description] hoofdletters string]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: 0 range: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: 0 range: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Maak de NSURL voor het verzoek NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Maak het registratieverzoek NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest allocation] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // En vuur het af NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [verbinding start];  

We moeten de start- en stoptijd evenals de tijdzone doorgeven aan Urban Airship. Laten we gaan met hun voorbeeldwaarden van 22:00 als starttijd (dat wil zeggen 10:00 PM) en 8:00 (AM) als de stoptijd. We pakken de ID van de huidige tijdzone van de gebruiker uit het systeem.

// in PokeAppDelegate.m - (ongeldige) toepassing: (UIApplication *) applicatie didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Geef het token door aan Urban Airship ** // Converteer het token naar een hex-string en zorg ervoor dat het is all caps NSMutableString * tokenString = [NSMutableString stringWithString: [[deviceToken description] hoofdletters string]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: 0 range: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: 0 range: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Maak de NSURL voor het verzoek NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Maak het registratieverzoek NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest allocation] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Maak de JSON-aanvraag body // Opmerking: U moet NOOIT JSON handmatig op deze manier genereren ... NSString * startTime = @ "22:00"; NSString * endTime = @ "8:00"; NSString * timezoneName = [[NSTimeZone localTimeZone] naam]; NSString * body = [NSString stringWithFormat: @ "\" quiettime \ ": \" start \ ": \"% @ \ ", \" end \ ": \"% @ \ "," \ "\" tz \ ": \"% @ \ "", startTime, EndTime, timezoneName]; // Voeg het toe aan de aanvraag NSData * bodyData = [body dataUsingEncoding: NSUTF8StringEncoding]; [registrationRequest setHTTPBody: bodyData]; [registrationRequest setValue: [NSString stringWithFormat: @ "% u", [bodyData length]] forHTTPHeaderField: @ "Content-Length"]; [registrationRequest setValue: @ "application / json" forHTTPHeaderField: @ "Content-Type"]; // En weg gaat het ... NSURLConnection * verbinding = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [verbinding start];  

En nu zullen onze gebruikers niet wakker gehouden worden van een bombardement van 3 A.M. pokes.

Welnu, dat omvat deze serie over het gebruik van de Push Notification-mogelijkheden van iOS 3.0+. Ik hoop dat dit u een goed overzicht heeft gegeven van hoe de service werkt en welke basisstappen u moet nemen om deze in uw app te gebruiken. Als je vragen hebt of ergens vastloopt, laat het me dan weten in de comments.