Google Cloud Messaging. Parte V: 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 V de un conjunto de entradas sobre Google Cloud Messaging (GCM).


En esta parte vamos a ver el funcionamiento de la parte del servidor. Partimos de la base de que conocemos el Registration ID de los dispositivos a los que vamos a enviar notificaciones. El comportamiento estándar sería aquel en el cual nuestra aplicación cliente manda una petición a nuestro servidor cuando recibe su Registration ID y el servidor lo almacena en una base de datos para recuperarlo posteriormente.

Para enviar una notificación tendremos que enviar una petición POST a la siguiente dirección:

https://android.googleapis.com/gcm/send

El contenido de la petición debe ir en formato JSON (como alternativa también se puede usar texto plano). En la cabecera debemos especificar que el tipo de contenido es JSON: “Content-Type: application/json” e indicar nuestra API Key: “Authorization: key=YOUR_API_KEY”.

Formato del contenido JSON

El contenido JSON puede contener los siguientes campos:

  • registration_ids.
    Es el único campo obligatorio. Es un array de cadenas (o strings) que representan los registration IDs de los dispositivos que van a recibir la notificación. Mínimo debe contener un valor.
  • collapse_key.
    Cadena de texto que se usa para unificar varios mensajes en una sola notificación. Este mecanismo se usa cuando un dispositivo pasa de estar desconectado a conectado, y recibe demasiados mensajes de golpe. Para evitar este molesto resultado, tan sólo le llegaría la última notificación junto con el texto especificado en este campo.
  • data.
    Objeto JSON que representa los pares de clave-valor de la información del mensaje. Estos pares clave-valor serán pasados en el Intent que se reciba en la aplicación. Se recomienda el uso de cadenas de texto para los valores, ya que de todas formas serán convertidos a este tipo. La única limitación es que el tamaño total del mensaje no exceda los 4kb.
  • delay_while_idle.
    Valor booleano (por defecto es falso) que indica si la entega del mensaje debe retrasarse hasta que el dispositivo esté activo.
  • time_to_live.
    Valor numérico que indica cuántos segundos debe mantenerse el mensaje en los servidores de GCM si el dispositivo no está activo. El valor por defecto son 4 semanas.
  • restricted_package_name.
    Cadena de texto que contiene el nombre del paquete de nuestra aplicación. Si se especifica este valor, sólo se enviarán los mensajes a los registration IDs que concuerden con el paquete.
  • dry_run.
    Valor booleano (por defecto es falso) que indica si el mensaje es de prueba, es decir, el mensaje no va a ser enviado realmente a los dispositivos.

Un ejemplo sencillo de un mensaje sería este:

{ "data": {
    "mensaje": "Nueva oferta",
    "id": "16044"
  },
  "registration_ids": ["1", "2", "3"]
}

Envío en PHP

El envío de mensajes puede realizarse desde cualquier tecnología que nos permita realizar una petición de tipo POST.
A continuación se muestra el código para enviar el mensaje del ejemplo anterior en lenguaje PHP.

$apiKey = 'xxxxxxxxx_xx_xxxxxxx';

// Cabecera
$headers = array('Content-Type:application/json',
                 "Authorization:key=$apiKey");

// Datos
$payload = array('mensaje' => utf8_encode('Nueva oferta'),
                 'id' => '16044');
$registrationIdsArray = array('1', '2', '3');

$data = array(
   'data' => $payload,
   'registration_ids' => $registrationIdsArray
);

// Petición
$ch = curl_init();
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch, CURLOPT_URL, "https://android.googleapis.com/gcm/send" );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data));

// Conectamos y recuperamos la respuesta
$response = curl_exec($ch);

// Cerramos conexión
curl_close($ch);
Share Button

7 Comments

  1. Hola Belen
    Muy buenos tutoriales, disculpa soy nuevo en android y tengo que hacer una aplicacion donde comunique un android con una pagina web y guarde informacion que le mande el android en la BD de la pagina web y tambien que la pagina web le envie datos y se pueda observar en el android.
    Mi consulta es si podria usar GCM en este caso ?? O de que modo lo podría hacer ??
    De antemano muchas gracias.

    1. Hola, el uso de GCM es para que el servidor se comunique con la aplicación cliente sin que ésta inicie la comunicación primero. Por tanto, si lo que quieres es que tu aplicación envíe información a tu servidor y que éste responda, no necesitas GCM para nada. Sería un servicio web normal y corriente.

    1. El Id de los dispositivos se obtiene cuando éstos se registran. Lo puedes ver en la parte IV del tutorial, enlace aquí. Como verás en el apartado del “Servicio receptor”, el método “onRegistered” recibe el ID que deberá ser enviado al servidor, el cual posteriormente enviará los mensajes.

Deja un comentario

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

Time limit is exhausted. Please reload the CAPTCHA.