Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 30/08/15, 17:56:10
Array

[xs_avatar]
_DeV_ _DeV_ no está en línea
Usuario poco activo
 
Fecha de registro: nov 2011
Mensajes: 45
Tu operador: Movistar

¿Notificaciones remotas con GCM (Google Cloud Messaging)?

Buenas tardes!

Me gustaría añadir una funcionalidad que sean notificaciones que desde mi servidor pueda enviar a los diferentes dispositivos que tengan instaladas mi app para recordarles ciertos eventos.

Serían notificaciones muy simples, del estilo: "Recuerda que hoy taltaltal" y cosas así, puntuales, 1 o 2 veces a la semana.

He estado buscando y la alternativa que encuentro es GCM Google Cloud messaging, pero cuantos más tutoriales veo, más dificil me parece de implementar para una cosa tan sencilla como es lo que quiero hacer yo (o eso creo jajaja).

Mi pregunta es, hay alguna otra manera de hacerlo?
Mi segunda pregunta es, mañana voy a sacar la aplicación, esta otra manera de implementar notificaciones puedo aplicarla en alguna actualización próxima o ha de ser implementada desde la primera verisón de la app?

Un saludo y muchas gracias, como siempre!
Responder Con Cita


  #2  
Viejo 30/08/15, 18:24:02
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Respondiendo a la última cuestión, evidentemente puedes añadir o quitar funcionalidad a la app mediante actualizaciones.

Sobre la mejor forma, depende...
- ¿Los eventos a recordar son los mismos para todos los usuarios de la app o cada usuario tiene eventos distintos?
- ¿Los eventos cada cuánto se actualizan? No es lo mismo que tengas un calendario anual ya definido a que cada día publiques eventos nuevos o hagas cambios.

Es posible que te baste con un servidor que almacene información de próximos eventos en JSON por ejemplo. De forma periódica (cada día, cada semana...) la app hace una petición a ese fichero. La notificación la haces en local programando la notificación para la hora que quieras.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 30/08/15, 18:28:55
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Hay muchas formas de hacerlo, pero si quieres estar CASI convencido de que las notificaciones se van a entregar lo mejor es usar GCM, porque es lo único que te asegura 100% que va a funcionar incluso con el móvil en StandBy, incluso con el nuevo modo Doze de Marshmallow.

La parte cliente no es tan complicada, basta con programar un GCMBroadcastReceiver y configurar el AndroidManifest, además de solicitar una Key en la Google Console:

http://www.sgoliver.net/blog/notific...nueva-version

Si quieres algo tan simple como simplemente mostrar una notificación la parte del GCMIntentService te la puedes ahorrar, y poner el código directamente en el GCMBroadcastReceiver, ya que le va a sobrar tiempo para hacer la tarea.

Ahora bien, la parte servidor ya si es algo más compleja, y depende de en que lenguaje esté implementado tu servidor. No es muy complicado si estás familiarizado con el REST.

Aquí tienes un ejemplo de como hacerlo con ASP.NET y C#, que dicho sea de paso me sirvió de ayuda para hacerlo a mi, porque mis servidores también trabajan con ASP.NET:

http://www.sgoliver.net/blog/notific...cion-servidor
Responder Con Cita
Gracias de parte de:
  #4  
Viejo 30/08/15, 18:30:06
Array

[xs_avatar]
_DeV_ _DeV_ no está en línea
Usuario poco activo
 
Fecha de registro: nov 2011
Mensajes: 45
Tu operador: Movistar

Buenas mocelet, gracias por responder.

Las notificaciones serían todas iguales para todos y cada uno de los usuarios de la aplicación, no hay distinción. Y serían simples recordatorios a realizar en días aleatorios de la semana.

Las notificaciones serían tan simples que solo bastaría con una frase, no deberían de llevar más información que esa, una frase estilo: "Recuerda que puedes..." ó "Ya tienes disponible...". Nada más. Y, ya te digo, lo mismo me viene bien enviarla hoy a todos los usuarios a las 21h que el sabado que viene a las 17h.

Espero haberme explicado bien!

Un saludo!

