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);

Leer Más