Bygg en iOS SDK Poke App med APNS - Del 3

Denne opplæringen er den siste i en tre-delt serie om å jobbe med push-varslingsfunksjonene i iOS 3.0 +. Det fokuserer på å bruke noen av de mer forseggjorte funksjonene i Apples Push Notification Service (APNS). Denne avgiften bygger på koden vi opprettet i første og andre opplæringsprogrammer, så vær sikker på at du leser dem først hvis du ikke allerede har.

lokalisering

På slutten av siste avdrag sendte vi vår første push til vår app. Det var ikke noe fancy. Bare en enkel varslingsmelding: "Du har blitt stakk av Tyler." Det tar ikke et geni å innse at denne meldingen er på engelsk, men hva ville ha skjedd hvis vi hadde sendt det ut til de millioner av mennesker som bruker vår app rundt om i verden? Sjansene er at noen av dem ikke ville ha forstått hva vi sendte. Det er der lokalisering kommer inn.

Merk: For en grundig forklaring av lokalisering og hvordan den fungerer på iOS, se Apples utvikler dokumentasjon. Jeg kommer til å anta at du forstår det grunnleggende ...

Endringer i push

Se igjen på Urban Airship Test Push Notifications konsoll:

Du vil legge merke til at når du endrer innholdet i de øvre feltene, oppdaterer den JSON i feltet "Lastbelastning". Du kan også manuelt justere JSON, som er hva vi skal gjøre nå.

Her er den opprinnelige JSON, formatert for lesbarhet:

"aps": "alert": "Du har blitt poked av Tyler", "device_tokens": ["din enhetstoken går her"]

Ordboken "aps" er en nødvendig del av enhver APNS JSON nyttelast. Det forteller iOS hva jeg skal gjøre med varselet. For øyeblikket har "advarsel" -tasten en strengverdi ("Du har blitt poked [...]"), men APNS tillater også en ordlisteverdi for denne nøkkelen. Du må bruke en ordbok hvis du vil støtte lokalisering.

For varsler kan du lokalisere meldingslegemet samt handleknappens navn som vises i varselet (som standard er "Vis"). I tillegg kan du enten sende den lokaliserte meldingen kroppen allerede som en del av meldingen nyttelast eller du kan bruke pre-localized strenger i app bunten. Vi skal gjøre sistnevnte.

La oss oppdatere "varsel" -tasten i "aps" -ordboken i nyttelastet med de nødvendige feltene:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "device_tokens": ["din enhetstoken går her"]

"loc-key" angir navnet på en streng i vår Localizable.strings-fil i vårt apppakke. Eventuelle formatspecifikatorer i vårt format streng (PokeMessageFormat) vil bli erstattet av strengene i "loc-args". Så nå, i stedet for å vise "Du har blitt tøyd av Tyler," vil iOS ta tak i PokeMessageFormat-lokalisert streng fra vår pakke, sette Tyler på riktig sted og vise lokalisert melding i varselet. Nå trenger vi bare å oppdatere appen vår for å støtte lokalisering.

Endringer i appen

Åpne appens prosjekt i Xcode. Med "Ressurser" valgt fra panelet Grupper og filer til venstre, velg "Ny fil ..." fra Fil-menyen. Under Mac OS X: Ressursavsnitt, velg "Strings File" og klikk "Next".

Navngi filen Localizable.strings og klikk "Finish."

Nå som filen er opprettet, må vi gjøre den lokaliserbar. Velg filen fra panelet Grupper og filer til venstre og klikk på "Info" i verktøylinjen (eller Kommando-I). Helt nederst i kategorien Generell, bør det være en knapp med tittelen "Lag fil lokaliserbar". Trykk på det. Deretter lukker Info-vinduet.

Selv om det kan virke som voodoo magi, er alt som denne knappen gjør, opprett en engelsk.lproj-mappe i prosjektkatalogen din (hvis nødvendig) og flytt filen Localizable.strings inne i den. Igjen, hvis du vil ha mer informasjon om "Hvorfor?" av dette, les Apples utvikler dokumentasjon om internasjonalisering og lokalisering - jeg venter ...

Nei takers? OK, fortsetter.

Nå som vår strengfil er opprettet, må vi legge til strengen vi refererte tidligere - PokeMessageFormat:

// Localizable.strings "PokeMessageFormat" = "Du har blitt poked av% ​​@";

Du ser at strengene våre ser omtrent like ut som vår opprinnelige melding, men med et format spesifiserer i stedet for navnet. Nå, når den nye pushen kommer, vil iOS ta tak i vår lokale poke streng, sett inn navnet på personen som pokker oss, og vis varselet. Viola! 10 millioner glade brukere, akkurat slik.

OK, OK, svak forenkling. Du må fortsatt legge til lokaliseringer for alle språkene du vil støtte og oversett vår pokemelding til disse språkene. Men det grunnleggende er på plass - resten jeg forlater som en øvelse for deg, leseren.

lyder

En annen flott måte å varsle brukerne om at appen din har ny informasjon til dem, er via lyd. Dette kan enten være i tillegg til eller i stedet for varselet. Hvis du planlegger å legge lyd til push-meldingene dine, oppfordrer Apple deg sterkt til å bruke merkede lyder - lyder som lett kan skille seg ut som tilhørende appen din. Tenk på standard SMS eller e-post lyder - du vet uten å se på hva de betyr og hvilke apps de tilhører. Det er akkurat det du vil ha skje med lydene dine.

Som nevnt i første del, må lydene være inkludert i apppakken din og må være i ett av følgende format:

  • Lineær PCM
  • MA4
  • μLaw
  • en lov

Hvis lyden din ikke er i et av de støttede formatene allerede, må du bruke et lydverktøy for å konvertere det. Apples utvikler dokumentasjon har noen poeng på å konvertere lydfiler via kommandolinjen.

