Notificaciones Push con GCM y PHP
Informática | 11/07/2012

Para empezar, aunque vamos a centrarnos en las notificaciones desarrolladas por Google, deciros que hemos utilizado una librería con posibilidades de expansión a productos de Apple y Microsoft de forma muy sencilla.

Sin duda, si eres programador o Geek tecnológico, si te interesan las “Push Notifications” y/o has programado o tienes previsto programar Apps que hagan uso de esta forma de comunicación, seguramente te interese este artículo. Hablaremos de como hemos hecho para ahorrar en infraestructura evitando utilizar servicios Java y sustituyendo por el lenguaje estándar “de facto” en los servicios web como es PHP.

Hoy toca hablar un poquito de los últimos movimientos que se están consolidando entorno al desarrollo sobre movilidad. En esta ocasión os presentamos la implementación de las “Push Notification” que han hecho los chicos de Google y nuestra adaptación a un entorno ligero. Bastante expectación hubo en los círculos de desarrolladores entorno a Google I/O 2012 que tuvo lugar los días 27 y 28 de Junio de 2012. En este evento fue donde presentaron la maduración de un proyecto bastante interesante llamado Google Cloud Messaging, maduración del ya antiguo C2DM.

Para los profanos en la materia, decir que con el sistema GCM podremos llevar a nuestras plataformas móviles los desarrollos propios que implementen o hagan uso de las llamadas “Push Notification” o “Mensajes Push”. Ahora está en boca de todos hablar sobre estos temas pero, exactamente ¿qué quiere decir notificaciones push?. Pues no sabemos si exactamente o no, pero lo que debemos de tener muy claro es que es una forma de programar que se ideó justo cuando salieron al mercado los actuales gestores de correo. Es la forma en la que las Apps clientes son informadas sobre ciertas novedades o eventos evitando tener que consultar el estado del buzón de forma automática. Pues bien, ¿Qué conseguimos con ello? En primer lugar ahorramos en la tarifa de datos, pues las consultas al servidor se harán de forma pasiva, solo se realizarán cuando el servidor tenga algo nuevo que decir; en segundo lugar, y como es lógico pensar, ahorraremos en el consumo de batería, pues se hace un uso optimizado de los recursos del teléfono.

Pues bien, ¿Cómo implementamos esta maravilla? Como siempre, lo mejor es visitar la web del fabricante. Si necesitamos “ir al grano” recomendaría que le echarais un vistazo al proyecto demo. Aquí nos dicen como construir una App para Android que haga uso de un servicio GCM implementado con Servlet de Java que corren sobre un Tomcat. Pues bien, a continuación describiremos la traducción a lenguaje PHP precisamente de este último proyecto. Es decir, con la misma App Android podremos hacer uso de un servicio web hecho con tecnología mucho más barata, ya que los requisitos de hardware para correr este tipo de aplicaciones de servidor son mucho menores no restando en absoluto calidad alguna.

Más abajo adjuntamos los fuentes que vamos a describir a continuación. El archivo comprimido dispone de los siguientes directorios y ficheros:

library → Contiene las clases del Zend Mobile, en breve irán incorporandolas a Zend Framework, el famoso paquete de software PHP.

utils → Fuentes que hacen uso de las clases anteriores y de MySQL para proveer servicios accesibles y amigables.

conexion.php → Como su nombre indica, nos da el acceso a la base de datos donde se almacenarán los dispositivos registrados en el sistema y que serán los que deben ser informados de cualquier evento.

GCMConfiguration.php → Define todas las variables necesarias para poder conectarnos con la base de datos y el servicio GCM de Google.

GCMUtils.php → Librería de funciones que harán la escritura de código más cómoda. Es una abstracción de las clases de Zend Mobile.

GcmServer → Sencillo script al que llaman los terminales móviles para indicar al servidor que se suscriben al servicio GCM. Básicamente lo que hacemos es asociar un terminal a una huella. En caso de que el servidor tuviera nueva información que notificar utilizaría el stock de huellas e iría informando a cada una de ellas.

SendingMessageFromBrowser.php → Script al que se accede vía web y que informa del número de huellas registradas en nuestro servicio. Dispone de un botón con el que se envía un mensaje con contenido de prueba.

Una vez entendidos los requisitos que suplen los scripts señalar que las funciones más interesantes que se utilizan son las siguientes.

getRegisteredDevices() → Devuelve un array con los dispositivos registrados. No tiene parámetros.

sendGCM($registeredDeviceID, $valuesTOGCMMessage) → Método utilizado para enviar notificaciones. El primer parámetro es una cadena y puede recibir, o bien el senderID (consulta la documentación oficial de GCM) o la huella registrada. El segundo espera un Array. Este representa el mensaje que se envía.

Y con esto acaba nuestra pequeña aportación. Agradecer al creador de Zend Mobile (@mwillbanks) el apoyo que hemos recibido para montar este proyecto y a Jaro (@jampgold) por evitar que nos diluyamos entre las mil y una posibilidades que nos ofrece PHP. Esperamos que os haya gustado. Conscientes de que todo es mejorable, no te cortes, envía tu comentario y no dejes de visitar www.yinyan.es.

