8
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:

Google Cloud Messaging for Android

Embed Size (px)

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.

Citation preview

Page 1: Google Cloud Messaging for Android

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:

Page 2: Google Cloud Messaging for Android

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:

Page 3: Google Cloud Messaging for Android

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

Page 4: Google Cloud Messaging for Android

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”.

Page 5: Google Cloud Messaging for Android

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" />

Page 6: Google Cloud Messaging for Android

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.

Page 7: Google Cloud Messaging for Android

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.

Page 8: Google Cloud Messaging for Android

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