Saludos, gente! Después de un largo tiempo de para por motivos laborales, hoy vengo con algo que tal vez puede ser completamente diferente a lo que veniamos tratando, son las conocidas notificaciones push, pero en ésta ocasión usaremos como transportador Amazon Simple Notifications(SNS).

Hace poco en la infraestructura de un proyecto se estableció utilizar SNS para enviar notificaciones push a diversos usuarios(Android e IOS), para ese momento se me vino a mi mente dos preguntas: ¿Que fuc*** son notificaciones push? y ¿Qué car**** es AWS SNS?, he aquí las respuestas:

  • Notificaciones Push: Mensajes directos a celulares(creelo, no sabía como se llamaban).
  • Amazon SNS: Servicio web de Amazon que coordina y administra la entrega de mensajes a los puntos de enlace o clientes suscritos a ellos.

Vamos al grano

Si estas aquí ya deseas seguramente que deje de escribir tanta palabrería y nos metamos a la acción xD, lo haremos, pero antes debes saber lo siguiente: que tal cual como esta en el título, daremos los pasos necesarios para enviar notificaciones push pero desde la perspectiva del Backend, es decir debemos tener el apoyo de un desarrollador de android o ios para obtener las identificaciones únicas de dispositivo(más adelante hablaremos de esto), con ello podrás probar el funcionamiento y el flujo completo. Muy bien ahora sí, frotate las manos.

Servicio SNS

Ojo, estoy asumiendo que ya debes tener una cuenta de AWS

¿Listo(a)?, bien, debes dirigirte la búsqueda de servicios y escribir SNS, rápidamente debe salirte la sugerencia del servicio en cuestión.

aws-sns

Cuando te encuentres adentro, vas a estar ubicado en el dashboard, el cual tiene el siguiente aspecto:

AWS-SNS-dashboard

Aquí veremos ciertas opciones:

  • Create topic: Crea un canal, esto permite enviar mensajes masivos a los dispositivos suscritos a él.
  • Create platform application: Asocia la aplicación de una plataforma(android, ios, windows phone, etc) a SNS.
  • Create subscription: Suscribe dispositivos a un canal.
  • Publish message: Envía un mensaje a un dispositivo individual o un canal.

Agregando plataformas

Como nuestro objetivo es envíar notificaciones a android e IOS, sólo trabajaremos con dichas plataformas, si necesitas agregar otra plataforma puedes seleccionarla de la siguiente lista.

AWS-SNS-plataformas

SNS para android

Si bien la plataforma actual de envío de notificaciones push es firebase, en su momento se utilizó Google Cloud Messaging(GCM), sin embargo SNS es capaz de soportar Firebase sin ningún problema.
plataforma-android

Al seleccionar la platform name Google Cloud Messaging(GCM) debes completar los campos restantes:

  • Application name: Nombre para identificar la aplicación.
  • API key: Clave de API de tu aplicación.

Nótese que estamos pidiendo un API key, para esto en el caso que no lo sepas debe proporcionartelo quien esté desarrollando la aplicación luego de registrarla en Firebase. Para más información puedes darle un vistazo a este link.

SNS para IOS

En este caso los requisitos para una aplicacion de la mazanita son mayores que para los de android, pero no te desanimes, esto es muy común si has trabajado con IOS anteriormente. Algo muy importante es que debes seleccionar en que entorno de desarrollo quieres probar las notificaciones, desarrollo(development) o produccion(production), para ambos casos los campos necesarios son los mismos.

push-notification-ios

Para proceder debemos completar las siguientes credenciales de tu aplicación:

  • Application name: Nombre para identificar la aplicación.
  • Push certificate type: Tipo de certificado, en este caso es ios push certificate.
  • Choose P12 file: Certificado P12, que te identifica como desarrollador de Apple.
  • Certificate: Certificado extra.
  • Private key: Clave privada de tu aplicación.

Si tienes algún problema, puedes revisar la documentación oficial aquí.

Applications y ARN

