Les API accessibles sur le Web fournissent une mine de ressources pour étendre les fonctionnalités de vos applications iPhone. Ces API ont tendance à être consommées dans deux formats de données principaux: XML et JSON. Le kit de développement logiciel (SDK) iPhone prend en charge l’analyse XML et fait l’objet d’un didacticiel distinct. Dans ce didacticiel, nous nous concentrerons sur l'ajout de la prise en charge JSON à vos applications iOS en montrant comment créer une application client de lecture Twitter..
Le framework JSON est un framework extrêmement populaire. Il est utilisé pour alimenter une grande partie des applications couramment utilisées sur l'App Store, y compris l'application Facebook, l'application Google Maps et à peu près tous les clients Twitter existants..
Il existe plusieurs raisons de choisir JSON au lieu de XML. La principale raison pour laquelle JSON est préféré est que la taille des fichiers JSON est généralement inférieure à celle de leurs équivalents XML, ce qui entraîne naturellement un temps de chargement moins long. Une autre raison à considérer est que le système de notification push d'Apple fonctionne mieux avec les charges utiles JSON..
L'ajout du cadre est simple. Il vous suffit de faire glisser les fichiers dans votre projet. Il existe une option pour lier la bibliothèque à votre projet, mais cette option est maintenant obsolète et n'est pas prise en charge..
#import "JSON.h"
dans les fichiers source où vous utiliserez le framework.
Voici un exemple de message JSON représentant l'apparence d'un objet Personne:
"firstName": "John", "lastName": "Smith", "age": 25 ans, "adresse": "streetAddress": "21 2nd Street", "ville": "New York", "Etat" : "NY", "postalCode": "10021", "phoneNumber": ["type": "home", "numéro": "212 555-1234", "type": "fax", " numéro ":" 646 555-4567 "]
Pour analyser ce qui précède, nous chargeons d’abord le message JSON dans une chaîne NSString:
NSString * jsonString = [[NSString alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @ "données" deType: @ "json"] codage: erreur NSUTF8StringEncoding: & error];
En examinant l'exemple de message JSON, nous pouvons voir que les données sont encapsulées avec les deux crochets (par exemple,. [] ) et des accolades (par exemple. ). Les crochets sont des tableaux de données et les accolades sont les dictionnaires de données. Comme vous pouvez le constater, nous pouvons imbriquer des tableaux de dictionnaires et les objets de dictionnaire peuvent contenir des tableaux pour plusieurs valeurs..
Dans l'exemple ci-dessus, nous avons un dictionnaire pour les contacts avec des clés telles que prénom, nom, etc. L'adresse clé pointe vers un autre dictionnaire contenant ses propres paires clé-valeur. La clé phoneNumber du dictionnaire contient un tableau de dictionnaires..
Pour analyser un tableau, nous utilisons:
NSArray * results = [jsonString JSONValue];
Pour analyser un dictionnaire, nous utilisons:
NSDictionary * dictionary = [jsonString JSONValue]; NSArray * keys = [dictionary allKeys]; // les clés de votre dictionnaire
Choisissez celui dont vous avez besoin en fonction de votre objet racine. Par exemple, si votre API renvoie une liste de contacts, vous récupérerez un tableau de dictionnaires de contacts. De même, si vous demandez un calendrier Twitter, vous récupérez un tableau de tweets où chaque tweet est un dictionnaire..
La création d'une chaîne JSON est très simple et directe. Vous créez soit un NSDictionary avec les clés et les valeurs appropriées, soit un NSArray avec la liste des objets. Ce processus est assez similaire à la façon dont nous avons analysé le JSON à l'étape précédente..
Vous créeriez un dictionnaire avec vos données.
NSDictionary * contactData = [NSDictionary dictionaryWithObjectsAndKeys: _titleField.text, @ "titre", _summaryField.text, @ "résumé", _urlField.text, @ "url", _phoneField.text, @ "téléphone", _bdayField.text, @ "," anniversaire ", _addrField.text, @" adresse ", nil];
Ajoutez votre dictionnaire de données nouvellement créé à sa classe
NSDictionary * finalData = [NSDictionary dictionaryWithObject: contactData forKey: @ "contact"];
Générez ensuite la représentation JSON de votre dictionnaire de classe.
NSString * newJSON = [finalData JSONRepresentation];
Vous pouvez également créer vos tableaux et dictionnaires ou tableaux de données en conséquence..
Remarque: Il n'y a pas de méthode dans l'infrastructure JSON permettant de valider si un message est JSON valide.
Créons une application iPhone simple qui affiche une liste des 5 derniers tweets contenant des messages mobiles..
Nous allons utiliser l'API de recherche Twitter pour plus de simplicité, car elle ne nécessite ni authentification ni autorisation..
L'URL de notre demande est:
http://search.twitter.com/search.json?q=mobtuts&result_type=recent
Cela nous retournera un résultat de dictionnaire contenant un tableau de tweets.
Pour vous simplifier la vie, concentrons-nous uniquement sur l'URL de l'image de profil de l'utilisateur, le texte du tweet et le nom Twitter de l'utilisateur..
Un simple tweet résultant ressemble à ceci:
"profile_image_url": "http://a3.twimg.com/profile_images/949941117/zucker_normal.jpg", "created_at": "jeu, 10 juin 2010 03:54:22 +0000", "de_utilisateur": "mariacarol "," métadonnées ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: Comment installer Android 2.2 Froyo sur iPhone http://bit.ly/c8kBb6 ", "id": 15824617764, "from_user_id": 311442, "geo": null, "code_iso_langue": "en", "source": "Seesmic", "profil_image_url": "http://a1.twimg.com /profile_images/655595496/retro9_normal.gif","created_at":"Thu, 10 juin 2010 03:52:28 +0000 "," from_user ":" cead22 "," métadonnées ": " result_type ":" recent " , "to_user_id": null, "text": "Quiero un # iPhone4 con #FroYo - Comment installer Android 2.2 Froyo sur iPhone http://bit.ly/c8kBb6 (@mobtuts)", "id": 15824510273, "from_user_id": 34036310, "geo": null, "iso_language_code": "en", "source": "Twitter pour BlackBerry \ u00ae", "profile_image_url": "http://a1.twimg.com/profile_images /769690946/mobiletuts_icon_normal.png","created_at":"Thu, 10 juin 2010 03:45:51 +0000 "," from_user ":" mobtuts ", "metadata": "result_type": "recent", "to_user_id": null, "text": "Abonnez-vous au podcast hebdomadaire @mobtuts maintenant! Choisissez RSS http://bit.ly/9LMbGX ou 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": "jeu., 10 juin 2010 03:25:00 + 0000 "," from_user ":" tutsplus "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" Inscrivez-vous maintenant au podcast hebdomadaire @mobtuts! Choisissez RSS http://bit.ly/9LMbGX ou 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": "jeu., 10 juin 2010 03:22:33 + 0000 "," from_user ":" GreatTwitTips "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: RT @berryizm_feeds: 5 Conseils du développeur BlackBerry pour le thème MMMOOO un thème BlackBerry et une application de développement… http://bit.ly/agf0ND","id":15822755393,"from_user_id":19637346,"geo":null,"iso_language_code":"en","source ": "fil Twitter"
Nous pouvons voir que nous recherchons les clés "profile_image_url", "from_user" et "text" pour notre application..
Créons un analyseur JSON simple et faisons la demande à partir de l'API.
Twitter_SearchAppDelegate.h
#importation@class Twitter_SearchViewController; @interface Twitter_SearchAppDelegate: NSObject UIWindow * window; NSMutableData * responseData; Twitter_SearchViewController * viewController; @property (nonatomic, keep) IBOutlet UIWindow * fenêtre; @property (nonatomic, keep) IBOutlet Twitter_SearchViewController * viewController; @fin
Nous allons maintenant ajouter le framework JSON aux instructions d'importation.
Twitter_SearchAppDelegate.m
#import "JSON.h"
À partir de là, nous allons modifier la méthode didFinishLaunchingWithOptions dans le délégué d'application et créer une requête NSURLRequest sur Twitter avec l'URL permettant de récupérer les tweets que nous voulons traiter. Nous allons également définir le délégué d'application pour être le délégué de NSURLRequest.
- Application (BOOL): application (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Point de substitution pour la personnalisation après le lancement de l'application. // Ajoute la vue du contrôleur de vue à la fenêtre et l'affiche. responseData = [[NSMutableData data] retenue]; tweets = [tableau NSMutableArray]; NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://search.twitter.com/search.json?q=mobtuts&rpp=5"]]; [[NSURLConnection alloc] initWithRequest: demande du délégué: self]; retourner OUI;
Maintenant, puisque notre délégué d'application est le délégué de NSURLRequest, nous devons implémenter ces méthodes de délégué. Nous souhaitons avant tout être avertis lorsque les données nous sont envoyées et lorsque la demande est complète et qu'il n'y a plus de données à recevoir..
#pragma mark NSURLConnection Méthodes déléguées - (void) connexion: connexion (NSURLConnection *) connexion didReceiveResponse: (NSURLResponse *) response [responseData setLength: 0]; - (void) connection: (NSURLConnection *) connexion didReceiveData: (NSData *) data [responseData appendData: data]; - (void) connection: (NSURLConnection *) connexion didFailWithError: (NSError *) error label.text = [NSString stringWithFormat: @ "La connexion a échoué:% @", [description de l'erreur]];
C’est là que notre analyseur effectue la plus grande partie du travail. Il analyse le fichier JSON et crée le tableau de tweets pour nous. Nous obtenons le tableau et le transmettons au TableViewController pour l'afficher.
- (void) connectionDidFinishLoading: (NSURLConnection *) connection [libération de la connexion]; NSString * responseString = [[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding]; [releaseData release]; NSDictionary * results = [responseString JSONValue]; NSArray * allTweets = [result objectForKey: @ "results"]; [viewController setTweets: allTweets]; [window addSubview: viewController.view]; [fenêtre makeKeyAndVisible];
Maintenant, nous utilisons simplement le tableau que nous avons créé à partir de l'analyseur pour afficher les données dans notre TableView.
Twitter_SearchViewController.h
#importation@interface Twitter_SearchViewController: UITableViewController NSArray * tweets; // Il s'agit du tableau qui nous a été transmis par le délégué d'application @property (nonatomic, keep) NSArray * tweets; @fin
TweetsTableViewController.m
Dans le contrôleur, nous devons d’abord synthétiser la propriété, puis définir le nombre de lignes à afficher.
@ synthétiser les tweets; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section // Renvoie le nombre de lignes de la section. return [compte de tweets];
Enfin, nous afficherons les tweets en référençant leurs clés spécifiques dans le dictionnaire. En examinant la chaîne JSON précédemment, nous savons que nous recherchons les valeurs associées aux clés "from_user", "profile_image_url" et "text"..
// Personnaliser l'apparence des cellules de la vue tableau. - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statique NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) cell = [[[UITableViewCell alloc]] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier] autorelease]; // Configurez la cellule… 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; cellule de retour;
Si vous envisagez d'utiliser Three20 ou httpriot, vous n'avez pas besoin d'ajouter le framework JSON. Ces projets l'incluent déjà dans leur code. Si vous envisagez d'utiliser ASIHTTPRequest, le framework JSON n'est pas inclus et vous devez l'ajouter vous-même..