SimpleRTApp: Authentication y retweet con Twitter API en iOS

Federico Jordán
6 min readApr 7, 2018

--

Este artículo esta también disponible en mi blog personal

Esta es la primer parte de una serie de artículos con la idea de tener un sistema que automatice el retweet de cualquier contenido que consideremos interesante. Para ver la lista de temas completa, hacé click acá.

En este artículo voy a buscar explicar como usar la API de Twitter para tener una autenticación, para poder hacer un retweet teniendo el id del tweet correspondiente. En resumen, vamos a:

  1. Crear una app en Twitter e integrar el SDK
  2. Autenticar al usuario mediante TwitterKit
  3. Mostrar un tweet mediante su Id
  4. Retuitear ese tweet en la cuenta del usuario logueado

Crear una app en Twitter

Twitter nos provee bastante documentación acerca de su API. Esto lo pueden ver en https://developer.twitter.com/en/docs/basics/getting-started

Para poder utilizar el servicio de Search API, primero nos piden que creemos la app en su sitio. Como requisito necesitaremos tener una cuenta en Twitter. Para ello creamos una app en la web:

  1. Vamos para https://apps.twitter.com/ y le damos a Create new app
  2. Una vez alla, nos piden algunos datos para identificar nuestra app. En mi caso puse:

App name: SimpleRTApp

Description: The app needs authorization to get permissions to use the Search API

Website: https://www.google.com.ar/ (por ahora no tenemos website)

3. Aceptamos que leímos los términos y condiciones y le damos a Create your Twitter application. En este paso puede que nos pida agregar nuestro número de teléfono a la cuenta de twitter. Mas info acá.

4. Una vez ya creada deberíamos estar en una pantalla parecida a esta:

SimpleRTApp creada en Twitter apps

Vamos a la pestaña de permissions y nos aseguramos que Read and write esté activado:

Read and write permissions

Esto nos permitirá más adelante hacer retweet con el consentimiento del usuario. Más información acerca de los permisos acá.

Instalación de twitter-kit-ios

Una vez que ya tenemos configurada la app en Twitter, procedemos a instalar el SDK de iOS. Para ello yo utilicé CocoaPods:

  1. Hacemos pod init para crear el Podfile en nuestro projecto
  2. Configuramos pod 'TwitterKit' en nuestro Podfile y le damos a pod install desde la terminal.
  3. Abrimos el workspace generado y vamos al Info.plist para configurar las keys de la Twitter app. Agregamos lo siguiente:
// Info.plist
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>twitterkit-<consumerKey></string>
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>twitter</string>
<string>twitterauth</string>
</array>

Donde <consumerKey> es la Consumer Key de nuestra app. La podemos encontrar en el dashboard de Twitter en la pestaña Keys and Access Tokens.

Consumer Key y Consumer Secret para configurar nuestra iOS app

4. Vamos al AppDelegate, agregamos el import TwitterKit y la siguiente línea en el método didFinishLaunchingWithOptions :

TWTRTwitter.sharedInstance().start(withConsumerKey: “<consumerKey>”, consumerSecret: “<consumerSecret>”)

Donde reemplazamos <consumerKey> y <consumerSecret> por el Consumer Key y el Consumer Secret de la sección anterior.

Listo! Ya tenemos configurada nuestra app y ya podemos consumir la API de Twitter.

Para mas información pueden ver la guía oficial de Twitter acá.

Authentication con Twitter

Para poder usar el login con Twitter en nuestra app tenemos que realizar lo siguiente:

  1. Vamos al AppDelegate e implementamos el siguiente método:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return TWTRTwitter.sharedInstance().application(app, open: url, options: options)
}

Esto nos permitirá handlear el log en nuestra app, para poder guardar el authentication token.

2. AgregarSafariServices.framework para poder SFSafariViewController, en caso que la app de Twitter no esté instalada en el dispositivo y tengamos que usar Safari para poder lograr el login.

3. La manera más facil de hacer el Twitter login es agregar un botón de tipo TWTRLogInButton con el cual el usuario tendrá su sesión de Twitter en nuestra app y además obtendremos todos los datos necesarios para poder hacer tweets con su cuenta más adelante.