Luego de registrar tus aplicaciones puedes revisarlas en la seccion Aplications, allí encontrarás una vista muy similar a esta

applications-sns

¿Que hay de raro allí?, claramente es el último campo llamado ARN(Amazon Resource Name) que no lo hemos puesto en ningún lado, si no que se ha generado automáticamente, ese identificador es único e irrepetible, nos va a servir para diferenciar un recurso de otro que se encuentre alojado en Amazon.

Entra al arn de android o de ios, según la plataforma que asociaste a AWS SNS, tendrás una vista como la siguiente, aquí podremos registrar dispositivos a los cuales queremos enviarle notificaciones push.

plataforma-arn

Agregando un dispositivo al ARN de la aplicación

Para poder registrar un nuevo dispositivo debemos obtener su identificador de dispositivo o ID de registro, este ID es proporcionado cuando es instalada una aplicación en un dispositivo móvil, ya debes imaginar que en una aplicación real por debajo debes obtenerla de alguna forma en tu api backend, sin embargo puedes pedirle que te la proporcione el desarrollador de android o Ios con el que estas trabajando.

Cuando le des click a Create platform endpoint, se mostrará la siguiente ventana.

endpoint-punto-de-enlace

Cualquier plataforma que uses siempre te pedirá esos mismos datos.

  • Device token: El ID de token o el ID de registro que mencionamos antes.
  • User Data: Esto es opcional, pero puedes escribir cualquier dato aquí, no excedas los 2kb.

Con esto ya tienes agregado un dispositivo con su respectiva plataforma, y para sorpresa de nosotros se ha generado un endpoint ARN, desde ahora puedes usar ese endpoint para enviar mensajes directos al dispositivo o suscribirlo a un canal.

tabla-endpoint

Y eso justamente es lo siguiente que realizaremos, enviar un mensaje push a nuestro nuevo endpoint.

Enviando un mensaje push a un endpoint

Amazon nos brinda una interfaz práctica para enviar mensajes, solo debes seleccionar el endpoint al que quieres enviarle el mensaje y finalmente presionar Publish to Endpoint, eso nos lleva a lo siguiente:

sns-mensaje-endpoint

Más allá de que muestra a que endpoint se va a enviar el mensaje y el ARN de la aplicación a la cual esta asociada y la plataforma seleccionada, tenemos otros campos que podemos completar.

  • Message Format: El formato del mensaje, que puede ser raw o json.
  • Message: El mensaje en sí.
  • Time to live (TTL): Tiempo que dispone el servicio de mensajes para intentar enviarlo.
  • Message Attribute: Atributos (clave, valor) extras que puedes enviar junto con el mensaje.

No hay problema si quieres utilizar el JSON Message Generator para crear una estructura básica para tu mensaje de acuerdo a la plataforma, lastimosamente no se crean automáticamente atributos de personalización de la notificación, tales como titulo, cuerpo, sonido, etc. Pero tranquilamente podemos agregarlo nostros mismos.

Un dato importante, cuando enviemos un mensaje con la consola de amazon se debe anteponer un carácter de escape, de la siguiente forma

{\"clave\": \"valor\"}

Finalmente dale un click a Publicar!, en instantes deberías estar recibiendo una notificación push al móvil asociado al endpoint destinatario.

Mensajes push masivos

Cuando necesitamos enviar masivamente mensajes a diversos dispositivos, podemos confiar en los topics(temas), el cual utiliza los puntos de enlace(endpoints) para suscribirlos a las actualizaciones de un canal sns especifico.

Creando un Tema, Topic, Canal o como le quieras llamar xD

Esto es muy sencillo con la interfaz web que nos brinda Amazon, simplemente debes dirigirte a las pestaña topics y obtendrás lo siguiente

aws-sns-topics

Luego de hacer click en Create New Topic se desplegará un modal que nos pide ingresar el Topic name, allí ingresa el nombre que prefieras, para este ejemplo es opcional ingresar el display name, así que puedes omitirlo, a continuación clickea en Create topic para observar lo siguiente:

nuevo-tema-topic

Si te das cuenta se ha generado un nuevo ARN específico para el tema, veamos que nos trae en sus detalles:

detalle-topic

¿Ya te vas familiarizando con los ARNs?, con todo lo que hemos visto espero que sí. Estoy seguro que fácilmente puedes identificar el ARN, el dueño del tema, y la región a la que pertence ese tema, hasta quí nada nuevo.

Suscribir un endpoint a un tema

Ahora lo siguiente es suscribir un endpoint de dispositivo al nuevo tema que se ha creado. Para ello dale click en Create Subscription y verás lo siguiente:

suscripcion-topic

Ingresa los datos necesarios para completar la suscripción:

  • Topic ARN: ARN del tema al cual se va a suscribir el dispositivo.
  • Protocol: Protocolo de envio de mensajes, en este caso es correcto seleccionar Application.
  • Endpoint: Endpoint del dispositivo que se va a suscribir al tema.

Si todo es correcto simplemente verás que se ha generado un ID de suscripción, otros datos para identificar el endpoint, el protocolo, propios de la suscripción.

suscripcion-endpoints

Enviando un mensaje a un tema

En el paso anterior creamos una suscripción, lo siguiente es ejecutar el envio de un mensaje, para hacerlo ingresa a Publish to Topic, tendrás la siguiente ventana, prácticamente similar a la view cuando enviamos un mensaje directo a un endpoint.

topic

Nota que el ARN del tema esta para únicamente leerlo, puedes agregarle un asunto, y para el mensaje en sí podemos utilizar de igual forma el JSON Generator.

generador-json

Solo hemos marcado las 3 casillas porque no necesitamos estructuras para otras plataformas, escribe tu mensaje y observa como la consola de Amazon nos resume un poco el trabajo.

json-generator

  • default: Mensaje por defecto en caso no exista una clave de configuración para una determinada plataforma.
  • APSN: Configuración de IOS para producción.
  • APSN_SANDBOX: Configuración de IOS para desarrollo.
  • GCM: Configuración de Android.

Ahora simplemente debemos publicar el mensaje(Publish message) y ver la magia en el móvil.

Paquete para node

Ya sabes que me dedico a este mundillo del desarrollo, y personalmente me encanta javascript, y por lo tanto node.js, por fortuna encontré una librería del 2015(es antigua, sin embargo SNS no estan nuevo que digamos -.-), si deseas darle un vistazo hablamos de sns-mobile.

Estructura básica del mensaje para multiples plataformas

Amason SNS, permite que tengas un nivel de personalización por cada plataforma a la cual quieras enviarle una alerta, en este caso podemos utilizar la siguiente estructura para enviar mensajes a IOS Development o SANDBOX(APNS_SANDBOX), IOS Production(APNS) y Android(GCM).

{
 default: 'Mensaje por defecto si no se encuentra la configuración de una plataforma',
 APNS: {
  aps: {
   alert: {
    title: 'Titulo de notificación',
    body: 'Cuerpo de notificación'
   },
   sound: 'default'
  },
  data: {
   extra: 'Mi campo personalizado'
  }
 },
 APNS_SANDBOX: {
  aps: {
   alert: {
    title: 'Titulo de notificación',
    body: 'Cuerpo de notificación'
   },
   sound: 'default'
  },
  data: {
   extra: 'Mi campo personalizado'
  }
 },
 GCM: {
  notification: {
   title: 'Titulo de notificación',
   body: 'Cuerpo de notificación'
   sound: 'default'
  },
  data: {
   extra: 'Mi campo personalizado'
  }
 }
}

Si quieres saber más acerca de la estructura de mensajes para las notificaciones, míra la documentación en este enlace.


fiesta-brad-pitt

Gracias al post ahora no te perderás el fin de semana, hemos logrado enviar notificaciones push de una manera simple y rápida con AWS SNS, coméntame que tal te pareció esta nueva entrega y no olvides seguirnos en redes sociales para que seas de los primeros en recibir la notificación cuando lancemos un nuevo post, ¡hasta la próxima!