Google Cloud Messaging. Parte VI: Respuesta al envío de mensajes

The Google Cloud Messaging (GCM) guide can be found here and is available in English, therefore I am writing these related posts in Spanish.

Esta es la parte VI de un conjunto de entradas sobre Google Cloud Messaging (GCM).


Cuando desde nuestro servidor enviamos una solicitud de envío de mensaje al sistema de GCM, éste nos envía un mensaje de respuesta. Es muy importante que leamos e interpretemos este mensaje y no asumir que nuestro mensaje fue enviado correctamente.

Encontramos dos niveles de errores: un primer nivel donde el error se produce en el envío de nuestra solicitud a los servidores GCM, y un segundo nivel donde el error se produce en el propio contenido de la solicitud. La siguiente figura representa de forma esquemática cómo puede ser una respuesta del sistema de GCM. Se toma como base que la solicitud se construye en formato JSON, y por tanto, la respuesta también se recibe en este formato. Existe la posibilidad de que este mismo proceso se realice en texto plano.
Message response

Código HTTP

El código del estado de la respuesta HTTP puede tener los siguientes valores:

  • 200
    La solicitud ha sido recibida correctamente. En este caso debemos examinar el cuerpo de la respuesta tal y como vemos en la figura anterior.
  • 400
    La solicitud no pudo ser interpretada como JSON, o la estructura del JSON era incorrecta. En el contenido de la respuesta se incluye la descripción detallada del error ocurrido.
  • 401
    Error autenticando a nuestro servidor. Revisa que la API Key sea la correcta.
  • 5xx
    Error interno del sistema de GCM. No tenemos que hacer nada en este caso, tendremos que intentarlo más tarde.

Contenido JSON

Si la solicitud fue correcta y obtenemos el código 200, el contenido vendrá estructurado en formato JSON con los siguientes campos:

  • multicast_id.
    Identificador único de la solicitud.
  • success.
    Número de mensajes procesados correctamente. Hay que recordar que en una solicitud podemos indicar una lista de receptores.
  • failure.
    Número de mensajes con error.
  • canonical_ids.
    Número de resultados que incluyen identificadores canónicos. Un identificador canónico es el identificador de registro que debemos usar para un dispositivo concreto. Esto quiere decir que el identificador de registro que tenemos almacenado en nuestro servidor es incorrecto por existir otro más reciente. Puede producirse esta situación si por mal funcionamiento de nuestra aplicación cliente, se solicitan dos registros del mismo dispositivo al sistema de GCM.
  • results.
    Listado del estado concreto de cada uno de los mensajes (cada uno de los identificadores de registro enviados en la solicitud) con los siguientes posibles campos:

    • message_id.
      Si existe este campo, es porque el mensaje es correcto. Representa su identificador.
    • registration_id.
      Si existe este campo, quiere decir que este mensaje es uno de los que se han contado para el campo “canonical_ids”. Contiene el identificador de registro válido.
    • error.
      Tipo de error.

Tipos de error

Estos son los tipos de errores que pueden producirse para un receptor concreto:

  • NotRegistered.
    El identificador ya no está registrado en GCM. Debe ser borrado de tu servidor.
  • MessageTooBig.
    El tamaño del mensaje no puede exceder los 4096 bytes.
  • MismatchSenderId.
    El grupo de emisores de los mensajes que puede recibir el identificador de registro no coincide con tu servidor.
  • MissingRegistration.
    No se encontraron identificadores de registro a quienes enviar el mensaje.
  • InternalServerError.
    Error en GCM, por lo que podemos intentar enviar la solicitud de nuevo. Puede producirse también como código HTTP 500.
  • InvalidDataKey.
    Los datos del mensaje contienen una clave que no puede ser usada debido a que es una clave que se usa internamente por GCM. Tendrás que cambiar el nombre de tu clave.
  • InvalidPackageName.
    El nombre del paquete asociado el identificador de registro no se corresponde con el de nuestra API key.
  • InvalidRegistration.
    El identificador de registro es incorrecto. Comprueba que se están enviando, guardando y recuperando correctamente.
  • InvalidTtl.
    El campo del tiempo de vida del mensaje no es válido. Recuerda que debe ser un entero entre 0 y 2.419.200 que representa segundos, el máximo son 4 semanas.
  • Unavailable.
    El servidor GCM tardó mucho tiempo en procesar la solicitud, por lo que podemos intentar enviar la solicitud de nuevo. Puede producirse también como código HTTP 500.

 

Share Button

