Webzugriffs-APIs bieten eine Vielzahl von Ressourcen zur Erweiterung der Funktionalität Ihrer iPhone-Apps. Diese APIs werden normalerweise in zwei primären Datenformaten verwendet: XML und JSON. Das iPhone SDK bietet integrierte Unterstützung für das XML-Parsing. Dies wird in einem separaten Lernprogramm behandelt. In diesem Lernprogramm konzentrieren wir uns darauf, Ihre iOS-Anwendungen um JSON-Unterstützung zu erweitern, indem Sie demonstrieren, wie Sie eine Twitter-Leseclient-App erstellen.
Das JSON-Framework ist ein äußerst beliebtes Framework. Es wird verwendet, um einen Großteil der im App Store häufig verwendeten Apps zu betreiben, darunter die Facebook-App, die Google Maps-App und so ziemlich jeder einzelne Twitter-Client.
Es gibt einen Grund, JSON gegenüber XML zu wählen. JSON wird vor allem deshalb bevorzugt, weil JSON-Dateien in der Regel kleiner sind als ihre XML-Dateien und dies führt natürlich zu einer geringeren Ladezeit. Ein weiterer Grund zur Überlegung ist, dass das Push-Benachrichtigungssystem von Apple am besten mit JSON-Nutzdaten funktioniert.
Das Hinzufügen des Frameworks ist einfach. Sie müssen nur die Dateien in Ihr Projekt ziehen. Es gibt eine Option, um die Bibliothek mit Ihrem Projekt zu verknüpfen, diese Option ist jedoch veraltet und wird nicht unterstützt.
#import "JSON.h"
in die Quelldateien, in denen Sie das Framework verwenden werden.
Die folgende JSON-Nachricht zeigt, wie ein Personenobjekt aussehen könnte:
"firstName": "John", "lastName": "Smith", "age": 25, "address": "streetAddress": "21 2nd Street", "city": "New York", "state" : "NY", "postalCode": "10021", "phoneNumber": ["type": "home", "number": "212 555-1234", "type": "fax", " Nummer ":" 646 555-4567 "]
Um das obige zu analysieren, laden wir zuerst die JSON-Nachricht in einen NSString:
NSString * jsonString = [[NSString-Zuordnung] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @ "data" ofType: @ "json"] Kodierung: NSUTF8StringEncoding-Fehler: & error];
Wenn Sie sich die JSON-Beispielnachricht ansehen, können wir sehen, dass Daten mit beiden Klammern gekapselt werden (z. [] ) und Klammern (z. ). Die Klammern sind Datenfelder und die geschweiften Klammern sind die Wörterbücher der Daten. Wie Sie sehen, können wir Arrays von Wörterbüchern verschachteln, und Wörterbuchobjekte können Arrays für mehrere Werte enthalten.
Im obigen Beispiel haben wir ein Wörterbuch für den Kontakt mit Schlüsseln wie Vorname, Nachname usw. Der Adressschlüssel zeigt auf ein anderes Wörterbuch, das seine eigenen Schlüssel-Wert-Paare enthält. Die phoneNumber-Taste im Wörterbuch enthält eine Reihe von Wörterbüchern.
Um ein Array zu analysieren, verwenden wir:
NSArray * Ergebnisse = [JsonString JSONValue];
Um ein Wörterbuch zu analysieren, verwenden wir:
NSDictionary * dictionary = [jsonString JSONValue]; NSArray * keys = [dictionary allKeys]; // die Schlüssel für Ihr Wörterbuch
Wählen Sie je nach Stammobjekt den gewünschten aus. Wenn Ihre API beispielsweise eine Liste von Kontakten zurückgibt, erhalten Sie ein Array mit Kontaktwörterbüchern. Wenn Sie nach einer Twitter-Zeitleiste fragen, erhalten Sie eine Reihe von Tweets, bei denen jeder Tweet ein Wörterbuch ist.
Das Erstellen einer JSON-Zeichenfolge ist sehr einfach und unkompliziert. Sie erstellen entweder ein NSDictionary mit den entsprechenden Schlüsseln und Werten oder ein NSArray mit der Liste der Objekte. Dieser Prozess ist ziemlich ähnlich wie bei der Analyse des JSON im vorherigen Schritt.
Sie würden ein Wörterbuch mit Ihren Daten erstellen.
NSDictionary * contactData = [NSDictionary dictionaryWithObjectsAndKeys: _titleField.text, @ "title", _summaryField.text, @ "summary", _urlField.text, @ "url", _phoneField.text, @ "phone", _bdayField.text, @ " Geburtstag ", _addrField.text, @" address ", nil];
Fügen Sie das neu erstellte Datenwörterbuch seiner Klasse hinzu
NSDictionary * finalData = [NSDictionary dictionaryWithObject: contactData forKey: @ "contact"];
Dann generieren Sie die JSON-Darstellung Ihres Klassenwörterbuchs.
NSString * newJSON = [finalData JSONRepresentation];
Sie können auch Ihre Arrays erstellen und Wörterbücher oder Arrays entsprechend verschachteln.
Anmerkung: Es gibt keine Methode im JSON-Framework, die überprüft, ob eine Nachricht gültiger JSON ist.
Lassen Sie uns eine einfache iPhone-App erstellen, die eine Liste der letzten 5 Tweets mit Mobtuts anzeigt.
Wir werden die Twitter-Such-API zur Vereinfachung verwenden, da hierfür keine Authentifizierung oder Autorisierung erforderlich ist.
Die URL für unsere Anfrage lautet:
http://search.twitter.com/search.json?q=mobtuts&result_type=recent
Dies führt zu einem Wörterbuchergebnis, das ein Array von Tweets enthält.
Um das Leben ein wenig zu vereinfachen, konzentrieren wir uns nur auf die Profil-URL des Benutzers, den Tweet-Text und den Twitter-Namen des Benutzers.
Ein einzelner resultierender Tweet sieht so aus:
"profile_image_url": "http://a3.twimg.com/profile_images/949941117/zucker_normal.jpg", "created_at": "Do, 10. Juni 2010 03:54:22 +0000", "from_user": "mariacarol "," Metadaten ": " result_type ":" Recent "," to_user_id ": null," text ":" RT @mobtuts: So installieren Sie Android 2.2 Froyo auf dem iPhone http://bit.ly/c8kBb6 ", "id": 15824617764, "from_user_id": 311442, "geo": null, "iso_language_code": "de", "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 - So installieren Sie Android 2.2 Froyo auf dem iPhone http://bit.ly/c8kBb6 (@mobtuts)", "id": 15824510273, "from_user_id": 34036310, "geo": null, "iso_language_code": "de", "source": "Twitter für 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 ", "Metadaten": "result_type": "Recent", "to_user_id": null, "text": "Abonnieren Sie jetzt den wöchentlichen @mobtuts-Podcast! Wählen Sie RSS http://bit.ly/9LMbGX oder iTunes http://bit.ly/bq0QMC","id":15824135971,"from_user_id":104427899,"geo":null,"iso_language_code":"en ", "source": "HootSuite", "profile_image_url": "http://a1.twimg.com/profile_images/63581538/tutsplus_normal.jpg", "created_at": "Do, 10 Jun 2010 03:25:00 + 0000 "," from_user ":" tutsplus "," Metadata ": " result_type ":" recent "," to_user_id ": null," text ":" Abonnieren Sie jetzt den wöchentlichen @mobtuts-Podcast! Wählen Sie RSS http://bit.ly/9LMbGX oder iTunes http://bit.ly/bq0QMC","id":15822900558,"from_user_id":2295627,"geo":null,"iso_language_code":"en ", "source": "TweetDeck", "profile_image_url": "http://a1.twimg.com/profile_images/234225566/illustration_normal.jpg", "created_at": "Do, 10 Jun 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 Tipps von MMMOOO ein BlackBerry-Theme und App-Entwickl… http://bit.ly/agf0ND","id":15822755393,"from_user_id":19637346,"geo":null,"iso_language_code":"en",ource ": "Twitter-Feed"
Wir können sehen, dass wir nach den Schlüsseln "profile_image_url", "from_user" und "text" für unsere App suchen.
Erstellen Sie einen einfachen JSON-Parser und stellen Sie die Anforderung von der API aus.
Twitter_SearchAppDelegate.h
#einführen@class Twitter_SearchViewController; @Interface Twitter_SearchAppDelegate: NSObject UIWindow * -Fenster; NSMutableData * responseData; Twitter_SearchViewController * viewController; @ property (nichtatomisch, beibehalten) IBOutlet UIWindow * window; @ property (nonatomic, keep) IBOutlet Twitter_SearchViewController * viewController; @Ende
Jetzt fügen wir den Importanweisungen das JSON-Framework hinzu.
Twitter_SearchAppDelegate.m
#import "JSON.h"
Von hier aus ändern wir die didFinishLaunchingWithOptions-Methode im App Delegate und stellen einen NSURLRequest mit der URL an Twitter, um die zu verarbeitenden Tweets abzurufen. Wir setzen den App-Delegierten auch als Delegierten von NSURLRequest ein.
- Anwendung (BOOL): Anwendung (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Überschreibungspunkt für die Anpassung nach dem Start der Anwendung. // Füge die Ansicht des View Controllers zum Fenster und zur Anzeige hinzu. responseData = [[NSMutableData-Daten] beibehalten]; Tweets = [NSMutableArray-Array]; NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL-URLWithString: @ "http://search.twitter.com/search.json?q=mobtuts&rpp=5"]]; [[NSURLConnection-Zuordnung] initWithRequest: Anforderungsdelegierter: Eigen] JA zurückgeben;
Da unser App-Delegierter nun der Delegierte von NSURLRequest ist, müssen wir diese Delegierungsmethoden implementieren. Wir sind in erster Linie daran interessiert, benachrichtigt zu werden, wenn die Daten an uns gesendet werden und wenn die Anfrage abgeschlossen ist und keine Daten mehr zu empfangen sind.
#pragma mark NSURLConnection Delegate Methoden - (void) Verbindung: (NSURLConnection *) Verbindung didReceiveResponse: (NSURLResponse *) Antwort [responseData setLength: 0]; - (void) Verbindung: (NSURLConnection *) Verbindung didReceiveData: (NSData *) data [responseData appendData: data]; - (void) Verbindung: (NSURLConnection *) Verbindung didFailWithError: (NSError *) Fehler label.text = [NSString stringWithFormat: @ "Verbindung fehlgeschlagen:% @", [Fehlerbeschreibung]];
Hier erledigt unser Parser die meiste Arbeit. Es analysiert die JSON-Datei und erstellt das Array von Tweets für uns. Wir erhalten das Array und geben es an den TableViewController weiter, um es anzuzeigen.
- (void) connectionDidFinishLoading: (NSURLConnection *) Verbindung [Verbindungsfreigabe]; NSString * responseString = [[NSString-Zuordnung] initWithData: responseData-Codierung: NSUTF8StringEncoding]; [responseData release]; NSDictionary * results = [responseString JSONValue]; NSArray * allTweets = [Ergebnisse objectForKey: @ "results"]; [viewController setTweets: allTweets]; [Fenster addSubview: viewController.view]; [Fenster makeKeyAndVisible];
Jetzt verwenden wir einfach das vom Parser erstellte Array, um die Daten in unserer TableView anzuzeigen.
Twitter_SearchViewController.h
#einführen@Interface Twitter_SearchViewController: UITableViewController NSArray * Tweets; // Dies ist das Array, das vom App-Delegierten an uns übergeben wurde. @property (nonatomic, keep) NSArray * Tweets; @Ende
TweetsTableViewController.m
Im Controller müssen wir zuerst die Eigenschaft synthetisieren und dann die Anzahl der angezeigten Zeilen festlegen
@ Tweets synthetisieren; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section // Gibt die Anzahl der Zeilen in dem Abschnitt zurück. Rückkehr [Anzahl der Tweets];
Zum Schluss zeigen wir die Tweets an, indem wir ihre spezifischen Schlüssel aus dem Wörterbuch referenzieren. Wenn Sie den JSON-String zuvor betrachten, wissen wir, dass wir nach den Werten suchen, die den Schlüsseln "from_user", "profile_image_url" und "text" zugeordnet sind.
// Anpassen der Darstellung der Tabellensichtzellen. - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) cell = [[[UITableViewCell Allocation] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier] Autorelease]; // Konfigurieren Sie die Zelle… NSDictionary * aTweet = [tweets objectAtIndex: [indexPath-Zeile]]; 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; zurück Zelle;
Wenn Sie Three20 oder httpriot verwenden möchten, müssen Sie das JSON-Framework nicht hinzufügen. Diese Projekte enthalten es bereits in ihrem Code. Wenn Sie planen, ASIHTTPRequest zu verwenden, ist das JSON-Framework nicht enthalten, und Sie müssen es selbst hinzufügen.