Parseando Notificaciones Push

Todos estos últimos días los he dedicado a la rama WebServices en la que sigo trabajando duro. El código cada vez se complica más y realizar las pruebas oportunas cada vez es más lento debido a que tengo que simular peticiones al servidor, respuestas, etc. Pero bueno, aunque no esté avanzando al ritmo que quisiera, voy resolviendo los problemas que van surgiendo, que no es poco.

En lo último destacable que he estado trabajando es en probar toda la infraestructura de la recepción de una notificación. Desde que nos llega al smartphone proveniente de la Nube GCM de Google, hasta que se la mostramos al usuario en forma de notificación latente en la Barra de Notificaciones de Android.

Durante este proceso, los pasos que se siguen son los siguientes:

  1. Recibimos la notificación en la función que en su momento definimos para ello, dentro del código de nuestra aplicación.
  2. Comprobamos el tipo de Notificación que es. Android, más concretamente GCM, cuando te envía una notificación te dice el tipo que es, si es de Error, de Eliminación o Normal y corriente, como es nuestro caso.
  3. Procesamos esa notificación:
    1. La notificación llegará en formato JSON (que es como la enviamos al servidor GCM desde nuestro servidor propio de Node.js)
    2. Convertimos esa estructura JSON en varias entradas en nuestra BBDDs Local. Esto es debido porque no sólo se creará la fila dentro de la tabla de Qdadas, correspondiente, sino que además se creará una fila por cada fecha propuesta para la realización de la Qdada en la tabla FechasQdada. Hay que tener en cuenta que viene todo en crudo, por lo que habrá que crear los Usuarios en Local, si no existen, que representen al Creador e Invitados de la Qdada. Convertir las fechas al objeto Date de Java, etc, etc.
    3. Finalmente actualizamos todos los datos de la BBDD Local, una vez parseada y estructurada la información que nos llega en el JSON de la Notificación Push
  4. Si el paso anterior ha ido con éxito, procedemos a Mostrar la Notificación en el Área de Notificaciones de Android (falta personalizarla un poco, texto a mostrar, icono, etc.)
  5. Hacemos sonar un sonido para alertar al usuario que tiene una nueva notificación.

Cuando el usuario haga click en dicha notificación, la idea es que le lleve directamente al Fragment que permite seleccionar los días que podemos asistir de la Qdada. De momento está simplemente que lleve al Home de la Aplicación.

Y esto es todo. En cuestión de contenido para rellenar un post no es mucho, pero el trabajo ha llevado lo suyo, más que nada, por realizar las pruebas y tener que comunicar a la app Android con el servidor Node.js para crear toda la lógica real necesaria de un envío de Notificación Push, todo esto con un sólo usuario, por lo que he tenido que emular muchas partes del proceso.

El siguiente paso es probarlo ya en un entorno real con varios usuarios y un funcionamiento cotidiano para ver como se desenvuelve la app y si hay algún problema. Como he dicho he probado distintas partes del proceso por separado, pero no el ciclo de vida completo de un uso normal de la app.

Como siempre, aquí teneis el Commit de lo explicado: COMMIT

4 pensamientos en “Parseando Notificaciones Push

  1. Hola Paco,

    Gracias por este artículo, resulta bastante esclarecedor. La duda que tengo, y que no sé si has llegado a aclararla, es el proceso de timeouts de las sesiones. Cuando registras un dispositivo contra la nube GCM, usas el método gcm.register(id) (siendo gcm una instancia de GoogleCloudMessaging, el caso es, ¿tiene esto un timeout tras el cual expira la sesión? ¿ha de comprobarse siempre que la sesión esté creada? ¿es el servidor remoto (el que tienes que montar tú) el que debe manejar el timeout?

    Muchas gracias.

    • Correcto, Google puede renovar el ID del servicio GCM cada cierto tiempo (ahora desconozco por qué lo haría), pero lo puede refrescar y así lo advierte en la documentación (http://developer.android.com/google/gcm/adv.html#reg-state), aunque no es una práctica habitual. Lo bueno es que cada vez que pides tu IdGCM, te dará el mismo, a no ser que lo renueve. Me explico. Si tu te registras ahora, y cada vez que entres en la app te vuelves a internar ‘registrar’ en el servicio de GCM, este te devolverá el mismo ID que te dió cuando te registraste por primera vez. El Id es unívoco para el SmartPhone/Tablet-Aplicación, es el par que tiene en cuenta para generarlo. Así que lo que yo hago, es que cada vez que el usuario entre en la app, solicito el IdGcm a la nube de Google. Es la App Android quien lo solicita, no mi servidor Node.js. Si este ha cambiado, envío la petición a mi Servidor Node.js para que proceda a modificarlo, y lo hago en Local, en la BBDD de Android de mi aplicación. De hecho, lo que ahora mismo hago es mandar una petición, tanto a la BBDD Local, como a la BBDD del servidor de la creación de un nuevo usuario, pero estas funciones, tanto la del servidor como la de local, comprueban si el usuario ya existe, si existe lo que hacen es modificar el nuevo IdGcm, si hubiese cambiado. Cierto es que realizando esto me falta la situación en el la que el usuario, por determinadas causas, no entre nunca en la app, por lo que si en el hipotético caso, por ejemplo, el IdGcm ‘caduca’ por causas extrañas, y el usuario no ha entrado cuando ha caducado, este no se va a renovar, y si alguien le quiere mandar alguna notificación, pues no le va a llegar. Pero eso tiene fácil arreglo, mediante una ‘alarma’ en background que se ejecute cada X tiempo y que se encargue de pedir el IdGcm, si el usuario no ha entrado a la app desde hace Y tiempo. De esa manera podemos cerciorarnos si ha cambiado o no el IdGcm en el caso de que el usuario no abra la aplicación Android. Esta debe ser la que haga la petición a la nube de Google, no puede ser el servidor que nos montamos, ya que como dije antes el IdGcm se genera a partir del par Smartphone/Tablet/Aplicación, me imagino que cogerá el IMEI del SmartPhone y el paquete de la aplicación, pero esto no le se con exactitud, pero algo de eso debe ser :). Como ves es fácil solucionar esta situación, aunque como te comentaba no es relativamente frecuente que Google te renueve el IdGcm.

      Saludos, 😉

Deja un comentario