Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tutores
Miguel Rodríguez Pérez
2017
Escola de Grao en Enxeñaría
Mención:
Enxeñaría de de Tecnoloxías de
Telemática
Telecomunicación Telecomunicación
IMPLEMENTACIÓN DE
NOTIFICACIONES PUSH EN UNA
PLATAFORMA E-LEARNING
Autor: José Ángel Regueiro Janeiro
Tutor: Miguel Rodríguez Pérez
Curso: 2016-2017
I. Introducción
En este trabajo se presenta el desarrollo e incorporación de un módulo funcional de
notificaciones de nuevos eventos para una plataforma de autoaprendizaje, e-learning, basada
en una de red social.
Si bien originalmente la web no estaba pensada para dar soporte a sistemas de aprendizaje en
línea como e-learning, su evolución a lo largo de la historia hizo posible la aparición del e-
learning. En sus primeras etapas, la web se caracterizaba por presentar una descentralización y
unidireccionalidad de los recursos. Sin embargo, las nuevas versiones posibilitaron que se
consolidara como un medio más interactivo, en el que cualquier persona podía convertirse en
creador o consumidor de recursos, dando lugar a nuevas modalidades de aprendizaje, que ahora
podía realizarse en línea [1]. Nace así el denominado e-learning [2], en el que se modifican los
roles de profesor y alumno. De este modo, el alumno se responsabiliza de autogestionar su
propio aprendizaje, convirtiéndose así en el centro del proceso de enseñanza, mientras que el
profesor se encarga de guiarlo y orientarlo [3]. La interacción entre ambos se realiza a través de
distintas plataformas virtuales o redes sociales, que acostumbran contar, además, con foros o
chats [4]. En la actualidad, existe una gran cantidad de software dedicado al desarrollo y control
de las redes sociales o plataformas dedicadas al e-learning. Entre estos, Elgg se ha consolidado
como uno de los recursos más populares para la creación de redes sociales en línea [5], gracias
a las funcionalidades que ofrece:
Nuestro sistema de notificaciones está desarrollado para una red social de aprendizaje,
SocialWire, que se enmarca dentro del framework de desarrollo de Elgg.
SocialWire es un entorno de aprendizaje colaborativo que fue diseñado con el propósito inicial
de combinar actividades de aprendizaje informal y formal, añadiendo, al mismo tiempo, el
componente de la gamificación [8]. Este entorno se apoya en el núcleo de Elgg, lo que permite
crear y modificar diferentes módulos o plugins para dotar a la red social de las funcionalidades
que el usuario requiere en cada momento [5]. Sin embargo, una carencia de Elgg, que
trataremos de suplir con este trabajo, es la falta de un sistema de notificaciones para los
usuarios.
Hoy en día, disponemos de diversos métodos que nos permiten comunicarle a un usuario una
determinada información a través de notificaciones. Destacan, por ejemplo, las notificaciones
por correo electrónico, el envío de SMS, las notificaciones nativas (notificaciones propias de un
sistema operativo) o las notificaciones basadas en aplicaciones Web (el sistema de notificaciones
que utilizan los navegadores) [9].
El envío de SMS como método de notificación consiste en la intercepción del mensaje por parte
de la aplicación cuando este llega al dispositivo móvil. Este sistema presenta, sin embargo, varios
inconvenientes. Por un lado, el envío masivo de mensajes a una gran cantidad de usuarios
supone un coste muy elevado. Por otro lado, no existen garantías de que el mensaje llegue a su
destino dentro del periodo de tiempo acotado, debido a la interacción de otros elementos, como
la disponibilidad de cobertura o el correcto funcionamiento de las estaciones base de telefonía
[10].
Para el desarrollo de este proyecto, se consideran, en primer lugar, los objetivos principales del
mismo, así como los objetivos operativos planteados para alcanzar nuestros propósitos. En
segundo lugar, se detallan las tecnologías empleadas y se examina el diseño y desarrollo del
proyecto. Finalmente, se presentan los resultados y se aportan las conclusiones extraídas del
estudio, así como las referencias bibliográficas citadas a lo largo del trabajo.
II. Objetivos
El objetivo principal de este trabajo es contribuir al desarrollo de un módulo de comunicación
funcional para una plataforma de redes sociales, SocialWire. Este módulo se basa en un sistema
de notificaciones tanto para escritorio como para dispositivos móviles, teniendo en cuenta la
existencia previa de un módulo de comunicaciones basado en notificaciones por correo
electrónico.
Para alcanzar nuestro objetivo principal, se han considerado los siguientes objetivos operativos:
III.1. Elgg
Elgg es una plataforma de código abierto para la creación y desarrollo de sitios web sociales.
Esto significa que cualquiera puede descargarlo y modificarlo según las funcionalidades que
necesite [12].
La plataforma Elgg puede dividirse en dos partes; por un lado, dispone del núcleo o motor, por
otro, se encuentran los plugins o módulos. El núcleo de Elgg ofrece los mecanismos necesarios
para crear una red social y, además, cuenta con un framework para que los desarrolladores
puedan implementar nuevas funcionalidades mediante plugins [13].
Esta posibilidad de crear módulos o plugins adicionales es lo que hace posible que la plataforma
pueda personalizarse y disponer de aquellas funcionalidades que los usuarios necesiten en cada
momento [13].
Tras presentar la base sobre la que hemos instalado y configurado una versión de SocialWire,
procedemos a tratar las tecnologías empleadas para el envío de notificaciones.
III.2. Notificaciones Push
A la hora de dotar a la red social SocialWire de un módulo de notificaciones, disponíamos de dos
posibilidades: incrustar una vista web en una aplicación nativa del sistema operativo o utilizar
una nueva API experimental multiplataforma.
Las notificaciones Push son una tecnología de mensajería que permite el envío de paquetes de
información, basándose en un método de publicador y suscriptor cuando se da una determinada
condición [15]. Entre las características más importantes de esta tecnología se encuentran:
• Reduce la carga de mensajes duplicados en el servidor, pues permite el envío del mismo
mensaje a diferentes dispositivos [16].
• Requiere del uso de una API, la Push API, que no necesita la instalación de ningún tipo
de aplicación, puesto que la proporciona el propio sistema operativo o el navegador.
Esta API es la que ofrece la posibilidad de recibir las notificaciones en el dispositivo del
usuario [15].
• Permite firmar los mensajes push, de manera que se garantiza la identidad del emisor y
se protege, a su vez, la integridad del mensaje [17]. Si bien esta característica es
opcional, se ha implementado en nuestro proyecto para ofrecer más seguridad al
servicio.
Esta tecnología se puede dividir en tres partes: envío, recepción y visualización de la notificación.
El envío de la notificación lo realiza el servidor web (Application Server) utilizando la tecnología
push. De la recepción del mensaje se encarga un service worker, que está a la escucha de la
llegada de nuevas peticiones [14]. La visualización del mensaje se logra mediante el uso de la
tecnología de notification, que se encarga de mostrar una información por pantalla al usuario
una vez que es recibida en el service worker [18].
III.2.1. Tecnología Push: Push API
La Push API proporciona a las aplicaciones web la funcionalidad de recibir mensajes enviados
desde un servidor. Además, esta API ofrece la posibilidad de recibir notificaciones aun cuando
la aplicación no esté en primer plano o cargada [14]. En la siguiente imagen se observa un
esquema de la arquitectura del sistema Push:
Application Server Servicio back-end que genera la suscripción para enviarla a través
del servidor Push. En nuestro caso sería el servidor de SocialWire.
Push Server Servidor que maneja los eventos y el envío de estos hacia su
correcto suscriptor. Cada navegador tiene su propio Push Server:
Firebase Cloud Messaging (Google), Autopush (Mozilla), entre
otros.
VAPID es una nueva especificación que permite a una página web que utilice notificaciones push
autentificarse más fácilmente ante servicios push. Consiste en una serie de valores que
describen, definen e indican donde se ha creado la suscripción. Estos valores se sitúan en la
cabecera del mensaje, y se envían en el momento de realizar la suscripción [19]. Esta
especificación funciona esencialmente como mecanismo de handshake entre el Application
Server y el Push Server. Además, permite al Push Server confirmar a qué sitio está enviando los
mensajes [21]. Si el Push Server encuentra algo inusual en el contenido, VAPID ofrece la
información necesaria para poder contactar con el propietario del mensaje, indicándole qué
problema ha ocurrido con su mensaje [19].
Además, VAPID evita que un posible atacante pudiera robarle a un usuario del sistema su
suscripción. Esta suscripción contiene toda la información que el Push Service necesita para
enviar mensajes push al navegador del usuario y su intercepción permitiría enviar al usuario
mensajes push desde otro servidor.
• La ejecución corre sobre un hilo distinto al de los otros códigos JavaScript de los que
dispone la aplicación. Esto lo convierte en una tarea no bloqueante y asíncrona, es decir,
que su ejecución no paraliza o bloquea la aplicación [25]
A la hora de enlazar una página web con un service worker (suscripción), existen dos parámetros
opcionales: “userVisibleOnly” y “applicationServerKey”. El primer parámetro es un booleano que
indica que la recepción de un mensaje push va a originar que se le muestre una notificación al
usuario receptor. El segundo parámetro es un factor de autenticación que emplea la aplicación
del servidor y que indica la clave pública con la que el servidor push enviará mensajes a la
aplicación del cliente [23].
La Notification API permite que las páginas web controlen la presentación de notificaciones
fuera del contexto de la ventana de navegación principal del usuario. Esto permite mostrar las
notificaciones aun cuando el usuario cambie o cierre la pestaña correspondiente a la página web
de SocialWire. Además, esta API está diseñada para ser compatible con los sistemas de
notificación existentes en diferentes plataformas, llegando incluso a mostrarse como
notificaciones nativas en algunos dispositivos móviles [26].
En este proyecto, Notification API se emplea para solicitar los permisos y mostrar las
notificaciones por pantalla.
IV.1. Plugin
Al ser una plataforma basada en Elgg, SocialWire requiere de la configuración y programación
de plugins o módulos para dotar a la red social de diferentes funcionalidades. Estos plugins
tienen una estructura modular y deben ser programados en PHP, por ser este el lenguaje de
programación que se utiliza en el servidor de la plataforma.
Para crear un plugin en Elgg se necesitan dos archivos fundamentales: manifest.xml y start.php.
El primero es un archivo XML donde aparecen todos los datos que necesita el plugin para su
correcto funcionamiento, por ejemplo: qué otros plugins deben ser instalados en la plataforma
o qué versión de PHP requiere. Además, también ofrece información sobre el nombre del plugin
y del autor, entre otros. El segundo archivo, start.php es el archivo principal y contiene toda la
funcionalidad del plugin.
La programación de este plugin podemos dividirla en dos partes: por un lado, la parte encargada
de la recepción de eventos y, por otra, la encargada de su envío.
En primer lugar, programamos tanto el código JavaScript del service worker como el script
necesario para su ejecución y asociación con la página web. Este código se ejecuta cada vez que
un usuario accede a la página web de SocialWire y tiene permitida la recepción de notificaciones
push. Para ello, es necesario que el service worker disponga de la clave pública de VAPID. Con el
propósito de lograr que el service worker dispusiera de esta clave, fue necesario añadirla
previamente a una serie de variables globales que dispone Elgg, a las que se puede acceder
desde cualquier plugin.
En segundo lugar, programamos un script en JavaScript que se encargara del envío de los datos
del navegador (endpoint, key y token) correspondientes a cada usuario, para hacer posible el
envío de notificaciones push más adelante. Sin estos datos, no se sabría a qué navegador va
dirigida cada notificación.
Por último, se necesitaba que los datos enviados en el apartado anterior se pudieran recibir en
el servidor y, posteriormente, almacenarlos en la base de datos para tenerlos disponibles y
accesibles a la hora de realizar el envío de una notificación. Para esto, se utilizó una serie de
actions. Un action es un código que nos ofrece Elgg para poder modificar la base de datos cuando
un usuario realiza una acción en la plataforma. En concreto, necesitamos la configuración de dos
actions. El primero de ellos se ocupará de recibir los parámetros del navegador (endpoint, token
y key) y almacenarlos en una variable JSON. Además de estos datos, también se guardará la
información que se pueda obtener del User Agent sobre el navegador con el que está
accediendo el usuario, por ejemplo: tipo de sistema o tipo de navegador. El segundo action se
encargará de actualizar, a petición del usuario, en cuál o cuáles de los navegadores asociados
quiere recibir las notificaciones.
Así se han configurado todas las funcionalidades de nuestro plugin con respecto a la recepción
de eventos y la obtención de los parámetros necesarios para poder realizar el envío de
notificaciones push correctamente.
En segundo lugar, una vez que nuestro hook captura un evento de ese tipo, ejecuta una función
que utiliza los datos que contiene el evento capturado (usuario receptor, usuario emisor, etc.) y
busca en la base de datos el fichero Json, correspondiente al usuario receptor, que incluye toda
la información de los navegadores del usuario en los que tiene permitido la recepción de esta
clase de notificaciones. Estos datos (endpoint, key, token) se le pasan a la Web Push API que se
encarga de enviar la notificación al navegador correspondiente.
En tercer lugar, una vez que la notificación ha sido enviada y el service worker del navegador
correspondiente la recibe, mediante la utilización de la Notification API esta mostrará la
notificación al usuario. Como se ha mencionado anteriormente, para que sea posible la
visualización de notificaciones por parte del usuario es necesario que este haya permitido su
uso.
IV.4. Administración
Para adaptar nuestro plugin a la versión de SocialWire, se ha optado por configurar una vista
que resulte fácil y sencilla tanto para el usuario como para el administrador del sistema. A
continuación, se presentan cada una de las vistas:
A partir de este sistema, para la realización de este proyecto se copiaron los archivos
correspondientes a esas vistas y se situaron en la misma ruta, views, pero dentro de nuestro
plugin. Posteriormente, se modificó el archivo, añadiendo los nuevos parámetros
correspondientes a la configuración del plugin. Los cambios realizados en esos ficheros
consistieron en pequeñas modificaciones estéticas, así como en añadir información relacionada
con la configuración de qué dispositivos y qué tipo de notificaciones desearía recibir el usuario.
Estas modificaciones estéticas consistieron en la incorporación de los dispositivos disponibles
para el usuario en los que recibir notificaciones, así como un checkbox asociado, que permite
habilitarlos y deshabilitarlos cuando se desee.
Esto se debe al propio funcionamiento de Elgg, que sobrescribiría el fichero antiguo con nuestro
fichero modificado a la hora de cargarlo. Elgg carga los ficheros de los plugins según el orden en
el que estén colocados en el sistema de administrador de Elgg. De este modo, en el caso de que
dos archivos estén en la misma ruta y se nombren de la misma manera, pero se encuentren en
distintos plugins, el usuario solo verá la configuración del segundo fichero, es decir, el que se ha
cargado más recientemente.
Al haber realizado modificaciones en la vista, fue necesario añadir también ciertos criterios de
verificación mediante un fichero JavaScript, que comprobaba las acciones que el usuario
realizaba o quería realizar, evitando que este seleccionara aquellas no permitidas o ilógicas,
como sería el caso, por ejemplo, de solicitar recibir notificaciones, pero no haber seleccionado
ningún dispositivo que las reciba, o viceversa.
Una vez que el responsable del sistema tuviera creada su clave pública y privada de VAPID, este
solo tendría que dirigirse a la pantalla de configuración del plugin y escribir estos parámetros,
además del “subject” que puede ser bien un correo electrónico, bien una URL. Este “subject”
constituye la dirección con la que el servidor Push contactaría en caso de que ocurriera un error
durante el envío de una notificación.
Una vez escritas y aceptadas las claves, el sistema completa de forma dinámica, con la clave
pública, el archivo JavaScript que se usa para el registro ante el service worker. De este modo,
se evita que tenga que ser el administrador quien busque dicho fichero para completarlo.
Así, se facilita al responsable una configuración sencilla y rápida del plugin compatible con
cualquier navegador que permita y soporte el uso de esta tecnología.
Tras comprobar la compatibilidad de los distintos navegadores haciendo uso de la web Can I Use
[27], se procedió a realizar la primera prueba del sistema de notificaciones en Mozilla Firefox.
Más concretamente, se empleó una versión de desarrolladores Nightly, dado que cuando se
empezó a trabajar en la demo era uno de los pocos navegadores que tenían disponible la
utilización de la tecnología Push al completo.
V. Resultados
A continuación, se presentan los resultados de nuestro proyecto, considerando, en primer lugar,
aquellos cambios que se realizaron en la vista de configuración de las notificaciones de cara al
usuario. Seguidamente, se expondrán los cambios realizados en la vista de configuración del
plugin, para facilitar la configuración del mismo por parte del administrador. Por último, se
presentará cómo se muestran las notificaciones y cómo se visualizan una vez que son recibidas
por el correspondiente dispositivo del usuario.
Lo primero que el usuario visualiza al entrar por primera vez en la vista de configuración de
notificaciones es un pop-up, por parte del navegador, que le solicita al usuario permiso para
poder recibir notificaciones en ese dispositivo (Figura 4).
Esta solicitud le presenta al usuario distintas posibilidades que pueden cambiar dependiendo
del navegador. En el caso de Firefox, se ofrecen las opciones: recibir notificaciones siempre,
bloquear siempre notificaciones y esta vez no (Figura 5).
En caso de que el usuario, por alguna razón, bloquee o deniegue el uso de notificaciones, el
mensaje informativo que aparecerá en ese caso le indicará que no tiene habilitado el uso de
notificaciones, y le informará de cómo podría habilitarlas en el caso de que lo desee (Figura 6).
Figura 6: Mensaje de error de la página
Tal y como se puede apreciar en la figura superior (Figura 9), estos campos son la dirección de
correo electrónico, junto con una ayuda que indica qué forma debe tener ese campo, la clave
pública y privada de VAPID.
Al mismo tiempo, nuestro objetivo relacionado con dotar al módulo de la capacidad de extraer
de la base de datos la información relativa a qué usuario van dirigidas, así como el dispositivo al
que poder enviar la notificación correspondiente, se ha alcanzado tras comprobar con los
resultados el correcto funcionamiento del módulo.
Finalmente, concluimos este trabajo con una serie de consideraciones con respecto a las
limitaciones del mismo, con vistas a futuras líneas de investigación. Nuestro trabajo se
encuentra limitado por la dependencia de los servicios de Google y Firefox [28]. Sin embargo,
aunque exista esta dependencia, al tratarse de una API estandarizada no necesitaría cambios en
el caso de que se incorporaran nuevos proveedores.
Al mismo tiempo, la API empleada en nuestro proyecto, la Push API se encuentra en una etapa
experimental, lo que supone que en un futuro puedan originarse cambios en su funcionamiento.
Por último, se podría considerar también adaptar nuestro sistema para que funcione en el
navegador Safari, de Apple, que dispone de un método de notificaciones push distinto al que se
ha empleado en este trabajo. En última instancia, la extensión de la funcionalidad de nuestro
sistema de notificaciones a otros sistemas operativos permitiría mejorar la experiencia de los
usuarios de la plataforma.
[2] Area Moreira, M. y Adell Segura, J. (2009). E-Learning: enseñar y aprender en espacios
virtuales. Tecnología Educativa. La formación del profesorado en la era de Internet, pp.391-424.
[3] Marisa Pagano, C. (2008). Los tutores en la educación a distancia. Un aporte teórico. Revista
de Universidad y Sociedad de Conocimiento, 4 (2), pp. 1-11.
[4] Fernández-Pampillón Cesteros, Ana (2009). “Las plataformas e-learning para la enseñanza y
el aprendizaje universitario en Internet”. Las plataformas de aprendizaje. Del mito a la realidad.
Madrid: Biblioteca Nueva, pp. 45-73.
[5] Sousa Vieira, M. E., López Ardao, J. C., Fernández Veiga, M., Rodríguez Pérez, M. y López
García, C. (2015). Using social learning methodologies in higher education. International Journal
of Engineering Pedagogy, 5 (2), pp. 64-72. doi: 10.3991/ijep.v5i2.4645
[6] López Galíndez, F. A., Rebolledo Fuentes, A., Burbano Fernández, M. F. & Solarte Sarasty, M.
(2014). Integración de servicios web 2.0 al software de redes sociales Elgg para el apoyo a
procesos de enseñanza y aprendizaje en educación matemática. En: Cuarta Conferencia de
Directores de Tecnología de Información, TICAL2014 Gestión de las TICs para la Investigación y
la Colaboración, Cancún.
[7] Mohammed Abdul, J. F. y Ramirez Velarded, R. V. (2009). Herramientas Web 2.0 para el
Aprendizaje Colaborativo. CYTED. Consultado el día 29 de mayo de 2017. Recuperado de:
http://remo.det.uvigo.es/solite/attachments/038_Web%202.0.pdf
[8] Sousa Vieira, M. E., López Ardao, J. C., Fernández Veiga, M., Rodríguez Pérez, M. and Herrería
Alonso, S. (2016), An open-source platform for using gamification and social learning
methodologies in engineering education: Design and experience. Comput Appl Eng Educ, 24:
813–826. Consultado el día 29 de mayo de 2017. doi:10.1002/cae.21746
[9] Tolentino, J. (2015). SMS vs. Push notification vs. Email: When should your app use what?
Consultado el día 29 de mayo de 2017. Recuperado de: https://thenextweb.com/future-of-
communications/2015/02/09/sms-vs-push-vs-email/
[11] Novia Sari, M. y Mohamad Ali, N. A. B. (2013). The Suitability of Native Application for
University E-Learning Compared to Web-Based Application. International Journal of Science and
Research, 4 (1), pp. 2045-2049.
[12] Elgg (2014). Elgg master Documentacion. Consultado el día 26 de mayo de 2017.
Recuperado de: http://learn.elgg.org/en/stable/
[13] Costello, C. y Sharma, M. (2012). Elgg 1.8 Social Networking: Create, Customize, and Deploy
Your Very Own Social Networking Site With Elgg (2ª edición). Birmingham: Packt Publishing
[14] Mozilla Developer Network (2017). Push API. Consultado el día 29 de mayo de 2017.
Recuperado de: https://developer.mozilla.org/en-US/docs/Web/API/Push_API
[15] Beverloo, P., Thomson, M., van Ouwerkerk, M., Sullivan, B. y Fullea, E. (2017). Push API. The
World Wide Web Consortium. Consultado el día 29 de mayo de 2017. Recuperado de:
https://www.w3.org/TR/push-api/
[16] Suhas Bharadwaj, R., Raghvendra Rao, G. (2016). Activity based Push Notification.
International Journal of Engineering and Science and Computing, 6 (6). pp. 6403-6405. doi:
10.4010/2016.1539
[17] Thomson, M. y Beverloo, P. (2017). Voluntary Application Server Identification for Web
Push. IETF Tools. Consultado el día 29 de mayo de 2017. Recuperado de:
https://tools.ietf.org/html/draft-ietf-webpush-vapid-02
[19] Colin, J. R. (2016). Sending VAPID identified WebPush Notifications via Mozilla Push Service.
Consultado el día 26 de mayo de 2017. Recuperado de:
https://blog.mozilla.org/services/2016/08/23/sending-vapid-identified-webpush-notifications-
via-mozillas-push-service/
[20] Sullivan, B., Fullea, E. y van Ouwerkerk, M. (2015). Web Push API. Consultado el día 29 de
mayo de 2017. Recuperado de: https://w3c.github.io/push-api/
[21] Gaunt, M. y Medley, J. (2017). Web Push Interoperability Wins. Consultado el día 29 de
mayo de 2017. Recuperado de: https://developers.google.com/web/updates/2016/07/web-
push-interop-wins
[22] Gaunt, M. (2015). Push Notifications on the Open Web. Consultado el día 26 de mayo de
2017. Consultado el día 29 de mayo de 2017. Recuperado de:
https://developers.google.com/web/updates/2015/03/push-notifications-on-the-open-web
[23] Mozilla Developer Network (2017). Service Worker API. Consultado el día 29 de mayo de
2017. Recuperado de: https://developer.mozilla.org/en-
US/docs/Web/API/Service_Worker_API
[24] Russell, A., Song, J., y Archibald, J., (2015). Service workers. The World Wide Web
Consortium. Consultado el día 29 de mayo de 2017. Recuperado de:
https://www.w3.org/TR/service-workers/
[25] Mozilla Developer Network (2017). Worker. Consultado el día 29 de mayo de 2017.
Recuperado de: https://developer.mozilla.org/en-US/docs/Web/API/Worker
[26] Mozilla Developer Network (2017). Notifications API. Consultado el día 29 de mayo de 2017.
Recuperado de: https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API
[27] Deberia, A. (2017). Push API. Consultado el día 26 de mayo de 2017. Recuperado de:
http://caniuse.com/#search=push%20api
[28] Google Cloud Messaging (2017). GCM and FCM Frequently Asked Questions. Consultado el
día 29 de mayo de 2017. Recuperado de: https://developers.google.com/cloud-messaging/faq