EDIT: Leyendo a kriogeN, comento que el tema de WS estoy familiarizado y demás. Los WS que consumen mi aplicación los estoy haciendo mediante PHP ya que es un servidor bastante sencillo el que he contratado (más que nada porque la información a obtener son simples consultas a una bbbdd).

Última edición por _DeV_ Día 30/08/15 a las 18:32:31.
Responder Con Cita
  #5  
Viejo 30/08/15, 18:38:27
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Según lo cuentas no necesitas "enviar" una notificación desde un servidor para nada, ni siquiera necesitas datos actualizados de un servidor.

Para eso puedes generar las notificaciones en local programándolas con el AlarmManager, directamente desde la app.

De todas formas... que las apps me generen notificaciones de recordatorio me suele fastidiar como usuario si no es algo importante o urgente. Para recordar cosas que el usuario no necesita en ese momento mejor mostrarlas mientras usen la app, no como notificación sino como toast/pop up/ banner / lo que sea.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #6  
Viejo 30/08/15, 18:43:52
Array

[xs_avatar]
_DeV_ _DeV_ no está en línea
Usuario poco activo
 
Fecha de registro: nov 2011
Mensajes: 45
Tu operador: Movistar

 Cita: Originalmente Escrito por mocelet Ver Mensaje
Según lo cuentas no necesitas "enviar" una notificación desde un servidor para nada, ni siquiera necesitas datos actualizados de un servidor.

Para eso puedes generar las notificaciones en local programándolas con el AlarmManager, directamente desde la app.

De todas formas... que las apps me generen notificaciones de recordatorio me suele fastidiar como usuario si no es algo importante o urgente. Para recordar cosas que el usuario no necesita en ese momento mejor mostrarlas mientras usen la app, no como notificación sino como toast/pop up/ banner / lo que sea.
No, pero no es exactamente eso. Voy a poner el ejemplo exacto que necesito, para ver si me entiendes mejor.

La app es sobre el equipo de fútbol de mi ciudad. La necesidad es avisar al usuario de que ya tiene disponible la alineación titular.

La cosa es que el equipo juega lo mismo el viernes, el sábado que el domingo y claro, la idea es que cuando esté, yo le de el aviso al usuario, el usuario vea la notificación y acceda a la app para consultar la alineación titular.

PD: Lo que comentas de AlarmManager soluciona otra problemática que tenía, gracias jajaja.

Un saludo!
Responder Con Cita
  #7  
Viejo 30/08/15, 18:56:06
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

OK, entonces no es que te dé igual un día u otro, hablamos de información nueva.

La solución fácil es que la app se conecte cada X horas a comprobar si hay algo nuevo.

La solución buena es usar GCM, pero es bastante más complicada desde el punto de vista de servidor.

Puedes empezar con la solución fácil ;)
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #8  
Viejo 30/08/15, 18:58:13
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por _DeV_ Ver Mensaje
No, pero no es exactamente eso. Voy a poner el ejemplo exacto que necesito, para ver si me entiendes mejor.

La app es sobre el equipo de fútbol de mi ciudad. La necesidad es avisar al usuario de que ya tiene disponible la alineación titular.

La cosa es que el equipo juega lo mismo el viernes, el sábado que el domingo y claro, la idea es que cuando esté, yo le de el aviso al usuario, el usuario vea la notificación y acceda a la app para consultar la alineación titular.

PD: Lo que comentas de AlarmManager soluciona otra problemática que tenía, gracias jajaja.

Un saludo!
PHP (al menos PHP a palo seco) no es un buen lenguaje para gestionar envío de notificaciones Push, porque si quieres hacerlo bien tendrás que hacerlo en segundo plano. Si no vas a enviar muchas quizás podrías usar Parse.com, hasta 1 millón de envíos al mes te sale gratis.

Offtopic: Si las notificaciones Push en Android te parecen complicadas en iOS fliparías, tanto la parte cliente como servidor son mucho más complicadas (además que el API suelen cambiarlo entre distintas versiones de iOS, lo que te obliga a rehacerlo manteniendo también el código antiguo para las versiones anteriores de iOS). Sobre todo la del servidor, que entre otras cosas necesita un certificado que debes renovar cada año, además de no avisarte si una notificación se ha entregado al servidor APNS (el GCM de Apple) o no.
Responder Con Cita
  #9  