Para ello, en nuestro ViewController agregamos import TwitterKit y en el método viewDidLoad() insertamos el siguiente código:

let logInButton = TWTRLogInButton(logInCompletion: { session, error in
if let session = session {
print("signed in as \(session.userName)");
} else {
let errorDescription = error?.localizedDescription ?? "unknown"
print("error: \(errorDescription)");
}
})
logInButton.center = self.view.center
self.view.addSubview(logInButton)

Compilamos la app y deberíamos ver algo como esto:

Agregamos el botón de Log in with Twitter

Nos va a pedir abrir la App de Twitter, le damos a Conectar y nuestra app ya tiene los datos de sesión del usuario.

Debuggeamos un poco y vemos la data que nos provee el login:

Datos de sesión de Twitter en nuestra app

Esto nos confirma que ya estamos logueados con Twitter en nuestra app.

El código final lo pueden ver https://github.com/fedejordan/SimpleRTApp, tag login_with_twitter. Es importante aclarar que deberán usar sus propias CostumerKey y CostumerSecret cuando compilen.

Retweet con tweetId

Otra funcionalidad que queríamos hacer es, dado un tweetId, retuitearlo automáticamente. Esto nos permitirá más adelante recibir las pushes con el tweetId y retuitearlo automaticamente en nuestra app.

Para ello vamos a la documentación de Twitter y vemos si hay alguna funcionalidad que nos permita hacer esto. Pero primero vamos a probar un poco la API de tweets.

Creamos un RetweetViewController y agregamos el siguiente código:

Maquetamos una pantalla simple (que presentamos cuando el login fue exitoso) de este estilo:

RetweetViewController en Storyboard

Probamos poner en el text field el numero 20 y vemos que nos da como resultado:

Texto del tweetId 20

Más información de como cargar un simple tweet en esta página. El código se encuentra en el mismo repo de antes en el tag tweet_query.

Ahora que vimos como trabaja la API de Twitter vemos como es la documentación para hacer un retweet. Acá esta la especificación.

Para ello tenemos que construir una Tweet Request de forma manual. Cambiamos el siguiente código de RetweetViewController para usar la API:

Algo a destacar es que cambiamos la inicialización de TWRTAPIClient() por TWRTAPIClient.withCurrentUser(), ya que necesitamos que el cliente sepa las credenciales del usuario.

Compilamos la app, ponemos el tweet id 20 y vemos que retweteamos satisfactoriamente:

Retweet done :)

Si vemos que por algún motivo nos da el siguiente error:

Error: Error Domain=TwitterAPIErrorDomain Code=220 “Request failed: forbidden (403)” UserInfo={NSLocalizedFailureReason=Twitter API error : Your credentials do not allow access to this resource. (code 220), TWTRNetworkingStatusCode=403, NSErrorFailingURLKey=https://api.twitter.com/1.1/statuses/retweet/20.json, NSLocalizedDescription=Request failed: forbidden (403)}

Es porque no configuramos correctamente los permisos de nuestra app (se le necesita avisar explícitamente al usuario que la app va a hacer uso de la funcionalidad de retweet). En ese caso, tendríamos que ir a la configuración de la app en Twitter y chequear que tenga permisos de Read and Write.

Tambien puede ser que no hayamos usado TWRTAPIClient.withCurrentUser() para hacer el retweet, ya que el request tiene que ser autenticado.

El código final lo pueden ver como siempre en el repo del proyecto, tag retweet.

Resumen

Aprendimos como crear una app en Twitter. Los pasos necesarios para configurarla, que permisos necesitamos y que keys son importantes. Después vimos como instalar el SDK, autenticar al usuario, cargar un tweet mediante su Id y finalmente hacer un retweet de ese mismo tweet con el SDK de TwitterKit.

Cualquier consulta o sugerencia estan bienvenidos a escribir un comentario en el post o mandar un mail a fedejordan99@gmail.com. También pueden mandar un mensaje a mi twitter.

¡Gracias por leer el artículo!

--

--