Las API accesibles a través de la Web proporcionan una gran cantidad de recursos para ampliar la funcionalidad de las aplicaciones de su iPhone. Estas API tienden a consumirse en dos formatos de datos principales: XML y JSON. El iPhone SDK tiene soporte incorporado para el análisis de XML, y esto se tratará en un tutorial separado. En este tutorial, nos centraremos en agregar soporte JSON a sus aplicaciones de iOS demostrando cómo crear una aplicación de cliente de lectura de Twitter.
El marco JSON es un marco extremadamente popular. Se utiliza para alimentar una gran parte de las aplicaciones de uso común en la App Store, incluida la aplicación de Facebook, la aplicación de Google Maps y casi todos los clientes de Twitter..
Hay un par de razones para elegir JSON sobre XML. La razón principal por la que se prefiere JSON es porque los archivos JSON son generalmente más pequeños en tamaño de archivo que sus homólogos XML, y esto naturalmente produce menos tiempo de carga. Otra razón que vale la pena considerar es que el sistema de notificaciones push de Apple funciona mejor con las cargas útiles JSON.
Añadir el marco es simple. Solo necesitas arrastrar los archivos a tu proyecto. Hay una opción para vincular la biblioteca a su proyecto, pero esa opción ahora está en desuso y no es compatible.
#importar "JSON.h"
en los archivos de origen donde va a utilizar el marco.
El siguiente es un mensaje JSON de muestra que representa el aspecto que podría tener un objeto de persona:
"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", " número ":" 646 555-4567 "]
Para analizar lo anterior, primero cargamos el mensaje JSON en una NSString:
NSString * jsonString = [[NSString alloc] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @ "data" ofType: @ "json"] codificación: NSUTF8StringEncoding error: & error];
Al observar el mensaje JSON de muestra, podemos ver que los datos están encapsulados entre ambos corchetes (por ejemplo,. [] ) y tirantes (por ejemplo,. ). Los corchetes son matrices de datos y las llaves son los diccionarios de datos. Como puede ver, podemos anidar matrices de diccionarios, y los objetos del diccionario pueden contener matrices para múltiples valores.
En el ejemplo anterior, tenemos un diccionario para el contacto con claves como el nombre, el apellido, etc. La clave de la dirección apunta a otro diccionario que contiene sus propios pares clave-valor. La clave phoneNumber en el diccionario contiene una serie de diccionarios.
Para analizar una matriz usamos:
NSArray * results = [jsonString JSONValue];
Para analizar un Diccionario, usamos:
NSDictionary * dictionary = [jsonString JSONValue]; NSArray * keys = [dictionary allKeys]; // las claves de tu diccionario
Elija el que necesita en función de su objeto raíz. Por ejemplo, si su API está devolviendo una lista de contactos, recuperaría una matriz de diccionarios de contactos. Del mismo modo, si solicita una línea de tiempo de Twitter, está recuperando una variedad de tweets donde cada tweet es un diccionario..
Crear una cadena JSON es muy simple y directo. Puede crear un NSDictionary con las claves y valores apropiados o un NSArray con la lista de objetos. Este proceso es bastante similar a cómo analizamos el JSON en el paso anterior.
Deberías crear un diccionario con tus datos..
NSDictionary * contactData = [NSDictionary dictionaryWithObjectsAndKeys: _titleField ... cumpleaños ", _addrField.text, @" address ", nil];
Agregue su diccionario de datos recién creado a su clase
NSDictionary * finalData = [NSDictionary dictionaryWithObject: contactData forKey: @ "contact"];
Luego genere la representación JSON de su diccionario de clase.
NSString * newJSON = [finalData JSONRepresentation];
También puede crear sus matrices y anidar diccionarios o matrices en consecuencia.
Nota: No hay ningún método en el marco JSON que valide si un mensaje es JSON válido..
Vamos a crear una aplicación de iPhone simple que muestre una lista de los últimos 5 tweets que contienen mobtuts.
Vamos a utilizar la API de búsqueda de Twitter para simplificar, ya que no requiere autenticación ni autorización..
La URL para nuestra solicitud es:
http://search.twitter.com/search.json?q=mobtuts&result_type=recent
Esto nos devolverá un resultado de diccionario que contiene una gran variedad de tweets..
Para hacer la vida un poco más fácil, concentrémonos solo en la url de la imagen del perfil del usuario, el texto del tweet y el nombre de Twitter del usuario.
Un solo tweet resultante se ve así:
"profile_image_url": "http://a3.twimg.com/profile_images/949941117/zucker_normal.jpg", "created_at": "Thu, 10 Jun 2010 03:54:22 +0000", "from_user": "mariacarol "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: Cómo instalar Android 2.2 Froyo en el 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 de junio de 2010 03:52:28 +0000 "," from_user ":" cead22 "," metadata ": " result_type ":" recent " , "to_user_id": nulo, "texto": "Quiero un # iPhone4 con #FroYo - Cómo instalar Android 2.2 Froyo en iPhone http://bit.ly/c8kBb6 (@mobtuts)", "id": 15824510273, "from_user_id": 34036310, "geo": null, "iso_language_code": "en", "source": "Twitter for BlackBerry \ u00ae", "profile_image_url": "http://a1.twimg.com/profile_images /769690946/mobiletuts_icon_normal.png","created_at":"Thu, 10 de junio de 2010 03:45:51 +0000 "," from_user ":" mobtuts ", "metadata": "result_type": "recent", "to_user_id": null, "text": "¡Suscríbase ahora al podcast semanal de @mobtuts! Elija RSS http://bit.ly/9LMbGX o 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": "Thu, 10 Jun 2010 03:25:00 + 0000 "," from_user ":" tutsplus "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" ¡Suscríbase al podcast semanal de @mobtuts ahora! Elija RSS http://bit.ly/9LMbGX o 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": "Thu, 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 consejos para desarrolladores de BlackBerry Theme desde MMMOOO, un tema de BlackBerry y una aplicación dev comp ... http://bit.ly/agf0ND","id":15822755393,"from_user_id":19637346,"geo":null,"iso_language_code":"en",""source ": "feed de Twitter"
Podemos ver que estamos buscando las claves "profile_image_url", "from_user" y "text" para nuestra aplicación.
Vamos a crear un analizador JSON simple y hacer la solicitud desde la API.
Twitter_SearchAppDelegate.h
#importar@class Twitter_SearchViewController; @interface Twitter_SearchAppDelegate: NSObject Ventana UIWindow *; NSMutableData * responseData; Twitter_SearchViewController * viewController; @ propiedad (no atómica, retener) IBOutlet UIWindow * window; @ propiedad (no atómica, retener) IBOutlet Twitter_SearchViewController * viewController; @fin
Ahora agregaremos el marco JSON a las declaraciones de importación.
Twitter_SearchAppDelegate.m
#importar "JSON.h"
Desde aquí, modificaremos el método didFinishLaunchingWithOptions en el delegado de la aplicación y realizaremos una NSURLRequest a Twitter con la URL para capturar los Tweets que queremos procesar. También estableceremos el delegado de la aplicación para que sea el delegado de la petición NSURL..
- Aplicación (BOOL): (UIApplication *) aplicación didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Punto de reemplazo para la personalización después del inicio de la aplicación. // Añadir la vista del controlador de vista a la ventana y mostrar. responseData = [[NSMutableData data] retain]; tweets = [matriz NSMutableArray]; NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://search.twitter.com/search.json?q=mobtuts&rpp=5"]]; [[NSURLConnection alloc] initWithRequest: request delegate: self]; devuelve SÍ;
Ahora, ya que nuestro delegado de aplicaciones es el delegado de NSURLRequest, debemos implementar esos métodos de delegado. Estamos interesados principalmente en recibir notificaciones cuando nos envían los datos y cuando la solicitud está completa y no hay más datos para recibir.
#pragma mark NSURLConnection Métodos de delegado - (void) connection: (NSURLConnection *) connection didReceiveResponse: (NSURLResponse *) response [responseData setLength: 0]; - (void) conexión: (NSURLConnection *) conexión didReceiveData: (NSData *) data [responseData appendData: data]; - (void) conexión: (NSURLConnection *) conexión didFailWithError: (NSError *) error label.text = [NSString stringWithFormat: @ "Falló la conexión:% @", [descripción del error]];
Aquí es donde nuestro analizador está haciendo la mayor parte del trabajo. Es analizar el archivo JSON y crear la matriz de tweets para nosotros. Obtenemos la matriz y la pasamos a TableViewController para mostrarla.
- (void) connectionDidFinishLoading: (NSURLConnection *) connection [release de conexión]; NSString * responseString = [[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding]; [releaseData de respuesta]; NSDictionary * results = [responseString JSONValue]; NSArray * allTweets = [results objectForKey: @ "results"]; [viewController setTweets: allTweets]; [ventana addSubview: viewController.view]; [ventana makeKeyAndVisible];
Ahora simplemente usamos la matriz que creamos desde el analizador para mostrar los datos en nuestro TableView.
Twitter_SearchViewController.h
#importar@interface Twitter_SearchViewController: UITableViewController NSArray * tweets; // esta es la matriz que nos fue transmitida desde los delegados de la aplicación @property (nonatomic, retener) NSArray *; @fin
TweetsTableViewController.m
En el controlador, primero necesitamos sintetizar la propiedad y luego establecer el número de filas que mostraremos
@synthesize tweets; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section // Devuelve el número de filas en la sección. retorno [cuenta de tweets];
Finalmente, mostraremos los tweets haciendo referencia a sus claves específicas del diccionario. Al ver la cadena JSON anteriormente, sabemos que estamos buscando los valores asociados con las teclas "from_user", "profile_image_url" y "text".
// Personaliza la apariencia de las celdas de vista de tabla. - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath static NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier] autorelease]; // Configurar la celda ... 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; celda de retorno
Si planea usar Three20 o httpriot, no necesita agregar el marco JSON. Esos proyectos ya lo incluyen en su código. Si está planeando usar ASIHTTPRequest, el marco JSON no está incluido y es necesario que lo agregue usted mismo..