Viejo 30/08/15, 18:58:24
Array

[xs_avatar]
_DeV_ _DeV_ no está en línea
Usuario poco activo
 
Fecha de registro: nov 2011
Mensajes: 45
Tu operador: Movistar

Vale, pero cómo empiezo a implementar la solución fácil? Algún ejemplo simple para poder guiarme?

Gracias!
Responder Con Cita
  #10  
Viejo 30/08/15, 19:24:15
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Con un IntentService que haga la petición HTTP al servidor preguntando las novedades y, en caso de que sea información nueva, lanzando la notificación.

Para que la comprobación sea de forma periódica, o si el usuario no tenía conexión a internet en ese momento, con el AlarmManager programas la siguiente ejecución del IntentService.

EDIT: Algunas cosas a tener en cuenta, al reiniciar el móvil las alarmas del AlarmManager programadas se borran, así que especificar en el manifest que el servicio se arranque con el inicio del sistema también. Posiblemente también te haga falta un "wavelock" mientras haces la petición HTTP para evitar que Android entre en reposo y no llegue a hacerse la petición correctamente. Aun así sigue siendo más fácil que GCM
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 30/08/15 a las 19:37:45.
Responder Con Cita
Los siguientes 2 usuarios han agradecido a mocelet su comentario:
  #11  
Viejo 30/08/15, 23:12:06
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por mocelet Ver Mensaje
Con un IntentService que haga la petición HTTP al servidor preguntando las novedades y, en caso de que sea información nueva, lanzando la notificación.

Para que la comprobación sea de forma periódica, o si el usuario no tenía conexión a internet en ese momento, con el AlarmManager programas la siguiente ejecución del IntentService.

EDIT: Algunas cosas a tener en cuenta, al reiniciar el móvil las alarmas del AlarmManager programadas se borran, así que especificar en el manifest que el servicio se arranque con el inicio del sistema también. Posiblemente también te haga falta un "wavelock" mientras haces la petición HTTP para evitar que Android entre en reposo y no llegue a hacerse la petición correctamente. Aun así sigue siendo más fácil que GCM
Realmente es más fácil que la parte servidor de GCM, porque la parte cliente es más simple que el mecanismo de un botijo y además es siempre igual
Responder Con Cita
  #12  
Viejo 31/08/15, 09:38:26
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Realmente es más fácil que la parte servidor de GCM, porque la parte cliente es más simple que el mecanismo de un botijo y además es siempre igual
La parte de servidor hacerla bien parece bastante trabajo, especialmente si quieres contemplar los casos de error, retransmisiones, escalabilidad, etc.

Cada vez hay más servidores GCM/APNS que hacen el trabajo sucio de conectarse con el proveedor del servicio de notificaciones y exponen un API genérico al desarrollador. Hasta JBoss acaba de sacar el suyo para Java EE (Unified Push). Por no hablar de servicios de push de pago que se integran con todo tipo de plataformas y también te ofrecen un API genérica (a jugzar por los precios es para apps con un número de notificaciones importante).

¿Merece la pena alguno de esos servidores GCM/APNS? ¿O es medianamente factible hacerlo uno mismo?
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
Gracias de parte de:
  #13  
Viejo 31/08/15, 09:56:39
Array

[xs_avatar]
Dexafree Dexafree no está en línea
Mr. FAQMan
· Votos compra/venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Tu operador: Movistar
 Cita: Originalmente Escrito por mocelet Ver Mensaje
¿O es medianamente factible hacerlo uno mismo?
Yo me hice el mio hace un par de años, y es bastante factible montárselo uno mismo.

Simplemente tienes que encargarte de tener guardados los Tokens (API CRUD basica) y después es hacer una POST con headers y poco más.

Partiendo de 0, en una tarde lo tienes montado
Responder Con Cita
Gracias de parte de:
  #14  
Viejo 31/08/15, 09:57:01
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por mocelet Ver Mensaje
La parte de servidor hacerla bien parece bastante trabajo, especialmente si quieres contemplar los casos de error, retransmisiones, escalabilidad, etc.