Etter å ha lagt til vår passende formaterte lydfil til vårt Xcode-prosjekt, er vi klar til å oppdatere nyttelasten igjen:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "lyd": "myAwesomeSound.caf", "device_tokens" "din enhetstoken går her"]

"lyd" angir navnet på vår egendefinerte lydfil. Som nevnt av Apples dokumentasjon:

Hvis lydfilen ikke eksisterer eller standard er angitt som verdien, spilles standardvarslingslyden.

Og med disse få, enkle endringene har vi nå lyd!

Ekstra nyttelastinformasjon

Våre push notification nyttelast er ikke begrenset til bare info angitt av Apple. Utenfor den reserverte ordboken "aps", kan vi legge til noe annet gyldig JSON til vår nyttelast, opp til maksimal 256-byte. I vår Poke-app kan vi for eksempel inkludere ID-nummeret for pokeet som ble sendt, slik at vi kan vise mer informasjon om det hvis mottakeren velger å trykke "Vis" og åpne appen:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "lyd": "myAwesomeSound.caf", "device_tokens" "din enhetstoken går her"], "poke_id": "1234567890"

Vi mottar "poke_id" som en del av lanseringsalternativene i vår appdelegate:

// i PokeAppDelegate.m - (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Registrer for varslingsvarsler [søknadsregisterForRemoteNotificationTypes: UIRemoteNotificationTypeAlert]; // Sjekk for push notification info NSDictionary * pushInfo = [launchOptions valueForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; hvis (pushInfo) // TODO: Trekk pokeets informasjon fra serveren vår og oppdatere brukergrensesnittet for å vise det NSLog (@ "Her er vårt poke id:% @", [pushInfo valueForKey: @ "poke_id"]);  // Legg til visningskontrollørens visning til vinduet og skjermen. [window addSubview: viewController.view]; [window makeKeyAndVisible]; returnere JA;  

Som en påminnelse, bør sensitive brukerdata aldri sendes som en del av en push notification nyttelast.

Stilletid

Endelig er det en funksjon i Urban Airships push service som jeg vil gjerne vise: Stille Time. Fra utviklerens dokumenter:

Ofte vil sluttbrukerne ikke motta trykkmeldinger ved bestemte tider, for eksempel når de sover. Urban Airship støtter å sette en "stille tid" via enhetsregistreringsgrensesnittet i løpet av hvilken tid ingen push-varslinger for appen din vil bli levert til den aktuelle enheten. Push-meldinger som inneholder en badgeoppdatering vil fremdeles bli sendt under stille tid, men alarmen og lyden blir fjernet.

Gitt naturen til vår app, tror jeg ikke det er urimelig å anta at noen brukere kanskje ikke vil bli spilt på tre om morgenen og få vår høye, merkede lyd gå av. Så, vi skal fortsette og implementere denne funksjonen raskt.

For å gjøre det, er alt vi trenger å gjøre, oppdatering av appens enhetsregistreringsanrop med Urban Airship. Her er det i sin opprinnelige form:

// i PokeAppDelegate.m - (ugyldig) søknad: (UIApplication *) søknad didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Pass token til Urban Airship ** // Konverter token til en hex streng og sørg for at det er alle kapsler NSMutableString * tokenString = [NSMutableString stringWithString: [[deviceToken description] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" alternativer: 0 rekkevidde: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" alternativer: 0 rekkevidde: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Opprett NSURL for forespørselen NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Opprett registreringsforespørselen NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alloc] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Og brann den av NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [tilkoblingsstart];  

Vi må passere start og stopp tid samt tidszonen til Urban Airship. La oss gå med sine eksempler på 22:00 som starttidspunkt (dvs. 10:00) og 8:00 (AM) som stopptid. Vi tar tak i iden til brukerens nåværende tidssone fra systemet.

// i PokeAppDelegate.m - (ugyldig) søknad: (UIApplication *) søknad didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Pass token til Urban Airship ** // Konverter token til en hex streng og sørg for at det er alle kapsler NSMutableString * tokenString = [NSMutableString stringWithString: [[deviceToken description] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" alternativer: 0 rekkevidde: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" alternativer: 0 rekkevidde: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Opprett NSURL for forespørselen NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Opprett registreringsforespørselen NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alloc] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Opprett JSON-anmodningsorganet // Merk: Du bør ALDRI generere JSON manuelt som dette ... NSString * startTime = @ "22:00"; NSString * endTime = @ "8:00"; NSString * timezoneName = [[NSTimeZone localTimeZone] navn]; NSString * body = [NSString stringWithFormat: @ "\" quiettime \ ": \" start \ ": \"% @ \ ", \" end \ ": \"% @ \ "," \ "\" tz \ ": \"% @ \ "", startTime, endTime, tidszonnavn]; // Legg til det på forespørselen NSData * bodyData = [body dataUsingEncoding: NSUTF8StringEncoding]; [registreringRequest settHTTPBody: bodyData]; [registrationRequest setValue: [NSString stringWithFormat: @ "% u", [bodyData length]] forHTTPHeaderField: @ "Content-Length"]; [registrationRequest setValue: @ "application / json" forHTTPHeaderField: @ "Content-Type"]; // Og bort det går ... NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [tilkoblingsstart];  

Og nå vil våre brukere ikke bli våken fra et bombardement på 3 A.M. pokes.

Vel, det bryter opp denne serien om bruk av Push Notification-funksjonene til iOS 3.0 +. Jeg håper at den ga deg en god oversikt over hvordan tjenesten fungerer og de grunnleggende trinnene som kreves for å begynne å utnytte den i appen din. Hvis du har noen spørsmål eller sitter fast på noe, gi meg beskjed i kommentarene.