aws pinpoint

Introducción

Este fin de semana, fue un largo fin de semana. Estuve trabajando desde el jueves todo el día hasta tarde, ¿Qué paso? Un compañero no se daba abasto con las cosas que tenia asignado, yo creo que pudo delegar o no se confió, no sabría decirles.

Por lo pronto decidí ayudarlo. Unas de las tareas a realizar era hacer funcionar las notificaciones push para android y ios. Yo ya conocía el sistema de notificaciones push que tiene aws, que se llama pinpoint y la documentación de aws es muy completa y basta. Ademas contiene una sección para implementar el API utilizando postman.

Manos a la obra

Así que me puse manos a la obra, probé postman y vi que funcionaba rápidamente. También que existía una librería aws-requests-auth que hace la autentifica con aws de a través del rest api.

Pues hice un pequeño backend, como no había que realizar muchas cosas, utilice los siguientes paquetes

django_micro

Esta muy interesante esta app de django. Es para usar django en un solo archivo, a la flask way!

app
├── main.py
├── .env
└── migrations
    └── 0001_initial.py

Así que tenia definido en este archivo app/main.py

django-dotenv

Este paquete de django te permite cargar configuraciones definidas en un archivo .env entonces ya no tienes que depender de un local_settings.py si no ya en el archivo le avientas todas las configuraciones

Aplicación dummy de ionic/cordova

Primero hice la api básico: GET apps El cual me responde bien. Pase a hacer el registro de dispositivo, que para pinpoint se llama registro de endpoint. Lo implemente. Y ahora hay que probarlo desde un dispositivo. Como tengo un android. Encontré en la documentación. Un pequeño aplicación dummy para el registro de devices y recepción de notificaciones. Funciona de maravilla!, se registra el dispositivo! Realice pruebas con la consola de pinpoint de aws. Y la notificación push llegaba, pero no se despliega.

Este es el mensaje que se envía.

# ionic code 

    pushObject.on('registration').subscribe((data: any) => {
      console.log("device token:" + data.registrationId);
    });

    pushObject.on('notification').subscribe((data: any) => {
        console.log('>>>> message'+JSON.stringify(data));
    }


# consola de android

>>>> message{"additionalData":{"pinpoint.openApp":"true","pinpoint.notification.title":"test1",
    "pinpoint.notification.body":"test2","pinpoint.campaign.campaign_id":"_DIRECT",
    "coldstart":false,"pinpoint.notification.silentPush":"0","foreground":true}}

Cheque la documentación y como menciona que las pruebas de consola de mensajes son notificaciones silenciosas no se ven. Para esto estaba muy feliz con muy poco esfuerzo, logre hacer el 50% del objetivo. Ahora solo falta enviar la notificación desde api.

Notificaciones en android

Nota:* En android existen 2 notificaciones segun la documentación:*

La normal:

{
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon"
    }
  }

Y la silenciosa o datos:

{
   "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
   "data" : {
     "Nick" : "Mario",
     "body" : "great match!",
     "Room" : "PortugalVSDenmark"
   },
 }

Esto es importante por que el esto hizo que mentara madres! lo mismo aplica para ios.

No manda notificaciones push, faltan llaves!

Después de mi felicidad, me voy como mis compañeros que desarrollan la api. Y les explique que ya había avanzado, logrando registrar el dispositivo, que implementaran en el cliente el registro de devices.

Realice el otro 50% del backend el envío de campañas usando httpie

En aws pinpoint creas una campaña la cual posee un segmento en este defines a quienes les va llegar la notificación. Al segmento puse ALL y ahora si! Ya lograba mandar la campaña desde un rest api. Con mensajes de título dinámicos.

Cuando hago la prueba para enviar la notificación. El mensaje push llegaba pero siempre silenciosa, nunca se desplegaba. Prueba tras prueba, cambiando el formato de la notificación estuvimos un rato enviando y recibiendo push notify silenciosos. Volví a revisar la documentación y hace referencia a implementar una librería de aws https://aws-amplify.github.io/docs/android/push-notifications-handle-fcm Era necesario utilizar un sdk y meterle mas libs al cliente android. Mis compañeros me decían Solo manda bien el json y la notificación se envía bien. Estaban a la idea de no modificar mas la aplicación metiéndole mas overhead de libs. De echo la documentación te permite meterle un JsonRaw. Pero este jsonRaw venia como silenciados. Y seguía dándole vueltas en círculos.

Al inspeccionar la librería amplify sdk de android. Y ver el código fuente. Me doy cuenta de lo que hace en realidad.

Ya tenia mas de varias horas revisando El por que siempre llegaban silenciadas y esa era la respuesta!!!

Conclusión: AWS no te manda la notificación normal siempre te manda la información silenciosa

Debido a que tiene siempre tiene el manejo de tracking: cuantos mensajes fueron enviados, cuantos fueron entregados, cuantos fuero abiertos. Por esto si no usas el sdk de pinpoint (amplify) tu notificación nunca sera mostrada. Para poder realizar este tracking necesita aws. parsear la información para despues desplegar la notifcación por código.

Cuando me doy cuenta pego el grito al cielo…..

Los chicos que hicieron la app en ios y en android. Sé la rifaron y lograron hacer la notificación push por código. Al recibir la campaña. Pero fue una gran problema, por que si! La documentación es larga clara. Pero no es precisa. Hasta que logre revisar el código me doy cuenta que por que siempre envía la notificación silencia.

El backend funciona pero no esta implemetado al 100% del lado del cliente debido a falta de tiempo.

Esta fue mi historia.