20 Comments

    1. Eclipse no debería usarse más para crear aplicaciones Android. Deberías usar Android Studio. GCM sirve para que la aplicación reciba una notificación de, por ejemplo, un nuevo mensaje. A partir de ahí, si la app está activa, se puede conectar con el servidor de forma normal para seguir recibiendo o enviando información.

  1. Las aplicaciones tienen los topics limitados, cuando me registro en mas de 7 topics algunos no llegan al dispositivo, aunque el GCM me contexta success de la peticion.

  2. Buenas, gran artículo.
    Quería saber si el GCM que limitaciones tiene.
    Como el numero de dispositivos que reciben un mensaje por un topic.¿ Puedo tener 15000 dispositivos escuchando el topic global?

    1. Hola, gracias por tu comentario. Desconozco estos límites ya que no hay documentación sobre ello, pero 15000 dispositivos no me parece un número muy elevado para tener problemas. Ten en cuenta que hay aplicaciones móviles con muchísimos más usuarios.

  3. Hola Belén, buenísimos tutoriales. Mi duda es la siguiente, si mando un push y el cliente no lo abre, al mandar el siguiente suple al primero y desaparece esa información. Para que esto no suceda, hay que cambiar el código de la app o es cuestión del servicio en php????

    1. Hola, muchas gracias por tu comentario. La decisión de cómo tratar tus notificaciones depende del código en tu app. El servicio que recibe los eventos de GCM en tu app es el que se encarga de crear la notificación. Por tanto, puedes tomar la decisión que mejor se adapte a tu caso, dependiendo del tipo de notificación o del contenido.

  4. Buenos días, existe información de cuál es el tiempo de respuesta de este servcio? es decir si yo envío x cantidad de mensajes a GCM, cuánto tiempo tarda en enviar los mensajes Push?.
    He visto comentarios en la Red de desarrolladores que dicen que si se envían cierta cantidad de no llegan o llegan mucho tiempo después.

    1. No existe información oficial sobre esto. Dependerá de la carga del sistema, del estado de la red, del dispositivo, … No es tampoco algo que puedas controlar por ti mismo.

  5. Muy buenos los tutoriales..pero..me ocurre algo extraño…. registra el movil todo ok..entro a la app y me dice que esta registrado….pero si desintalo la app y vuelvo a instalarla, nuevamente se registra en la nube… y me quedo con 2 regId..luego puedo mandar notificaciones al movil con cualquiera de esos dos regId……. no logro validar eso aun que desintale la aplicacion valide de igual manera que el equipo ya se registro …. alguna sugerencia?

    1. Cuando la app vuelve a registrarse, tu servidor no debería quedarse con 2 IDs, debería quedarse con el último ID recibido. Puede que inicialmente te funcionen los 2 IDs, pero al final, uno dejará de funcionar.

  6. Hola Belén excelente tutorial, es muy claro y preciso, felicidades.
    Por otro lado quisiera saber si existen algo así como un tipo de notificaciones que no se muestren en pantalla si no que desencadenen algún evento en la aplicación, por ejemplo yo mando una notificación a un terminal, y quiero que esta notificación no se muestre si no que una vez haya sido recibida por el terminal, este empiece a mandar su ubicación obtenida del gps a un server, y al mandar otra notificación este terminal la procese y deje de enviar las notificaciones. Se puede hacer algo así con las notificaciones. Gracias!!!

    1. Cuando la aplicación recibe una notificación, la acción a realizar depende de lo que tú quieras implementar. Si no quieres que se muestre, no la mostrarás, si quieres ignorarla, puedes ignorarla. La única restricción es que cuando llega una notificación, lo que se ejecuta es un servicio, no una actividad. Así que puedes realizar cualquier cosa que puedas realizar desde un servicio.

  7. Estupendo artículo Belén!!!
    Gracias por compartirlo.

    No obstante tengo una duda…
    Es posible enviar notificaciones push a un dispositivo sin la obligación de desarrollar una aplicación en Android? es decir, que alguna parte del sistema operativo android se encargue de mostrar un simple mensaje que envíe el servidor.
    Domino PHP, CSS, HTML, Javascript, pero nada de JAVA para Android…

    Gracias de nuevo

    1. Muchas gracias! Respecto a tu duda, me temo que no puede hacerse lo que comentas. Para que un servidor pueda enviar mensajes a través de GCM debe darse de alta a través de una aplicación. Al contrario, el dispositivo para poder recibir mensajes, debe obtener un Registration ID a través de una aplicación concreta.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Time limit is exhausted. Please reload the CAPTCHA.