Notificaciones Push con UrbanAirship

http://sev.nscoders.org/2012/07/10/notificaciones-push-con-urbanairship/

UrbanAirship

Bueno Amigos, ya estamos aquí de nuevo para seguir ampliando nuestra app con la que iniciamos la tan estresante tarea de crear certificados y provisioning profiles.Una vez que ya tenemos nuestra app con los RSS que nos interesa parsear(hemos ampliado la aplicación con un controlador de pestañas y añadido los RSS del amigo Miguelon), nos disponemos a añadir más funcionalidad mediante la inclusión de Push Notifications.Si quieres profundizar en el tema te recomiendo que leas primero la entrada de Rafa Aguilar que esta muy bien documentada y además nos viene bien para comprender los conceptos iniciales.

Envio-de-notificaciones-en-iOS
En esta ocasión,vamos a integrar la librería de Urbanairship que será la encargada de gestionar todas las notificaciones push y monitorizar los device tokens de los usuarios,los envíos realizados, así como muchas otras funciones que el servidor web nos va a permitir realizar.

Una vez que hemos accedido a la web de Urbanairship http://urbanairship.com  y creado una cuenta como mínimo Basic(es la recomendable para empezar ya que te permite  enviar muchos mensajes antes de tener que  pagar por ello) ,desde un panel de control de usuario accedemos al sistema de envió de notificaciones Push o Rich push para tener acceso al envío mediente el procedimiento de Broadcast de usuarios.Una vez que los usuarios van descargando nuestra aplicación y autorizando que la misma les envie notificaciones Push, su “Device Tokens” se añade a los servidores de UrbanAirship y en próximos broadcast su dispositivo recibirá la notificación.

-También tenemos la opción de enviar notificaciones Rich Puch con imágenes y contenido adicional como publicidad o sorteos,etc.

-UrbanAirship tambíen permite la integración de In-App Purchase.

Más adelante, veremos que podemos hacer desde el servidor de urbanairship pero ahora vamos a ponernos manos a la obra y a recuperar nuestra app para añadir los certificados Push necesarios para el envio de notificaciones.Para ello, tal como vimos en las dos anteriores entradas, accederemos a nuestro IOS Provisioning Portal para consultar las Apps IDs y activar las Push Notification en nuestra App de la NSCoder Sevilla.

App ids

Activamos nuestros certificados Push tanto de desarrollo como de distribución:
push certificates

Para ello procedemos a crear estos certificados push desde el panel APP IDs y pulsando sobre nuestra aplicación “NSCoders” y sobre la pestaña “Configure” activamos el checkbox “Enable for Apple Push Notification service”

Certificados Push desarrollo
Inicialmente podemos activar tan solo el de desarrollo desde el que las notificaciones son plenamente operativas en modo Desarrollo.

Una vez que hemos instalado dicho certificado en el IOS Provisioning Portal procedemos a descargarlo e instalarlo en nuestra máquina haciendo doble click en el archivo descargado y comprobando que esta instalado en el panel de “Acceso a Llaveros”.
download_certificado

Ahora ya tenemos nuestro certificado push instalado para nuestra app.

certificado en llaveros

Ahora que tenemos ya instalado nuestro certificado Push en la máquina desde la que vamos a implementar urbanairship y posteriormente subir a la Appstore nuestra aplicación procedemos a exportar dicho certificado que necesitamos subir a los servidores de Urbanairship.Todo ello es necesario para que urbanairship pueda comunicarse con los servidores push de Apple y validar nuestros certificados, a la vez que enviará nuestros mensajes Push.

Exportación de certificado push

Exportamos nuestro certificado

Exportacion

Exportado

Tras haber realizado la exportación de nuestro certificado y haber introducido una clave durante la exportación, procedemos a entrar en nuestro panel de control de urbanairship y editamos nuestra aplicación:
edición

Una vez en la ventana de edición pulsamos sobre el botón “añadir certificado” y subimos nuestro certificado push recién exportado.

Subiendo el certificado

Debemos introducir la clave elegida para nuestro certificado dentro del campo “Certificate Password”.

Editar app

Bueno, ya tenemos nuestro equipo configurado y listo para continuar con nuestra app y la configuración necesaria en los servidores de Urbanairship para enviar notificaciones.

Vamos a proceder ahora a integrar la librería de Urbanairship y a realizar las modificaciones necesarias en nuestra app para que todo funcione correctamente.

Para ello nos dirigimos a la web de Urbanairship y descargaremos la última versión disponible.
Una vez descargada, debemos añadir una copia en el mismo directorio donde tengamos alojado nuestro proyecto.

Instalando Librerías y Frameworks necesarios
Ahora que hemos copiado la librería al raíz del directorio donde esta almacenado nuestro proyecto de RSSNSCoder, vamos a instalar las librerías y frameworks necesarios para que funcionen nuestras notificaciones, siguiendo el orden de este listado:

libUAirship-.a
CFNetwork.framework
CoreGraphics.framework
Foundation.framework
MobileCoreServices.framework
Security.framework
SystemConfiguration.framework
UIKit.framework
libz.dylib
libsqlite3.dylib
CoreTelephony.framework
StoreKit.framework
CoreLocation.framework
MessageUI.framework (only required for the sample UI)
AudioToolbox.framework (only required for the sample UI)
MapKit.framework (only required for the sample UI)

La primera libreria,libUAirship-.a,
debemos adjuntarla desde la carpeta recién añadida de Urbanairship.

Este es el aspecto final de nuestro Target cuando pulsamos sobre la pestaña “Summary”.

Librerias necesarias

Creando AirshipConfig.plist

La Librería Urbanairship usa una Plist de configuración para gestionar tus perfiles y aplicaciones tanto de desarrollo como de producción.Debemos crear este archivo llamado “AirshipConfig.plist donde más tarde introduciremos nuestro Aplication Key y Aplication Secret respectivamente.

Una vez creado nuestro archivo plist debemos acceder a la web de Urbanairship y localizar nuestra aplicación “RSSNScoder” donde accederemos a la configuración de los Aplication key y Aplication Secret.

App en Urbanairship

Y el aspecto final de nuestro AirshipConfig.plist es el siguiente:

Plist Final

Hay un aspecto importante a destacar en esta configuración.La key APP_STORE_OR_AD_HOC_BUILD esta configurada con el valor NO, lo que quiere decir que no funcionará en entorno real, es decir en producción en la Appstore.Como estamos configurando un entorno de desarrollo vamos a dejarlo así por el momento, pero si decidimos poner la app en producción debemos cambiar este valor a “YES”.Hemos configurado los parámetros de PRODUCTION APP KEY y PRODUCTION APP SECRET con el mismo valor que en Development ya que de momento no vamos a pasar a producción nuestra aplicación.

Modificar el Header Search Path

El siguiente paso es modificar el “header search path”.Para ello pulsamos sobre nuestro Target y seguidamente sobre la pestaña “Build Settings”.En la barra superior de búsqueda podemos introducir “Search Path” para acceder más rápidamente a dicho parámetro.
Pulsamos doble click a la derecha de Header Search Paths e introducimos lo siguiente:
../Airship/**

Ahora vamos a importar a nuestro proyecto todo el directorio “Airship” que descargamos al principio del proyecto.Recuerda, es la carpeta “Airship alojada en el directorio donde tenemos nuestra app.

directorio

Ahora tenemos ya el directorio dentro de nuestro proyecto

Directorio importado

Ya casi esta!

Ya solo nos queda modificar nuestro Delegado con la configuración correspondiente para inicializar una instancia compartida de urbanairship.

En nuestro AppDelegate.h añadimos la siguiente linea:

– (void)failIfSimulator;

Importamos las siguientes clases en el AppDelegate.m:

#import “UAirship.h”
#import “UAPush.h”
#import “UALocationCommonValues.h”
#import “UAAnalytics.h”

Dentro del método application:didFinishLaunchingWithOptions añadimos el siguiente código:

//Init Airship launch options
NSMutableDictionary *takeOffOptions = [[[NSMutableDictionary alloc] init] autorelease];
[takeOffOptions setValue:launchOptions forKey:UAirshipTakeOffOptionsLaunchOptionsKey];

// Create Airship singleton that’s used to talk to Urban Airship servers.
// Please populate AirshipConfig.plist with your info from http://go.urbanairship.com
[UAirship takeOff:takeOffOptions];

Llamamos a [UAirship land] en el Terminate:

– (void)applicationWillTerminate:(UIApplication *)application {
[UAirship land];
}

Llamamos al registerForRemoteNoticiationTypes dentro del método application:didFinishLaunchingWithOptions:

// Register for notifications
[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)];

Y añadimos el registro de tu device token a los servidores de Urbanairship:

– (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// Updates the device token and registers the token with UA
[[UAirship shared] registerDeviceToken:deviceToken];
}

“That’s all, folks”! Amigos.

Si ejecutamos nuestra aplicación en el simulador podemos ver que ya nos advierte de que no podemos recibir notificaciones en el simulator:

Simulator con urbanairship

Ahora viene lo divertido, vamos a obtener nuestro device token para enviar nuestro primer push notification desde Urbanairship.Conecta tu iphone o Ipad a tu equipo y ejecuta ahora la aplicación en tu dispositivo desde Xcode.

Cuando la aplicación se este ejecutando lanzará el depurador y si todo ha ido correctamente,podrás ver esta linea a mitad del código mostrado en el depurador:

user with content: {“device_tokens”:{“add”:[“e99cc909f00d2f0490a524e84d60de1739b19****************”

depurador

Y ahora viene lo interesante, ya que si podemos visualizar nuestro device tokens se abra añadido automáticamente a los servidores de Urbanairship y ya estamos listos para enviar nuestro primer push notification.

Accede a tu aplicación y pulsa en el enlace “Device tokens” para comprobar que todo esta correcto y tu device token aparece ya registrado.
device token

Pulsa ahora en la pestaña “Send Broadcast” para enviar el push notification:

Enviar notificación

Y voilà, nuestra push notification personalizada con el icono de la NSCoder Sevilla.

Send Push Notification

Si recibes un error del tipo “-[AppDelegate application:didFailToRegisterForRemoteNotificationsWithError:] [Line 143] Failed To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 “falta la clave de autorizaci√≥n ‚Äúaps-environment‚Äù v√°lida para la aplicaci√≥n” UserInfo=0x1960e0 {NSLocalizedDescription=falta la clave de autorizaci√≥n ‚Äúaps-environment‚Äù v√°lida para la aplicaci√≥n}”
es probable que no hayas creado correctamente el bundle identifier o el Provisioning Profile.Revisa estos parámetros y asegurate que creas correctamente tu certificado push, su exportación una vez instalado correctamente y su subida al servidor de Urbanairship.En la pestaña “Resources” de la web de Urbanairship puedes encontrar toda la información para integrar esta librería en tus aplicaciones.Espero haberte ayudado.
Suerte