Configurando Notificaciones Push para desarrollos Android con Google Cloud Messaging.

14
133258

Configurando Notificaciones Push para desarrollos Android con Google Cloud Messaging.

0. Índice de contenidos.


1. Introducción

En términos de tecnología de movilidad, las Notificaciones Push son aquellos mensajes que recibimos en el dispositivo y que han sido emitidos desde cualquier punto de un sistema. Tenemos un ejemplo muy claro en el popular WhatsApp, donde son los usuarios los que envían mensajes a los dispositivos de otros usuarios. Otro ejemplo con notificaciones enviadas de manera automática (y no manual como WhatsApp) podría ser una aplicación de cliente de correo, cuando el servidor detecta un mensaje entrante envía una notificación al dispositivo del usuario.

Las Notificaciones Push permiten el envío de mensajes desde cualquier parte de un sistema a una aplicación móvil tanto si la aplicación está siendo utilizada por el usuario, si está corriendo en un segundo plano, si todavía no ha sido arrancada o, incluso, si el dispositivo está en reposo.

En este tutorial intentaremos explicar cómo poder recibir Notificaciones Push en nuestra aplicación Android haciendo uso del servicio de mensajería en la nube: Google Cloud Messaging.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.2 Ghz Intel Core I7, 8GB DDR3).
  • Sistema Operativo: Mac OS X Mavericks 10.9


3. ¿Cómo funcionan las notificaciones con Google Cloud Messaging?.

Las notificaciones Push en Android mediante Google Cloud Messaging (GCM) se ejecutan en un escenario que está compuesto por, al menos, tres actores:

  • Google Cloud Messaging: El servicio de Google habilitado para el envío de Notificaciones Push a dispositivos Android.
  • Servidor: con un servicio (REST, SOAP, aplicación web, etc…) que será el encargado de gestionar los identificadores de registro de dispositivos a los que podemos enviar las notificaciones y de comunicarse con GCM solicitando el envío de notificaciones al dispositivo (o dispositivos) deseado.
  • Dispositivo Android: que recibirá las notificaciones.

Para poder enviar notificaciones a un dispositivo Android desde GCM dicho dispositivo debe estar antes registrado en el servicio.


3.1 El registro del dispositivo.

Lo primero que debemos hacer para que nuestra aplicación Android pueda recibir Notificaciones Push desde Google Cloud Messaging (GCM) será registrarla en dicho servicio. Es una forma de decirle a GCM: «soy un dispositivo que quiere recibir notificaciones de una aplicación». La forma que tenemos de decirle la aplicación de la que queremos recibir notificaciones es indicándole un número de proyecto (lo veremos en el siguiente apartado). Esto sería lo equivalente al paso 1 del diagrama que viene a continuación.

Si todo está correcto, GCM nos responderá con un identificador de registro. Algo del tipo:

APA33bH6YRxig6cFFUE_utY2aEaEhVThPDkh5xQ6pFbjf-GKkSLZceGkCy8wjhx8QxdfgpMbFSZnAqPcJ5hmDhgkKOULj0UQd759gifSXiNnsNn4UcMvjNKKyk9dsI6n_WJYEfAc6DDy934l1cgxBzs1iNCldq2VnQ
 

Esto se correspondería con el paso 2 del diagrama.

Device registration

¿Y qué hacemos con ese identificador de registro?. Pues ahí es donde entra en juego nuestro nuestro servidor, en concreto el servicio que tenemos desplegado en él.

Lo que haremos será enviar ese identificador a nuestro servicio (vía HTTP, por ejemplo…) de forma que éste lo pueda almacenar ya que lo necesitará cuando se comunique con GCM para indicarle que debe enviar una notificación (lo veremos en el siguiente punto). Por supuesto, esa petición de envío del identificador de registro la podemos complementar con cualquier otra información adicional como el usuario del dispositivo, caracterísiticas o lo que sea ya que el servicio es nuestro. Esto sería lo relativo al paso 3 del diagrama.


3.2 El envío de la notificación.

Podemos enviar una Notificación Push a cualquiera de los dispositivos Android que tengamos registrados en nuestro servicio desde cualquier parte del sistema.