Cada vez hay más servidores GCM/APNS que hacen el trabajo sucio de conectarse con el proveedor del servicio de notificaciones y exponen un API genérico al desarrollador. Hasta JBoss acaba de sacar el suyo para Java EE (Unified Push). Por no hablar de servicios de push de pago que se integran con todo tipo de plataformas y también te ofrecen un API genérica (a jugzar por los precios es para apps con un número de notificaciones importante).

¿Merece la pena alguno de esos servidores GCM/APNS? ¿O es medianamente factible hacerlo uno mismo?
Yo tengo implementado ambos en mi servidor ASP.NET, con retransmisiones, autoeliminaciones y reescritura de destino en el caso de GCM. Y nada en el caso de APNS porque simplemente no puedes controlarlo.

Para ambos hago colas, el usuario lo único que hace es hacer algo que provoca notificaciones (para ambos sistemas) y no se envían en ese momento, simplemente se almacenan en la BD del servidor web. Y luego hay otros 2 procesos, uno que se encarga de leer de la BD de notificaciones GCM y otro de la BD de notificaciones APNS, y conforme va enviando los va eliminando.

Como he dicho antes en el caso de GCM incluso hago reescritura de destino, esto es que si alguien se registró con el token "AAAA" y luego desinstala la app (por lo tanto no hace proceso de borrar el registro en mi servidor) y luego se la vuelve a instalar y el servidor le da el token "BBBB". Cuando vas a enviar un mensaje GCM al token "AAAA" el servidor te dice "No existe. Pero este usuario ahora usa el token BBBB y lo hemos mandado ahí". Por lo tanto puedes borrar el token AAAA del sistema, e incluso renombrarlo a BBBB si por algún error no se llegó a escribir en tu BD. También puedes borrar ese mismo mensaje cuyo destino era el "BBBB", así no le llega 2 veces al usuario.

Como puedes ver, el GCM es muchísimo más completo que el APNS, que lo único que hace es informar de errores. Es decir, si pongo como destino a "AAAA" y existe, la conexión se queda abierta y APNS no te informa. Esto lo hacen para que puedas seguir enviando más tokens sin parar. Pero claro, si envías a "AAAA", "BBBB" y "CCCC", y "AAAA" no existe, el mensaje para "BBBB" y "CCCC" no se entrega, y no te dicen cual es el que no existía, por tanto no sabes a partir de donde no se ha entregado. Apple no da soluciones oficiales a eso, la mayoría de las librerías lo que hacen es enviar y esperar 1 o 2 segundos para ver si tienen respuesta, y si no la tienen es que se ha entregado. Pero claro, si tu servidor se queda sin conexión, tampoco tendrás respuesta, y ya no sabes si tu mensaje se ha entregado o simplemente te has quedado sin Internet o va lento.
Responder Con Cita
Los siguientes 2 usuarios han agradecido a kriogeN su comentario:
  #15  
Viejo 31/08/15, 10:09:07
Array

[xs_avatar]
Dexafree Dexafree no está en línea
Mr. FAQMan
· Votos compra/venta: (1)
 
Fecha de registro: dic 2008
Mensajes: 8,021
Modelo de smartphone: Samsung Galaxy S i9000 + Galaxy Tab 10.1 WiFi
Tu operador: Movistar
Nunca me he peleado demasiado con iOS (mas allá de 4 cosas chorras), pero después de leer lo que ha escrito kiogeN ya temo si algún día me meto de lleno y quiero hacer algo con push

Yo me monté un servidor más sencillo, tengo la suerte de poder tener identificador de cada usuario, así que tengo guardado usuario:token
Si el token que me llega es distinto, simplemente hay que actualizar

Es para una aplicación bastante simple, asi que tampoco me requiere demasiado tratamiento de errores.

Además, el proceso de comprobación de envío se hace cada minuto, osea que a lo sumo tardaría un minuto más en enviarla (Y no es mensajería instantánea).
Responder Con Cita
Los siguientes 2 usuarios han agradecido a Dexafree su comentario:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 18:14:51 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /