iPhone SDK conéctate a Twitter con OAuth

Este tutorial le mostrará cómo integrar rápidamente la API de Twitter con el iPhone SDK usando Twitter-OAuth-iPhone, una biblioteca de plug-and-play Twitter para el iPhone compuesta de múltiples proyectos de código abierto combinados y sintetizados para una fácil implementación por Ben Gottlieb.

Cambios posteriores a las técnicas y software

Ciertos aspectos de las aplicaciones o técnicas utilizadas en este tutorial han cambiado desde que se publicó originalmente. Esto podría hacer que sea un poco difícil de seguir. Recomendamos ver estos tutoriales más recientes sobre el mismo tema:

  • iOS 5 y el marco de Twitter: Primeros pasos
  • iOS 5 y el marco de Twitter: Técnicas avanzadas

NOTA: Con el lanzamiento de iOS 5, este artículo está desactualizado. En el futuro, debería considerar seriamente usar el marco de Twitter que se incluye con el iOS 5 SDK. Solo considere implementar la solución demostrada aquí si debe admitir usuarios en versiones anteriores de iOS.

Configuración del proyecto

Este tutorial utilizará una aplicación simple llamada "TwitterRush" para demostrar la integración de Twitter OAuth para el iPhone. Al descargar la aplicación TwitterRush, podrá seguir con precisión todos los pasos de este tutorial. Sin embargo, si ya tienes un proyecto de iPhone que te gustaría conectar con la API de Twitter, aún así deberías poder seguir tu propio código con solo pequeñas modificaciones..

Además de TwitterRush o su propio proyecto, también deberá descargar el proyecto Twitter-OAuth-iPhone de Ben Gottlieb disponible en GitHub.

Paso 1: Copia la carpeta Twitter + OAuth

Después de descargar y desarchivar la biblioteca Twitter-OAuth-iPhone, arrastre la carpeta titulada "Twitter + OAuth" a la carpeta "Otras fuentes" en el área del navegador de Xcode 4. Asegúrese de marcar la opción "Copiar elementos en la carpeta del grupo de destino (si es necesario)" y haga clic en "Finalizar".

Intentar compilar y ejecutar su aplicación ahora resultará en MUCHOS errores (90 en el momento de escribir esto con iOS SDK 4). No se preocupe: los arreglaremos fácilmente en el Paso 2.

Paso 2: Añadir la biblioteca libxml2

En el área del navegador de Xcode 4, seleccione el nombre del proyecto (en este caso "TwitterRush"). A continuación, seleccione el objetivo actual ("TwitterRush" aquí nuevamente), y luego seleccione la pestaña "Construir fases". Expanda la opción "Vincular binarios con bibliotecas" y luego haga clic en el botón "+" para agregar un nuevo marco. Escriba "libxml2" en el cuadro de búsqueda y seleccione libxml2.dylib biblioteca que aparece en la lista. Haga clic en "Agregar" para incluir esta biblioteca en la fase de vinculación de su proyecto..

Después de completar estos pasos, su pantalla debería verse algo como esto:

Después de agregar la biblioteca a su proyecto, deberá modificar la configuración de "rutas de búsqueda de encabezado" en la configuración de compilación de su proyecto. Para hacer esto, deseleccione el objetivo y seleccione el proyecto TwitterRush real. Abra la pestaña "Crear configuración" y busque la entrada "Rutas de búsqueda de encabezado". Haga doble clic en esta configuración y luego haga clic en el botón "+" en la parte inferior izquierda del diálogo emergente para agregar una nueva ruta de búsqueda. Haga clic en la casilla de verificación "recursiva", haga doble clic en el campo "Ruta" e ingrese la siguiente ruta dinámica:

 $ (SDKROOT) / usr / include / libxml2

Después de hacer clic en "Listo", su pantalla debería verse similar a esto:

Si ejecuta la aplicación desde la barra de menú de Xcode, ahora debería poder compilar la aplicación sin ningún error de compilación!

Paso 3: Declarar el protocolo NSXMLParserDelegate

Si bien ahora puede compilar y ejecutar la aplicación sin ningún error, hay una serie de advertencias relacionadas con los cambios en el SDK de iOS4 y el protocolo NSXMLParserDelegate. Tendrá que declarar explícitamente que MGTwitterStatusesParser.h y MGTwitterXMLParser.h Conforme a este protocolo para evitar que se produzcan estas advertencias..

Para ello, abre el MGTwitterStatusesParser.h archivar y modificar el @interfaz declaración declarando el NSXMLParserDelegate protocolo como tal:

 @interface MGTwitterStatusesParser: MGTwitterXMLParser   

Ahora haz lo mismo para MGTwitterXMLParser.h, modificando el @interfaz declaración para leer:

 @interface MGTwitterXMLParser: NSObject   

¡Ahora debería poder compilar sin problemas la aplicación sin generar errores ni advertencias! Ahora estamos listos para comenzar a integrar la biblioteca Twitter-OAuth-iPhone con nuestro código.