Descarga el proyecto aquí.

Comentarios

15 - - 26/01/2015 18:05
error 404 al intentar descargar el proyecto
14 - Claudio Suriano - 29/05/2013 02:54
Fer antes que nada muchísimas gracias por colaborar con semejante aporte!!
Recien anduve haciendo un test y surgio el siguiente error al ejecutar el archivo SendingMessageFromBrowser.php

Fatal error: Interface 'Zend\Stdlib\DispatchableInterface' not found in /home/u747710565/public_html/library/Zend/Http/Client.php on line 23
De hecho yo baje la libreria del ZendFramework 2.2.0

En esta direccion vas a encontrar lo que estoy armando a modo test http://helioninteractive.pusku.com/
Que puede estar faltando?

Saludos! Claudio.
13 - Fernando La Chica Mera - 26/11/2012 19:17
Ni idea, revisa los log de apache que seguramente la traza sea más grande y la clave no esté en el fichero client.php
12 - - 26/11/2012 18:55
gracias ya lo descargue ahora me marca esto: unexpected T_STRING in Zend\Http\Client.php on line 11 alguna idea??
11 - Fernando La Chica Mera - 26/11/2012 18:50
Deberás descargarte el Framework Zend
10 - - 26/11/2012 18:33
Como resuelvo esto: quire_once 'Zend/Http/Client.php'; ???
9 - - 22/11/2012 17:11
Buenas a todos, una pregunta.
Es posible realizar consultas al servidor con GCM y a la vez recibirlas? estoy haciendo un juego de cartas online y todavía ando un poco perdido. Necesito que cuando yo tiro una carta a la mesa, los demás reciban que he tirado esa carta y cambie el turno, y no sé muy bien como hacerlo para agregar datos a la bbdd e informar a los demás jugadores.
Algun idea¿?
8 - - 26/07/2012 19:35
Si de hecho lo resolví sola desde ayer, pero olvide comentarlo. De cualquier forma muchísimas gracias, espero que sigas creando material como este que es de mucha ayuda para la comunidad.
7 - Fernando La Chica Mera - 26/07/2012 08:32
Algo similar me comentan en http://www.yinyan.es/blog/?p=101#comments

Verás que he contestado lo siguiente:


Deberás modificar la parte cliente y la parte servidora. De lado del cliente, en la clase GCMIntentService y en su método onMessage recibirás el array enviado desde el servidor, para rescatar la información deberás hacerlo de esta manera: String array_value = intent.getExtras().getString(ARRAY_KEY);

Para enviar información desde el servidor al cliente, en el fichero SendingMessageFromBrowser.php verás que se construye un array del estilo de:

$valuesTOGCMMessage = array(
‘par1′ => ‘val1′,
‘par2′ => ‘val2′,
‘par3′ => ‘val3′,
);

este array es el que se lee en el Intent de onMessage descrito anteriormente.
6 - - 25/07/2012 20:41
Ya me corre perfectamente y me manda notificaciones a cuantos registros tenga en la BD, y ahora quiero hacer que envie un mensaje en especifico pero al modificar los valores de $valuesTOGCMMessage no hace nada y navegando entre php y carpetas no encontre nada concreto, podrias ayudarme con eso???
5 - - 24/07/2012 22:31
Bueno gracias creo ke con el cliente todo va bien, ahora lo corro y no hace nada, la alicacion no me muestra nada ... trate de correr SendingMessageFromBrowser.php pero me dice que exite un error al querer utilizar require_once 'Zend/Http/Client.php'; siendo que no existe, debo de bajar los archivos de Zend???
4 - Fernando La Chica Mera - 24/07/2012 19:53
El cliente es el mismo que nos deja Google en este post. http://developer.android.com/guide/google/gcm/demo.html

No hay que cambiar absolutamente nada. Sigue la parte del tutorial donde se crea el APK para Android titulado "Setting Up the Device"
3 - - 24/07/2012 19:47
Hola, primero que nada agradezco este tutorial por que me parece muy util pero estoy un poco perdida =S, he estado leyendo los php y creo entender como funcionan pero no entiendo como debo desarrollar la parte del cliente, si pudieras ayudarme con eso o presentarme un ejemplo estaria muy agradecida
2 - Fernando La Chica Mera - 18/07/2012 13:32
En el blog de www.yinyan.es hay algunos comentarios al respecto. Básicamente lo que os pasa es que vuestro servidor no encuentra las librerías de Zend framework que deben ir a la altura de pushNotifications
1 - German Madinabitia - 18/07/2012 13:26
Hola, estoy probando con la demo de android:
He cambiado esto:
static final String SERVER_URL = "http://midominio.com/folder/gcm";
String serverUrl = SERVER_URL "/GcmServer.php";
Cuando ejecuto
Posting 'regId=xxxxxxxxxxxx' to http://midominio.com/folder/gcm/GcmServer.php
falla el registro.

En la demo también postea a /unregister para desregistrar.

Agradecería alguna ayuda o si puedes enviarme la demo transformada
BUSCAR
volver a vista clásica