Las notificaciones push se han convertido prácticamente obligatorias en las aplicaciones móviles desde que aparecieron por primera vez. Una de las mayores ventajas de las notificaciones Push es la posibilidad de enviar información relacionada sin tener que entrar en la aplicación y verificar las novedades de forma manual con el servidor. Esto, además de cómodo ahorra batería y carga de CPU. No tenemos que olvidar que otra de las ventajas de estas notificaciones es la posibilidad que nos brinda de tener a los usuarios informados y de alguna manera enganchados aún cuando la aplicación no esta en marcha.
Para nuestro ejemplo, vamos a usar Azure Notification Hubs, plataforma que nos permite enviar notificaciones push a cualquier plataforma de forma escalable y sin tener que configurar ningun sistema de envio. La combinacion de Azure con Xamarin lo convierten en una tarea realmente sencilla.
Para poder llevar a cabo este ejemplo es necesario tener una cuenta activa en Azure. Si no, se puede crear una cuenta de prueba gratuita en pocos minutos en el portal de azure
Autorizando y provisionando
A diferencia de las notificacioneks locales, hay que registrar en App ID con Apple para activar las notificaciones push para poder trabajar con ellas incluso aún qué nuestra aplicación esté en debug.
Para configurar los certificados y provisionar los perfiles necesarios, los más sencillo es acceder a la página de xamarin donde nós detalla cada paso mediante ilustraciones sencillas y difícil de mejorar.
Una vez seguida la guía hasta el final tendremos el certificado PKCS12.cert (Personal Information Exchange) él cual vamos a necesitar para configurar el Azure Notification Hub.
Configuracion de Azure
Accedemos al portal de Azure y accedemos con nuestras credenciales. Lo primero sera darle a «+ New» que aparece en la parte izquierda y escribiremos notification hub y seleccionamos en servicio Notification Hub y clicamos en el boton inferior Create.
A continuación hay que rellenar una serie de datos obligatorios para poder crear nuestros servicio de notificaciones. Una vez completados todos los campos le datos a Create.
NOTA: Prestar especial atención al campo Pricing tier, asegurate de elegir Free para este ejemplo no necesitamos generar ningún gasto y además siempre podemos ampliar el servicio si lo deseamos.
Bien, una vez que tenemos nuestro Notification Hub listo para usar tenemos que ir al apartado Manage, elegir Notification Services y despues Apple APNS. En este paso necesitamos cargar el certificado .p12 que hemos creado antes. Es importante asegurarse de que el modo de autenticación esta marcado en Certificate, seleccionamos el fichero e introducimos la contraseña para el certificado si la tenemos declarada. A continuación elegimos Sandbox en Application Mode y clicamos Save. Llegados a este punto ta tenemos listo el Notification Hub para usarlo en nuestra programación.
Por último sin salir de Azure, necesitamos obtener la cadena de conexión para su posterior uso. Esta podemos encontrarla en Manage > Acess Policies y copiar la cadena de texto para la politica DefaultListenSharedAccessSignature.
Hora de programar
Ahora solo nos falta añadir unas pocas lineas de codigo a nuestra app para empezar a recibir notificaciones push desde nuestro Azure Notification Hub, Con Xamarin.iOS es realmente sencillo, con solo añadir el paquete NuGet Xamarin.Azure.NotificationHubs.iOS al proyecto
Añadimos las siguientes variables a la clase AppDelegate:
1 2 3 4 |
//Declaracion de variables para las notificaciones push private SBNotificationHub Hub { get; set; } public const string ConnectionString = "Azure-EndPoint"; // DefaultListenSharedAccessSignature public const string NotificationHubPath = "Nombre-AzureNotificationPush"; |
Implementaremos los isguientes metodos del sistema para prepararlos para recibir las notificaciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions) { // Esta linea de codigo inicializa Xamarin Test Cloud Agent #if ENABLE_TEST_CLOUD Xamarin.Calabash.Start(); #endif var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound , new NSSet()); UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); UIApplication.SharedApplication.RegisterForRemoteNotifications(); return true; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) { //Creamos un nuevo hub de notificaciones con la cadena de conexion y la ruta del hub Hub = new SBNotificationHub(ConnectionString, NotificationHubPath); //Eliminamos los registros que pudieran haber de instancias anteriores Hub.UnregisterAllAsync(deviceToken, (error) => { if (error != null) { //Error al eliminar los registros return; } }); //Registrar el dispositivo para las notificaciones Hub.RegisterNativeAsync(deviceToken, null, (registerError) => { if (registerError != null) { //No se pudo realizar el registro } }); } |
1 2 3 4 5 6 7 8 9 10 11 12 |
public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo) { //Este metodo es llamado cuando se recive una notificacion remota //Si la aplicacion esta en primer plano y no de fondo if(null != userInfo && userInfo.ContainsKey(new NSString("aps"))) { NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary; } } |
Probando
Instalamos la app en un dispositivo iOS desde Visual Studio y apretamos en el boton de inicio para mandar la aplicación a segundo plano. Volvemos al portal Azure y desde nuestros servicio de notification hub nos dirigimos a Support + Troubleshooting > Test Send.
Desde aquí podemos enviar notificaciones a nuestra app para poder comprobar el funcionamiento correcto. Únicamente hay que establecer la plataforma Apple y clicar en Send. La notificación puede tardar hasta un minuto antes de visualizarse en el dispositivo dependiendo de las conexiones, aun que lo habitual es que tarde escasos segundos.
El código completo lo teneís en Github donde solo hará falta sustituir la cadena de conexion y el nombre del servicio push que hayais creado en Azure.