Paso 4: Importe SA_OAuthTwitterController.h & Declare SA_OAuthTwitterEngine

Ahora debemos comenzar a importar las clases de biblioteca que usaremos para conectarnos con la API de Twitter. Abierto TwitterRushViewController.h y modifique el código para que lea como sigue:

 #importar  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @ propiedad (no atómica, retener) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) sender; @fin 

En la línea 2, importamos el SA_OAuthTwitterController clase para uso dentro de nuestro controlador de vista. En la línea 4, remitimos declarar SA_OAuthTwitterEngine clase para que podamos declarar una instancia de esa clase en el @interfaz sin importar realmente el archivo de encabezado. En la línea 6 declaramos el SA_OAuthTwitterControllerDelegate protocolo: esto nos permitirá responder fácilmente a los eventos de la API de Twitter más adelante. Finalmente, en la línea 10 declaramos la _motor objeto como una instancia de la SA_OAuthTwitterEngine clase.

Ahora cambia a la TwitterRushViewController.m expediente. Importar el SA_OAuthTwitterEngine Clase que acabamos de reenviar declarada en la interfaz de clase:

 #import "SA_OAuthTwitterEngine.h" 

Porque el SA_OAuthTwitterControllerDelegate solo contiene declaraciones de métodos opcionales, en este punto usted debería poder compilar y ejecutar su aplicación nuevamente sin ningún error o advertencia.

Paso 5: Defina sus credenciales de OAuth de la API de Twitter

Para obtener acceso de OAuth a la API de Twitter, primero deberá crear una Clave de consumidor y una Clave secreta para que Twitter pueda identificar y autenticar su aplicación. Puede hacerlo desde el sitio web de Twitter iniciando sesión en su cuenta y navegando al formulario de registro de la aplicación. Al pasar por el proceso de registro, asegúrese de especificar "cliente" como tipo de aplicación, marque la casilla "Sí, usar Twitter para iniciar sesión" y seleccione "Leer y escribir" como el tipo de acceso predeterminado para permitir que su aplicación de iPhone publique tweets en nombre de sus usuarios.

Una vez que haya registrado su aplicación y Twitter haya generado sus credenciales de aplicación, agregue lo siguiente a TwitterRushViewController.m por encima de la clase @implementación:

 #define kOAuthConsumerKey @ "Su clave de consumidor aquí" // REEMPLAZAR con la clave de OAuth de la aplicación de Twitter #define kOAuthConsumerSecret @ "Su secreto de consumidor aquí" // REEMPLAZA con la Secretaria de OAuth de la aplicación de Twitter 

Usaremos estas constantes momentáneamente cuando instanciamos nuestra _motor objeto.

Paso 6: Inicia la pantalla de inicio de sesión de Twitter

