Web-tilgjengelige APIer gir et vell av ressurser for å utvide funksjonaliteten til iPhone-appene dine. Disse APIene pleier å bli konsumert i to primære dataformater: XML og JSON. IPhone SDK har innebygd støtte for XML-parsing, og dette vil bli dekket i en egen opplæring. I denne opplæringen vil vi fokusere på å legge til JSON-støtte til iOS-applikasjonene din ved å demonstrere hvordan du lager en Twitter-leserklient-app.
JSON Framework er et ekstremt populært rammeverk. Den brukes til å drive en stor del av de vanlige appene på App Store, inkludert Facebook-appen, Google Maps-appen og stort sett hver eneste Twitter-klient der ute.
Det er et par grunner til å velge JSON over XML. Den primære grunnen til at JSON foretrekkes, er at JSON-filer generelt er mindre i filstørrelse enn deres XML-kolleger, og dette resulterer naturlig i mindre belastetid. En annen grunn verdt å vurdere er at Apples Push Notification-system fungerer best med JSON nyttelast.
Å legge til rammen er enkel. Du trenger bare å dra filene inn i prosjektet ditt. Det er et alternativ å knytte biblioteket til prosjektet ditt, men det alternativet er nå utdatert og ikke støttet.
#import "JSON.h"
inn i kildefilene der du skal bruke rammen.
Følgende er en prøve JSON-melding som representerer hva en personobjekt kan se ut som:
"firstName": "John", "LastName": "Smith", "alder": 25, "adresse": "streetAddress": "21 2nd Street", "city": "New York" : "NY", "postkode": "10021", "telefonnummer": ["type": "hjem", "nummer": "212 555-1234", "type": "faks" nummer ":" 646 555-4567 "]
For å analysere ovenstående legger vi først inn JSON-meldingen til en NSString:
NSString * jsonString = [[NSString alloker] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @ "data" ofType: @ "json"] koding: NSUTF8StringEncoding error: & error];
Fra å se på JSON-meldingen kan vi se at dataene er innkapslet med begge parentesene (f.eks. [] ) og seler (f.eks. ). Brakettene er dataregister og braces er ordbøker av data. Som du kan se, er vi i stand til å nekke arrays av ordbøker, og ordboksobjekter kan inneholde arrays for flere verdier.
I eksemplet ovenfor har vi en ordbok for kontakt med nøkler som fornavn, etternavn, etc. Adressetasten peker på en annen ordbok som inneholder sine egne nøkkelverdier. Telefonnummer-nøkkelen i ordboken inneholder en rekke ordbøker.
For å analysere en matrise bruker vi:
NSArray * results = [jsonString JSONValue];
For å analysere en ordbok bruker vi:
NSDictionary * ordbok = [jsonString JSONValue]; NSArray * keys = [ordbok allKeys]; // tastene for ordboken din
Velg den du trenger basert på rotobjektet ditt. Hvis for eksempel API-en din returnerer en liste over kontakter, vil du få tilbake en ordbok med kontakter med ordbøker. På samme måte, hvis du ber om en twitter tidslinje, får du tilbake en rekke tweets hvor hver tweet er en ordbok.
Å lage en JSON-streng er veldig enkel og grei. Du lager enten et NSDictionary med de riktige tastene og verdiene eller en NSArray med listen over objekter. Denne prosessen er ganske lik den hvordan vi analyserte JSON i det forrige trinnet.
Du vil opprette en ordbok med dataene dine.
NSDictionary * contactData = [NSDictionary DictionaryWithObjectsAndKeys: _titleField.text, @ "title", _summaryField.text, @ "sammendrag", _urlField.text, @ "url", _phoneField.text, @ "phone", _bdayField.text, @ " bursdag ", _addrField.text, @" adresse ", null);
Legg til din nyopprettede datalogg til sin klasse
NSDictionary * finalData = [NSDictionary DictionaryWithObject: contactData forKey: @ "contact"];
Deretter genererer JSON-representasjonen av klasselisten din.
NSString * newJSON = [finalData JSONRepresentation];
Du kan også lage dine arrays og hekker ordbøker eller arrays tilsvarende.
Merk: Det er ingen metode i JSON-rammeverket som vil validere om en melding er gyldig JSON.
La oss lage en enkel iPhone-app som viser en liste over de siste 5 tweets som inneholder mobtuts.
Vi skal bruke Twitter Search API for enkelhet fordi det ikke krever godkjenning eller autorisasjon.
Nettadressen til vår forespørsel er:
http://search.twitter.com/search.json?q=mobtuts&result_type=recent
Dette vil returnere til oss et ordbokresultat som inneholder en rekke tweets.
For å gjøre livet litt lettere, la oss konsentrere oss om bare brukerens profilbilde, tweetteksten og brukerens twitternavn.
En enkelt resulterende tweet ser slik ut:
"profile_image_url": "http://a3.twimg.com/profile_images/949941117/zucker_normal.jpg", "created_at": "torsdag 10 juni 2010 03:54:22 +0000", "from_user": "mariacarol "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: Hvordan installere Android 2.2 Froyo på iPhone http://bit.ly/c8kBb6 " "id": 15824617764, "from_user_id": 311442 "geo": null, "iso_language_code": "en", "source": "Seesmic", "profile_image_url": "http://a1.twimg.com /profile_images/655595496/retro9_normal.gif","created_at":"Thu, 10 Jun 2010 03:52:28 +0000 "," from_user ":" cead22 "," metadata ": " result_type ":" recent " , "to_user_id": null, "text": "Quiero un # iPhone4 con #FroYo - Slik installerer du Android 2.2 Froyo på iPhone http://bit.ly/c8kBb6 (@mobtuts)", "id": 15824510273, "from_user_id": 34036310, "geo": null, "iso_language_code": "no", "source": "Twitter for BlackBerry \ u00ae", "profile_image_url": "http://a1.twimg.com/profile_images /769690946/mobiletuts_icon_normal.png","created_at":"Thu, 10 Jun 2010 03:45:51 +0000 "," from_user ":" mobtuts "," mobtuts ", "metadata": "result_type": "recent", "to_user_id": null, "text": "Abonner på @mobtuts ukentlige podcast nå! Velg RSS http://bit.ly/9LMbGX eller iTunes http://bit.ly/bq0QMC","id":15824135971,"from_user_id":104427899,"geo":null,"iso_language_code":"en ", "kilde": "HootSuite", "profile_image_url": "http://a1.twimg.com/profile_images/63581538/tutsplus_normal.jpg", "created_at": "torsdag 10 juni 2010 03:25:00 + 0000 "," from_user ":" tutsplus "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" Abonner på @mobtuts ukentlige podcast nå! Velg RSS http://bit.ly/9LMbGX eller iTunes http://bit.ly/bq0QMC","id":15822900558,"from_user_id":2295627,"geo":null,"iso_language_code":"en ", "kilde": "TweetDeck", "profile_image_url": "http://a1.twimg.com/profile_images/234225566/illustration_normal.jpg", "created_at": "torsdag 10 juni 2010 03:22:33 + 0000 "," from_user ":" GreatTwitTips "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: RT @berryizm_feeds: 5 BlackBerry Theme Developer Tips fra MMMOOO et BlackBerry-tema og app dev comp ... http://bit.ly/agf0ND","id":15822755393,"from_user_id":19637346,"geo":null,"iso_language_code":"en","source ": "twitter"
Vi kan se at vi leter etter "profile_image_url", "from_user" og "text" -tastene for appen vår.
La oss lage en enkel JSON Parser og gjøre forespørselen fra API.
Twitter_SearchAppDelegate.h
#importere@class Twitter_SearchViewController; @interface Twitter_SearchAppDelegate: NSObject UIWindow * vindu; NSMutableData * responseData; Twitter_SearchViewController * viewController; @property (nonatomic, behold) IBOutlet UIWindow * vindu; @property (nonatomic, behold) IBOutlet Twitter_SearchViewController * viewController; @slutt
Nå legger vi til JSON-rammen til importerklæringene.
Twitter_SearchAppDelegate.m
#import "JSON.h"
Herfra vil vi modifisere didFinishLaunchingWithOptions-metoden i App Delegate og gjøre en NSURLRequest til Twitter med nettadressen for å ta tak i tweets vi ønsker å behandle. Vi stiller også appdelegatet til NSURLRequests delegat.
- (BOOL) søknad: (UIApplication *) søknad didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Override punkt for tilpasning etter programstart. // Legg til visningskontrollørens visning til vinduet og skjermen. responseData = [[NSMutableData data] behold]; tweets = [NSMutableArray array]; NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://search.twitter.com/search.json?q=mobtuts&rpp=5"]]; [[NSURLConnection alloc] initWithRequest: forespørsel delegert: selv]; returnere JA;
Nå, siden vår App Delegate er NSURLRequests delegat, må vi implementere de delegerte metodene. Vi er primært interessert i å bli varslet når dataene blir sendt til oss og når forespørselen er fullført og det ikke er flere data å motta.
#pragma mark NSURLConnection Delegate metoder - (void) tilkobling: (NSURLConnection *) tilkobling didReceiveResponse: (NSURLResponse *) respons [responseData setLength: 0]; - (ugyldig) tilkobling: (NSURLConnection *) tilkobling didReceiveData: (NSData *) data [responseData appendData: data]; - (ugyldig) tilkobling: (NSURLConnection *) tilkobling didFailWithError: (NSError *) feil label.text = [NSString stringWithFormat: @ "Connection mislyktes:% @", [feilbeskrivelse]];
Det er her vår parser gjør det meste av arbeidet. Det parserer JSON-filen og lager en rekke tweets for oss. Vi får arrayet og sender det videre til TableViewController for å vise det.
- (void) connectionDidFinishLoading: (NSURLConnection *) tilkobling [tilkoblingsutgivelse]; NSString * responseString = [[NSString alloker] initWithData: responseData-koding: NSUTF8StringEncoding]; [responsData release]; NSDictionary * results = [responseString JSONValue]; NSArray * allTweets = [results objectForKey: @ "results"]; [viewController setTweets: allTweets]; [window addSubview: viewController.view]; [window makeKeyAndVisible];
Nå bruker vi bare oppstillingen vi opprettet fra parseren for å vise dataene i vår TableView.
Twitter_SearchViewController.h
#importere@interface Twitter_SearchViewController: UITableViewController NSArray * tweets; // dette er arrayet som ble sendt til oss fra App Delegate @property (nonatomic, behold) NSArray * tweets; @slutt
TweetsTableViewController.m
I kontrolleren må vi først syntetisere egenskapen og deretter angi antall rader som vi skal vise
@synthesize tweets; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) seksjon // Returner antall rader i seksjonen. returnere [tweets count];
Til slutt vil vi vise tweets ved å referere til deres spesifikke nøkler fra ordlisten. Fra å se på JSON-streng tidligere, vet vi at vi leter etter verdiene som er knyttet til "from_user", "profile_image_url" og "text" -tastene.
// Tilpass utseendet til tabellvisning celler. - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statisk NSString * CellIdentifier = @ "Cell"; UITableViewCell * celle = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; hvis (celle == nil) celle = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier] autorelease]; // Konfigurer cellen ... NSDictionary * aTweet = [tweets objectAtIndex: [indexPath row]]; cell.textLabel.text = [aTweet objectForKey: @ "text"]; cell.textLabel.adjustsFontSizeToFitWidth = YES; cell.textLabel.font = [UIFont systemFontOfSize: 12]; cell.textLabel.numberOfLines = 4; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.detailTextLabel.text = [aTweet objectForKey: @ "from_user"]; NSURL * url = [NSURL URLWithString: [aTweet objectForKey: @ "profile_image_url"]]; NSData * data = [NSData dataWithContentsOfURL: url]; cell.imageView.image = [UIImage imageWithData: data]; cell.selectionStyle = UITableViewCellSelectionStyleNone; returcelle;
Hvis du planlegger å bruke enten Three20 eller httpriot, trenger du ikke å legge til JSON-rammeverket. Disse prosjektene inkluderer allerede det i sin kode. Hvis du planlegger å bruke ASIHTTPRequest, er JSON-rammene ikke inkludert, og du må legge til det selv.