Para ello, nuestro servicio tendrá una operación donde recibirá la información relativa al mensaje que queremos enviar en forma de notificación y el destinatario o destinatarios. La información relativa al destinatario puede ser directamente el identificador del registro u otra información que el servicio sepa relacionar con dicho identificador de registro. Esto sería lo equivalente al paso 1 del siguiente diagrama.

Send notification

A continuación, con la información de la petición de envío de notificación que recibió nuestro servicio, éste envía una nueva petición a GCM (puede hacerse de manera síncrona o asíncrona: HTTP o XMPP) para que mande la notificación al dispositivo. El destinatario de la notificación se indica mediante el identificador de registro que obtuvimos en el punto anterior. Necesitaremos adjuntar unas credenciales de servidor a nuestra petición. En el punto siguiente veremos cómo obtenerlas. Esto sería lo equivalente al punto 2 del diagrama.

Una vez que hemos enviado la petición a Google Cloud Messaging con nuestras credenciales del servidor, la información relativa a la notificación y su destinatario, GCM enviará dicha Notificación Push. Paso 3 del diagrama.


4. Habilitando el servicio Google Cloud Messaging.

Para habilitar el servicio Google Cloud Messaging debemos seguir una serie de sencillos pasos:

Device registration


4.1 Creando un proyecto Google API.

Lo primero que haremos será crear un proyecto en Google API, para ello accedemos a la consola de desarrolladores de Google con nuestro usuario.

Create Project

En la sección «Projects» pulsamos sobre el botón «Create Project», le asignamos un nombre y ya tendremos nuestro proyecto creado. Nos aparecerá una pantalla donde podremos ver información relevante a dicho proyecto.

Project Info

Para las Notificaciones Push, el campo que más nos interesa será Project Number. Dicho número es necesario para el paso de registro del dispositivo en GCM tal y como vimos en el punto 3.1. Dicho Project Number será algo del tipo:

231447612989


4.2 Habilitando la opción Google Cloud Messaging.

Una vez tenemos el proyecto creado, lo siguiente que haremos será habilitar el servicio de Google Cloud Messaging. Para ello, pulsamos en el menú de la izquierda sobre APIS & AUTH > APIs y activamos el servicio «Google Cloud Messaging for Android» (por defecto estará desactivo).

Enable GCM


4.3 Obteniendo la clave de acceso al API.

Por último, necesitaremos tener una clave de acceso a nuestro API para que podamos enviar peticiones a GCM y que éste las sirva las notificaciones al dispositivo o dispositivos destino. Esta clave de acceso será utilizada por nuestro servicio tal y cómo vimos en el paso 2 del envío de la notificación.

Para generar la clave de acceso que usará nuestro servidor pulsamos en APIS & AUTH > Credentials y en la sección Public API Access, pulsamos sobre el botón «Create New Key». En el diálogo que nos aparecerá, pulsamos en «Server Key».

Generate server key

Y con esto obtendremos la clave de acceso a nuestra API que será utilizada por nuestro servicio.

Server key

Nuestra API key sería algo del tipo:

AIveCyANz3H5MuOgDWrC6xkdECqRbIOHBzOQDC6


5. Nuestro servicio.

Como vimos anteriormente, además del servicio en la nube Google Cloud Messaging necesitaremos nuestro propio servicio que se encargue de, al menos, registrar los identificadores de registro que nos devuelve GCM y de enviar las notificaciones a los dispositivos.

Device registration

Hemos creado un sencillo servicio REST en Java con Spring MVC que se ocupa de ambas cosas. Podéis encontrar el código fuente aquí.


5.1 Registrando los identificadores de registro de GCM.

La primera de las dos cosas que, al menos, debe realizar nuestro servicio es registrar los identificadores de registro que devuelve GCM cuando un dispositivo quiere recibir notificaciones. Mediante el identificador de registro le comunicamos a GCM a qué dispositivo queremos que se envíe la notificación.

Nuestro dispositivo móvil, una vez haya recibido el identificador de registro de GCM deberá enviar una petición a nuestro servicio con dicho identificador para que quede registrado (ver registro del dispositivo). La petición sería algo como:

Url: http://localhost:8080/gcm-rest/api/registrations
Content-Type: application/x-www-form-urlencoded
Method: POST
Params: registrationId=APA33bE8f_SCHrrUvTlfibvAyfpk3Ai9YoEIAPhn74tVkryBLolM0RHdbh53tC27VdRcMTWwyervn4zL4SiDewp103qV1Rx_AaGs9szEnT1TKoatWm9p-4WLuGUiVvDy2VVoMy5X2YupjtKD-XC8Bf6b-4MW7U_mdojhU9JB1CD0-MIUW9qFNY0


5.2 Enviando las notificaciones.

Este punto se correspondería con el paso 1 del proceso de envío de la notificación

Si queremos enviar una notificación a uno o varios de nuestros disposivitos previamente registrados deberemos hacer una petición indicando diferentes campos (ver envío de la notificación):

  • badge: número mayor que 0 que aparecerá en el texto de la notificación. Indica el número de notificaciones que el usuario tiene pendientes de leer.
  • title: el título del mensaje de nuestra notificación.
  • message: el cuerpo del mensaje.
  • registrationIdsToSend: listado de identificadores de registro de dispositivos a los que queremos que llegue la notificación.

La petición de envío a de notificación a uno o varios dispositivos sería algo como (acepta también formato XML):

Url: http://localhost:8080/gcm-rest/api/notifications
Content-Type: application/json
Method: POST
Request Raw Body: 
{
	"badge":1,
	"title":"Notification title",
	"message":"A message",
	"registrationIdsToSend":[
	"APA91bE9f_SCHrrUvTlkibvAyfpk3Ai9YoEIAPhn50tVkryBLolM0RHdbh53tC27VdRcMTWwyervn4zL4SiDewp103qV1Rx_AaFs9szEnT1TKuptWm9p-4WLuGUiVvDy2VVoMy5X2YupjtKD-XA8Bf6b-4MW7U_mdojhU9JB1CD0-MIUW9qFNY0",
	"OAN64bE7f_SCHrrUvTlkibvAyfpk9Ai3YoEIAPhn49tVkryaaOlC3LAdbh33tC42VdRcMTWwyervn5zL6SiDewp456qV1Rx_AaFs1szEnT1TKuptWm4p-5WLuGUiVvDy7VVoMy8X0YepjtKD-WA3Bf2a-1MW8P_mdojhU9JB2CD6-MIUW5qFNY4"
	]
}

Aunque no nos vamos a meter en detalles (os dejo el código fuente del servicio), cabe destacar que Google nos proporciona una librería en Java para poder conectar desde nuestro servidor con Google Cloud Messagging. Podéis añadir la siguiente dependencia en vuestro proyecto Maven.


	
		com.google.android.gcm
		gcm-server
		1.0.2
    



	
	
		gcm-server-repository
		https://raw.github.com/slorber/gcm-server-repository/master/releases
	


6. Condiciones que debe cumplir nuestra aplicación.

Device registration

Para que nuestra aplicación Android pueda recibir notificaciones Push, debe cumplir con dos condiciones:


6.1 Configurar Google Play Services.

Antes de habilitar Google Cloud Messaging debemos asegurarnos de que instalados los Google Play Services en nuestra SDK. Para ello, en nuestro Android SDK Manager, en la sección «Extras» podemos instalarlos en el caso de que lo hubiéramos hecho ya.

Add Google Play Services

Para poder probar el proyecto necesitaremos un dispositivo Android con versión 2.3 o superior y Google Play Store instalado. Si deseamos probarlo en un emulador, podremos hacerlo con nuestro dispositivo virtual (AVD) con Android 4.2.2 o superior.


6.2 Habilitar los permisos necesarios.

Además de los servicios de Google Play, nuestra aplicación necesitará una serie de permisos para poder enviar y recibir notificaciones. Tales permisos se configuran en el fichero AndroidManifest.xml y son los siguientes:

  • com.google.android.c2dm.permission.RECEIVE: permiso para que la aplicación se pueda registrar en GCM y recibir mensajes.
  • android.permission.INTERNET: aunque no es obligatorio si que es muy recomendable. Gracias a este permiso podremos enviar el identificador de registro que hemos obtenido de GCM a nuestro servidor.
  • android.permission.GET_ACCOUNTS: este permiso es necesario para versiones de Android inferiores a 4.0.4. Es necesario ya que GCM requiere una cuenta de Google.
  • android.permission.WAKE_LOCK: permiso para mantener la pantalla apagada cuando llega una notificación.
  • <paquete de la aplicación>.permission.C2D_MESSAGE: permiso para que únicamente esta aplicación pueda registrarse en GCM y recibir mensajes.

