google cloud messaging for android
DESCRIPTION
Google Cloud Messaging for Android (GCM) es una servicio que ayuda a los desarrolladores a enviar datos desde servidores a aplicaciones en dispositivos Android.TRANSCRIPT
Google Cloud Messaging for Android
Google Cloud Messaging for Android (GCM) es una servicio que ayuda a los desarrolladores a
enviar datos desde servidores a aplicaciones en dispositivos Android. Esto podría ser un
mensaje diciendo a la aplicación Android que hay nuevos datos que recoger del servidor (por
ejemplo, una película cargada por un amigo), o podría ser un mensaje que contiene hasta 4kb
de datos carga útil (así las aplicaciones de mensajería instantáneas por ejemplo podrían
obtener el mensaje directamente). El servicio GCM maneja todos los aspectos de cola de
mensajes y entrega a la aplicación Android de destino.
GCM es completamente gratis y no importa cuan grande son tus necesidades de mensajería, y
no hay cuotas.
Google introdujo en Android, a partir de la versión 2.2 (Froyo), la posibilidad de implementar
notificaciones de tipo push, lo que significa que es el servidor el que inicia el proceso de
notificación, pudiendo realizarla en el mismo momento que se produce el evento, y el cliente
se limita a “esperar” los mensaje sin tener que estar periódicamente consultando al servidor
para ver si existen novedades, y sin tener que mantener una conexión permanentemente
abierta con éste. En la arquitectura de Google, todo esto se consigue introduciendo un nuevo
actor en el proceso, un servidor de mensajería push o cloud to device (que se traduciría en
algo así como “mensajes de la nube al dispositivo”), que se situaría entre la aplicación web y la
aplicación móvil. Este servidor intermedio se encargará de recibir las notificaciones enviadas
desde las aplicaciones web y hacerlas llegar a las aplicaciones móviles instaladas en los
dispositivos correspondientes. Para ello, deberá conocer la existencia de ambas aplicaciones,
lo que se consigue mediante un “protocolo” bien definido de registros y autorizaciones entre
los distintos actores que participan en el proceso.
Este servicio de Google recibió en sus comienzos las siglas C2DM (Cloud to Device Messaging),
pero recientemente y coincidiendo con su salida de fase beta ha modificado su nombre a GCM
(Google Cloud Messaging).
Lo primero que hace es darnos de alta en el servicio, que a pesar de ser gratuito requiere de un
proceso previo de registro y la generación de una ApiKey.
GCM: Introducción
Creación de un proyecto con el API de Google
1- Abrir el Google APIs Console page.
2- Si todavía no has creado un proyecto, esta página le pedirá que lo haga:
Nota: Si ya has creado un proyecto, la primera página que veras será el Dashboard.
Desde ahí podrás crear un nuevo proyecto abriendo el Menu de Proyectos haciendo
un Drop-down y eligiendo Other projects>Create.
3- Clic en crear proyecto. La URL de tu navegador cambiará a algo similar a esto: https://code.google.com/apis/console/#project:4815162342
4- Tomar nota del valor después de #project: (en este ejemplo 4815162342). Este es tu project ID, y este ID será usado luego como el ID del GCM sender.
Habilitando el servicio GCM
Para habilitar el servicio GCM seguir los siguientes pasos:
1- En la página de la consola de Google Api, seleccionar Services
2- Cambiar Google Cloud Messaging a ON
3- Aceptar los terminos de Servicio
Obteniendo el API Key
1- En la página de la consola del API de Google, seleccionar el API Access. Veras una
pantalla parecida a la siguiente:
2- Click en Create new Server Key. Ya sea una clave de servido (server Key) o una llave
navegador (browser key) debería funcionar. La ventaja de usar un server key es que te
permite tener una lista blanca o whitelist de direcciones IP.
3- Click en Create
Con esto ya nos habríamos registrado correctamente en el servicio GCM y habríamos generado
nuestra API Key para identificarnos, con lo que estaríamos en disposición de construir nuestras
aplicaciones cliente y servidor.
Para asegurar la correcta comunicación entre los tres sistemas se hace necesario un protocolo
de registros y autorizaciones que proporcione seguridad y calidad a todo el proceso. Este
proceso se resume en el siguiente gráfico:
Fuente Grafico: www.sgoliver.net
Explicación
a- Autenticación de nuestra aplicación web en el servicio GCM. En la anterior versión del
servicio GCM (llamada C2DM) esto debía hacerse mediante la utilización de otra API de
Google llamada ClientLogin, o a través del protocolo OAuth 2.0, ambas dirigidas a
obtener un token de autorización que debía enviarse posteriormente en el resto de
llamadas al servicio. Sin embargo, con la llegada de Google Cloud Messaging, esto se
ha simplificado mediante la obtención y uso de una API Key. Como pasaba con el token
de autorización, nuestra nueva API Key deberá acompañar a cada una de las llamadas
que hagamos al servicio GCM desde nuestra aplicación web.
Los siguientes pasado, ya sí mostrados en el diagrama, serían los siguientes:
1- El siguiente paso es el equivalente al ya comentado para el servidor pero esta
vez desde el punto de vista de la aplicación cliente. La aplicación Android debe
registrarse en los servidores GCM como cliente capaz de recibir mensajes desde
dicho servicio. Para esto es necesario que el dispositivo/emulador cumplan una
serie de requisitos:
a. Disponer de Android 2.2 o superior.
b. Tener configurada una cuenta de Google en el dispositivo o emulador.
Configurable desde “Ajustes / Cuentas y sincronización”.
c. Si se trata de un dispositivo real debe estar instalada la Google Play
Store. Por el contrario si estamos ejecutando la aplicación desde el
emulador bastará con usar un target que incluya las APIs de Google. 2- Si el registro se finaliza correctamente se recibirá un código de registro (Registration
ID) que la aplicación cliente deberá conservar. Además, la aplicación Android deberá
estar preparada para recibir periódicamente refrescos de este código de registro, ya
que es posible que el servidor GCM invalide periódicamente este ID, genere uno nuevo
y lo vuelva a notificar a la aplicación cliente.
3- Este nuevo paso consiste en enviar, desde la aplicación cliente a la aplicación servidor,
el código de registro GCM recibido, el cual hará las veces de identificador único del
cliente en el servidor de forma que éste pueda indicar más tarde el dispositivo móvil
concreto al que desea enviar un mensaje. La aplicación servidora tendrá que ser capaz
por tanto de almacenar y mantener todos los ID de registro de los distintos
dispositivos móviles que se registren como clientes capaces de recibir mensajes.
4- El último paso será obviamente el envío en sí de un mensaje desde el servidor hasta un
cliente determinado, algo que se hará a través del servidor GCM (paso 4.1) y desde
éste se dirigirá al cliente concreto que debe recibirlo (paso 4.2).
Instalar las librerías del Helper Desde el SDK Manager, ir a Extras > Google Cloud Messaging for Android Library. Esto creará
un directorio gcm en la dirección YOUR_SDK_ROOT/extras/google/ conteniendo estos sub-
directorios:
- gcm-client, gcm-server,
- samples/gcm-demo-client
- samples/gcm-demo-server
- samples/gcm-demo-appengine.
Escribiendo una Aplicación Android
Paso 1: Copiar el archivo gcm.jar dentro del classpath de la aplicación
Para escribir en tu Aplicación Android, primero debes copiar el archivo gcm.jar desde el
directorio del SDK/gcm-client/dist al classpath de tu aplicación
Paso 2: Realizar los siguientes cambios en el manifest de la aplicación Android
1- GCM requiere una versión de Android 2.2 o mayor, así que si tu aplicación no puede
funcionar sin GCM, agregar la siguiente línea, donde xx es la versión más reciente del
SDK
2- Declarar y usar un permiso personalizado para que solo esta aplicación pueda recibir
los mensajes GCM <permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name=" my_app_package.permission.C2D_MESSAGE" />
Este permiso debe ser llamado my_app_package.permission.C2D_MESSAGE (donde
my_app_package es el nombre del paquete de tu aplicación según la definición en el
tag del manifest), de otra manera no funcionara.
3- Añadir los siguientes permisos
4- Añadir el siguiente Broadcast Receiver:
Este broadcast receiver es responsable de manejar 2 eventos que pueden ser enviados por el
GCM (com.google.android.c2dm.intent.RECEIVE y
com.google.android.c2dm.intent.REGISTRATION) y deberían ser definidos en el
manifest (antes que programáticamente) así estos eventos pueden ser recibidos incluso si la
aplicación no esta corriendo. Seteando el permiso
com.google.android.c2dm.permission.SEND te aseguras que solo el evento enviado
por el sistema GCM es enviado al receptor. Una aplicación regular no puede emitir eventos con
estos permisos.
5- Agregar el evento service
Nota: ¿Qué es un Broadcast Receiver?
Un Broadcast Receiver es una especie de receptor de los eventos que produce el sistema
operativo Android. Típicamente, un Broadcast Receiver se utiliza para mostrar
notificaciones de los eventos que ocurren en nuestro teléfono móvil, como por ejemplo el
descubrimiento de una red wifi o el agotamiento de la batería.
Este evento service será llamado por el GCMBroadcastReceiver (La cual es proveida
por la librearía GCM). Debería ser una subclase de
com.google.android.gcm.GCMBaseIntentService, debería contener un contructor
público, y debe ser nombrado my_app_package.GCMIntentService (a menos que se use
una subclase de GCMBroadcastReceiver que remplaza el método utilizado para nombrar
el servicio).
El evento service también debe definir el ID de su remitente(s). Esto se hace como sigue:
Si el valor es estático, el constructor por defecto del servicio debería llamar a
super(senderIds).
Si el valor es dinámico, el servicio debería anular el metodo getSenderIds ().
Paso 3: Escribir la clase my_app_package.GCMIntentService
A continuación escribir la clase my_app_package.GCMIntentService, remplazando los
métodos siguientes (que son llamados por GCMBroadcastReceiver):
onRegistered (Context context, String regId): Se llama después de que
un evento de registro es recibido, se pasa el ID de registro asignado por el GCM
al par dispositivo / aplicación como parámetro. Por lo general, se debe enviar el
redId al servidor para que pueda usarlo para enviar mensajes a este dispositivo.
onUnregistered (Context context, String regId): Se llama después de que
el dispositivo ha sido des registrado desde el GCM. Por lo general, se debe
enviar el regIid al servidor entonces se des registra del dispositivo.
onMessage (Context context, Intent intent): Se le llama cuando el
servidor envía un mensaje al GCM, y el GCM lo entrega al dispositivo. Si el
mensaje tiene una carga, sus contenidos están disponibles como extras en el
intent.
onError (contexto Contexto, String errorId): Se llama cuando el dispositivo
intenta registrarse o desregistrarse, pero el GCM ha devuelto un error. Por lo
general, no hay nada que hacer que no sea evaluar el error (devuelto por errorId)
y tratar de arreglar el problema.
onRecoverableError (Context context, String errorId): Se llama cuando
el dispositivo intenta registrarse o desregistrarse, pero los servidores GCM no
están disponibles. La librearía GCM volverá a intentar la operación utilizando
un backup exponencial, a menos que este método se remplace y retorne falso.
Este método es opcional y debe ser anulada sólo si se desea mostrar el mensaje
al usuario o cancelar los reintentos.
Escribir el main activity Agregar el siguiente import en el main activity
import com.google.android.gcm.GCMRegistrar;
En el método onCreate(), añadir el siguiente código:
El metodo checkDevice() verifica que el dispositivo soporta GCM y lanza una
excepción si no (por ejemplo, si es un emulador que no contiene el API de Google).
Similarmente, el método checkManifest() verifica que el manifest de la aplicación
cumpla con todos los requerimientos descriptos en Writing the Android Application
(este método es solo necesario cuando se esta desarrollando la aplicación; una vez que
la aplicación esta lista para ser publicada se puede removerla).
Una vez que los controles de corrección se realizan, el dispositivo llama a
GCMRegsistrar.register() para registrar el dispositivo, pasando el SENDER_ID que
se consiguió cuando te inscribiste al GCM. Pero dado que el singleton GCMRegistrar
comprueba el ID de registro en el momento de la llegada del evento de registro, se
puede llamar a GCMRegistrar.getRegistrationId() primero para chequear si el
dispositivo ya esta registrado.
Fuentes:
- http://developer.android.com
- http://www.sgoliver.net