Para nuestro caso de uso, queremos inicializar el _motor objeto cuando se crea nuestro ViewController y luego muestra la pantalla de inicio de sesión de Twitter OAuth tan pronto como el controlador de vista termina de cargarse. Para inicializar el _motor objeto, modificar el viewDidAppear Método para leer de la siguiente manera:

 - (void) viewDidAppear: (BOOL) animado si (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  

Ahora adelante y suelte el _motor Objeto en nuestro método dealloc del controlador de vista:

 - (void) dealloc [_engine release]; [TweetTextField release]; [super dealloc];  

Después de que nuestra vista termine de cargarse, queremos iniciar inmediatamente la pantalla de inicio de sesión de Twitter. Para ello, deberá modificar de nuevo el viewDidAppear método como tal:

 - (void) viewDidAppear: (BOOL) animado si (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; if (controller) [self presentModalViewController: controller animated: YES];  

Si ejecuta la aplicación ahora, verá que estamos presentando con éxito la pantalla de inicio de sesión de Twitter cada vez que se muestra nuestra vista personalizada. Sin embargo, hay un problema importante con esta configuración: la pantalla de inicio de sesión siempre se mostrará cuando aparezca la vista, incluso si el usuario ya ha iniciado sesión. Necesitamos agregar un condicional que solo mostrará este control si el usuario aún no lo ha hecho. conectado a través de OAuth.

Para hacer esto, agregue el siguiente condicional antes de mostrar la vista:

 if (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; if (controller) [self presentModalViewController: controller animated: YES];  

los está autorizado método devolverá un valor booleano de VERDADERO si tenemos un token de autenticación OAuth. Por lo tanto, este condicional simplemente prueba si no haga tener autorización, y luego muestra el inicio de sesión de Twitter cuando sea necesario.

Para el está autorizado Método para trabajar, también necesitamos agregar lo siguiente SA_OAuthTwitterEngineDelegate Métodos de protocolo responsables de almacenar nuestro token de autenticación OAuth después del primer inicio de sesión:

 // ================================================ ================================================== =========================== #pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) datos paraUsername: (NSString *) username  NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [por defecto setObject: data forKey: @ "authData"]; [los valores predeterminados sincronizan];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) nombre de usuario return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  

Paso 7: Publicar actualizaciones en Twitter

En lo que quizás sea el paso más simple de todo el proceso, agregue la siguiente línea de código a updateTwitter, Nuestro método de acción de IBA personalizado, para publicar una actualización en Twitter:

 [_engine sendUpdate: tweetTextField.text]; 

Voila! Ahora deberías estar publicando actualizaciones en tu feed de Twitter. Sin embargo, todavía no hemos terminado. ¿Qué pasa si nuestra aplicación no publica la actualización? ¿Qué pasaría si quisiéramos presentar una vista de confirmación si el tweet se publica correctamente? Afortunadamente, el TwitterEngineDelegate El protocolo tiene dos métodos definidos para este propósito..

Agregue el siguiente código a TwitterRushViewController.m:

 // ================================================ ================================================== =========================== #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ tenido éxito ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error NSLog (@ "Error en la solicitud% @:% @", requestIdentifier, error);  

Puede ver que la aplicación ahora registrará los mensajes de éxito y error en la consola, dependiendo de lo que suceda después de hacer clic en el botón "Tweet". Este comportamiento se puede modificar fácilmente para satisfacer las necesidades de sus propias aplicaciones.

Conclusión

Si ha seguido las instrucciones paso a paso anteriores, ahora debería poder publicar actualizaciones de estado en Twitter en nombre de sus usuarios.!

El lleno TwitterRushViewController.h El archivo ahora debería verse así:

 #importar  #import "SA_OAuthTwitterController.h" @class SA_OAuthTwitterEngine; @interface TwitterRushViewController: UIViewController  IBOutlet UITextField * tweetTextField; SA_OAuthTwitterEngine * _engine;  @ propiedad (no atómica, retener) IBOutlet UITextField * tweetTextField; - (IBAction) updateTwitter: (id) sender; @fin 

El lleno TwitterRushViewController.m el archivo debe leer:

 #importar "TwitterRushViewController.h" #importar "SA_OAuthTwitterEngine.h" / * Defina las constantes a continuación con la clave y el secreto de Twitter para su aplicación. Cree las credenciales de Twitter OAuth registrando su aplicación como un Cliente OAuth aquí: http://twitter.com/apps/new * / #define kOAuthConsumerKey @ "Su clave aquí" // REEMPLAZAR con la clave OAuth de la aplicación de Twitter #define kOAuthConsumerSecret @ "Su Secret Here "// REEMPLAZO con la aplicación de Twitter OAuth Secret @implementation TwitterRushViewController @synthesize tweetTextField; #pragma mark Métodos personalizados - (IBAction) updateTwitter: (id) sender // Dismiss Keyboard [tweetTextField resignFirstResponder]; // El código de integración de Twitter va aquí [_engine sendUpdate: tweetTextField.text];  #pragma mark ViewController Lifecycle - (void) viewDidAppear: (BOOL) animated // Inicialización de Twitter / El código de inicio de sesión va aquí si (! _ engine) _engine = [[SA_OAuthTwitterEngine alloc] initOAuthWithDelegate: self]; _engine.consumerKey = kOAuthConsumerKey; _engine.consumerSecret = kOAuthConsumerSecret;  if (! [_ engine isAuthorized]) UIViewController * controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self]; if (controller) [self presentModalViewController: controller animated: YES];  - (void) viewDidUnload [tweetTextField release]; tweetTextField = nil;  - (void) didReceiveMemoryWarning [super didReceiveMemoryWarning];  - (void) dealloc [_engine release]; [TweetTextField release]; [super dealloc];  // =============================================== ================================================== ============================ #pragma mark SA_OAuthTwitterEngineDelegate - (void) storeCachedTwitterOAuthData: (NSString *) datos paraUsername: (NSString *) username NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; [por defecto setObject: data forKey: @ "authData"]; [los valores predeterminados sincronizan];  - (NSString *) cachedTwitterOAuthDataForUsername: (NSString *) nombre de usuario return [[NSUserDefaults standardUserDefaults] objectForKey: @ "authData"];  // =============================================== ================================================== ============================ #pragma mark TwitterEngineDelegate - (void) requestSucceeded: (NSString *) requestIdentifier NSLog (@ "Request% @ tuvo éxito ", requestIdentifier);  - (void) requestFailed: (NSString *) requestIdentifier withError: (NSError *) error NSLog (@ "Error en la solicitud% @:% @", requestIdentifier, error);  @final 

Gracias por leer este tutorial en la biblioteca Twitter-OAuth-iPhone, y un agradecimiento muy especial a Ben Gottlieb, Matt Gemmell, Jon Crosby, Chris Kimpton e Isaiah Carew. Sin su arduo trabajo, implementar la API de Twitter con el iPhone SDK tomaría muchos, muchos más pasos para lograrlo..

¿Tiene preguntas o comentarios sobre este tutorial? Déjelos en la sección de comentarios a continuación o envíe un mensaje a @markhammonds directamente en twitter. Puntos de bonificación por completar este tutorial y utilizar la aplicación TwitterRush para enviarme un mensaje de bienvenida!