Además de habilitar los permisos citados anteriormente, necesitaremos:

  • Un receptor (receiver): con el siguiente permiso habilitado com.google.android.c2dm.permission.SEND de forma que GCM pueda enviarle mensajes y con el que podremos tratarlos.
  • Un servicio: al que el receptor le envía el mensaje que recibió mientras se ocupa de que el dispositivo no se quede dormido en el proceso.

Nótese que, si para desarrollar nuestra aplicación utilizamos un framework cross-platform tipo Phonegap (Cordova) o Titanium, este proceso nos lo podríamos ahorrar mediante la configuración automática del plugin de notificaciones de cada uno de estos frameworks. Si el desarrollo es nativo debemos hacerlo manualmente.


7. Referencias.

  • Código fuente del servicio.
  • Google Play Messaging for Android
  • Google Developers Console
  • Implementing GCM Client
  • Setting Up Google Play Services


8. Conclusiones.

En este tutorial hemos visto cómo habilitar las Notificaciones Push para que puedan ser enviadas a nuestra aplicación Android haciendo uso de Google Cloud Messaging. Las notificaciones son una característica muy interesante que nos proporcionan los dispositivos móviles y cuyo uso puede estar especialmente indicado en aplicaciones como: chats, herramientas de trabajo colaborativo, sistemas de alertas y monitorización, etc…

En próximos tutoriales veremos cómo desarrollar una aplicación que reciba Notificaciones Push desde Google Cloud Messaging en un dispositivo Android.

Cualquier duda en la sección de comentarios.

Espero que este tutorial os haya sido de ayuda. Un saludo.

Miguel Arlandy

marlandy@autentia.com

Twitter: @m_arlandy

14 COMENTARIOS

  1. Muy bueno éste tutorial, pero tengo un problema.

    Estoy utilizando una extensión de Chrome DHC(https://chrome.google.com/webstore/detail/dhc-rest-http-api-client/aejoelaoggembcahagimdiliamlcdmfm/related) para probar los envíos de notificaciones.
    Cuando hago la petición por POST contra mi servidor local, obtengo un error 415:
    El servidor rechazó este requerimiento porque la entidad requerida se encuentra en un formato no soportado por el recurso requerido para el método requerido.
    http://10.200.241.204:8080/gcm-rest/api/notifications

    {
    \»badge\»:1,
    \»title\»:\»Test DHC\»,
    \»message\»:\»Test de envio desde DHC\»,
    \»registrationIdsToSend\»:[
    \»APA9…\»
    ]
    }

    Alguna sugerencia?

  2. Hola Scyla,

    Pues la verdad es que parece que está todo bien. ¿Te has asegurado de que existe la cabecera Content-Type: application/json en tu petición?

    Saludos!

  3. muy bueno el tutorial ,, mas me podria ayudar .. de q modo puedo enviar notificaciones desde un app(cliente) a otra app, con nodejs por medio(como servidor) usando socket.io. gracias!

  4. Excelpente tutorial, me arecio sumamente inrteresante, el dia de hoy hare las pruebas para desarrollar una pequeña aplicacion con notificaciones push.

    Muchas gracias.

  5. Perdón por mi ignorancia pero realmente quiero que mi primera aplicación que hice ofrezca notificaciones. Mi pregunta es: ¿Exactamente en que directorio de mi app debi incluir los archivos que descargué de github?
    Saludos

  6. Similar a lo que planteas, estoy buscando una aplicación para android en la que puedas recibir todas las notificaciones de otro android, poder contestarlas e incluso poder llamar, similar a la de un smartwatch, pero desde dos celulares con android…

  7. Hola Miguel, estoy haciendo una aplicación para enviar notificaciones a varias personas, similar a la aplicación Uber. y esto al aceptar la notificación debe retornar al usuario indicando que fue aceptado su notificación. me podría dar un alcance de como desarrollarlo.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad