¿Es compatible Android con notificaciones push casi en tiempo real?

343

Recientemente aprendí sobre la capacidad de las aplicaciones de iPhone para recibir notificaciones casi instantáneas de notificaciones de aplicaciones .

Esto se proporciona en forma de notificaciones push, un protocolo a medida que mantiene una conexión de datos siempre activa al iPhone y envía paquetes binarios a la aplicación, que genera alertas increíblemente rápidas, entre 0,5 y 5 segundos desde el envío de la aplicación del servidor a la aplicación del teléfono tiempo de respuesta. Esto se envía como datos, en lugar de SMS, en paquetes muy pequeños cargados como parte del plan de datos, no como mensajes entrantes.

Me gustaría saber si, usando Android, hay una instalación similar o si es posible implementar algo similar a esto usando las API de Android. Para aclarar, defino similar a:

  • No es un mensaje SMS, sino una solución basada en datos
  • Tan en tiempo real como sea posible
  • Es escalable, es decir, como parte del servidor de una aplicación móvil, podría notificar a miles de instancias de la aplicación en segundos

Aprecio que la aplicación pueda estar basada en el estilo de solicitud / respuesta HTTP, pero lo ideal es que no quiera sondear tanto para verificar la notificación; además de lo cual es como goteo drenando el plan de datos.

j pimmel
fuente
3
La notificación para gmail y gchat suele estar dentro de ese umbral. Debería haber una manera de replicar esto en su propia aplicación.
Dana the Sane
Sí, hay una biblioteca de Android que hace que los mensajes push sean muy simples ... solo incluya la biblioteca de notificaciones Droid de Jigy's en su aplicación y a partir de ahí son solo 10 líneas de código ... espero que esto ayude :)
Corey Harden
Consulte Pushy ( pushy.me ) para obtener una puerta de enlace de notificaciones push en tiempo real que utiliza MQTT debajo del capó para una mayor confiabilidad. Revelación completa: fundé Pushy.
Elad Nava

Respuestas:

215

Firebase Cloud Messaging FCM FAQ es la nueva versión de GCM. Hereda la infraestructura central de GCM para entregar mensajes de manera confiable en Android, iOS y Chrome. Sin embargo, continuarán admitiendo GCM porque muchos desarrolladores están usando SDK de GCM hoy para manejar las notificaciones, y la actualización de la aplicación cliente lleva tiempo.

A partir del 26 de junio de 2012, Google Cloud Messaging es la forma preferida de enviar mensajes a aplicaciones que se ejecutan en dispositivos.

Anteriormente (y ahora en desuso), el servicio se llamaba Cloud To Device Messaging .

j pimmel
fuente
14
Google proporciona documentación detallada para implementar esto en su aplicación de Android en Java en code.google.com/android/c2dm, pero falta su código de muestra para comunicarse con el aspecto del lado del servidor de C2DM. He escrito un tutorial para ese aspecto aquí: blog.boxedice.com/2010/10/07/…
DavidM
2
¿Hay alguna manera de ofrecer notificaciones push a los usuarios con Android 2.2, pero hacer que la misma aplicación sea ejecutable en distribuciones anteriores, solo sin notificaciones push?
OneWorld
3
@OneWorld: sí, al igual que cualquier otra técnica de compatibilidad con versiones anteriores de Android, use la reflexión para elegir una estrategia alternativa cuando C2DM no esté disponible, para más información, consulte: developer.android.com/resources/articles/…
Lie Ryan
1
developer.android.com/videos/index.html#v=PLM4LajwDVc Presentación de Google I / O 2010 sobre notificaciones push
vokilam
66
C2DM ha quedado en desuso oficialmente a partir del 26 de junio de 2012, utilice [Google Cloud Messaging para Android] ( developer.android.com/guide/google/gcm/index.html en su lugar
Mithun Sreedharan
47

XMPP es una buena solución. Lo he usado para una aplicación de Android en tiempo real habilitada para inserción. XMPP es potente, altamente extensible y fácil de integrar y usar.

Hay muchos servidores XMPP gratuitos (aunque por cortesía no debe abusar de ellos) y hay servidores de código abierto que puede ejecutar en uno de sus propios cuadros. OpenFire es una excelente opción.

La biblioteca que desea no es Smack como se señaló anteriormente, es aSmack . Pero tenga en cuenta que este es un entorno de compilación: tendrá que compilar la biblioteca.

Este es un cálculo que hice sobre el impacto de la vida útil de la batería de una solución XMPP:

El cliente de Android debe mantener una conexión TCP persistente al despertarse periódicamente para enviar un latido al servidor XMPP.
Esto claramente impone un costo en términos de uso de energía. A continuación se proporciona una estimación de este costo:

  • Usando una batería de 1400mAh (como se suministra en el Nexus One y HTC Desire)
  • Un dispositivo inactivo, conectado a una red 3G, usa aproximadamente 5 mA
  • El ciclo de despertar, latidos del corazón y sueño ocurre cada 5 minutos, tarda tres segundos en completarse y usa 300 mA
  • Por lo tanto, el costo del uso de la batería por hora es:
    • 36 segundos 300mA = 3mAh enviando latidos
    • 3600 segundos 5mA = 5mAh en inactivo
    • 4:95 + 3 = 7: 95mAh combinados
  • Una batería de 1400 mAh dura aproximadamente 11.6 días en inactivo y 7.3 días cuando se ejecuta la aplicación, lo que representa una reducción aproximada del 37% en la vida útil de la batería.
  • Sin embargo, una reducción en la duración de la batería del 37% representa el peor de los casos en la práctica dado que los dispositivos rara vez están completamente inactivos.
carne
fuente
2
Sin embargo, en la práctica, el teléfono durará 3 horas cuando las aplicaciones lo hagan, ya que cientos de intentos se ejecutan cuando el teléfono se activa o la pantalla se enciende o cambia el estado de la red.
Monstieur
33

Recientemente comencé a jugar con MQTT http://mqtt.org para Android como una forma de hacer lo que está pidiendo (es decir, no SMS sino datos, entrega de mensajes casi inmediata, escalable, no sondeo, etc.)

Tengo una publicación de blog con información de fondo sobre esto en caso de que sea útil http://dalelane.co.uk/blog/?p=938

(Nota: MQTT es una tecnología de IBM, y debo señalar que trabajo para IBM).

Dalelane
fuente
¿Cómo está haciendo esto mqtt? Debe haber alguna encuesta involucrada en alguna parte? Incluso Apple tiene que sondear, pero creo que solo están haciendo una conexión a la vez, por lo tanto, no están agotando tanto la batería ...
Janusz
3
Lo hace abriendo una conexión TCP / IP y dejándola abierta. No sondea, aunque ocasionalmente tiene que enviar un pequeño mensaje de ping por la conexión para mantenerlo vivo.
dalelane 01 de
MQTT es definitivamente el camino a seguir si enviar su mensaje push a través de Google lo incomoda. Además, tenemos acuerdos de confidencialidad con nuestros clientes que prohíben el uso de servicios en la nube para el intercambio de datos.
VH-NZZ
8

Si puede depender de que las bibliotecas de Google estén allí para su mercado objetivo, entonces puede aprovechar la funcionalidad GTalk (registrar un recurso en el nombre de usuario existente: interceptar los mensajes a medida que ingresan con un BroadcastReceiver).

Si no es así, y espero que no pueda , entonces está interesado en combinar sus propias versiones de XMPP . Esto es una molestia, pero puede hacerse más fácil si XMPP se incluye por separado como una biblioteca independiente.

También puede considerar PubSubHubub , pero no tengo idea del uso de la red. Creo que está construido sobre XMPP.

jamesh
fuente
Creo que las estadísticas del artículo indican que la funcionalidad piggy back siempre estará disponible mientras las bibliotecas gtalk estén en el dispositivo. ¿Tiene algunos recursos con ejemplos de cómo hacerlo realmente?
Janusz
GTalk se elimina del SDK desde 1.0 (iirc).
MrSnowflake
8

He estado investigando esto y PubSubHubBub recomendado por jamesh no es una opción. PubSubHubBub está diseñado para comunicaciones de servidor a servidor

"Estoy detrás de un NAT. ¿Puedo suscribirme a un Hub? El Hub no puede conectarse conmigo".

/Anónimo

No, PSHB es un protocolo de servidor a servidor. Si estás detrás de NAT, no eres realmente un servidor. Si bien hemos presentado ideas para extensiones opcionales de PSHB para hacer colgadas ("sondeo largo") y / o sondeo de cuadro de mensaje para dichos clientes, no está en la especificación principal. La especificación principal es solo de servidor a servidor.

/ Brad Fitzpatrick, San Francisco, CA

Fuente: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (no es posible el enlace directo)

He llegado a la conclusión de que el método más simple es usar el empuje HTTP Comet. Esta es una solución simple y bien entendida, pero también se puede reutilizar para aplicaciones web.

Morgan Christiansson
fuente
8

Hay un nuevo esfuerzo de código abierto para desarrollar una biblioteca Java para notificaciones push en Android, utilizando el servidor cometa Meteor como back-end. Puede consultarlo en el Blog del Proyecto Deacon . Necesitamos desarrolladores, así que ¡corra la voz!

mtbkrdave
fuente
7

Google recientemente (18 de mayo de 2016) anunció que Firebase es ahora su plataforma unificada para desarrolladores móviles que incluye notificaciones push casi en tiempo real. También es multiplataforma:

La compañía ahora ofrece a todos los usuarios de Firebase notificaciones gratuitas e ilimitadas con soporte para iOS, Android y la Web.

fuente

Freek Nortier
fuente
6

No puedo encontrar dónde lo leí, pero creo que gmail utiliza una conexión TCP abierta para enviar el correo electrónico.

Será
fuente
Hay una publicación de blog en joelapenna.com/blog/2009/07/android-foursquare-and-push por un desarrollador de una aplicación de Android que parece apoyar esto.
dalelane 05 de
Estos me parecen, también están votando. El dispositivo móvil se conecta al servidor y notifica al servidor que está esperando actualizaciones. Impulso real es iniciada por el servidor, lo que es muy difícil para los dispositivos móviles, y la mayoría de las veces implica el soporte del proveedor de red (SMS / WAP Push) ...
MrSnowflake
1
"C2DM permite a los desarrolladores externos utilizar el mismo servicio que las aplicaciones de Google". desde la nube de Android a la mensajería del dispositivo
colithium
6

Como GTalkse ha ido del SDK, podría ser una buena idea hacer un sistema de mensajería push 'estándar'. De esa manera, solo se debe ejecutar un servicio, solo se debe abrir una conexión TCP adicional. Las aplicaciones deben comunicarse con este servicio utilizandoIntents y primero deben solicitar permiso para enviar y recibir notificaciones del servicio. El servicio debe notificar al usuario que una nueva aplicación desea enviar y recibir mensajes. El usuario otorgará o denegará el permiso, por lo que mantiene el control. La aplicación luego registrará una acción + categoría para el servicio, de modo que el servicio sepa cómo entregar el mensaje enviado.

¿Sería una buena idea o no?

MrSnowflake
fuente
6

¿Por qué no vas con la implementación de XMPP? en este momento hay tantos servidores públicos disponibles, incluidos gtalk, jabber, citadel, etc. Para Android, hay un SDK que también está disponible como SMACK. Esto no podemos decir una notificación de inserción, pero utilizando el XMPP puede mantener una conexión abierta entre el cliente y el servidor que permitirá una comunicación bidireccional. Significa que el cliente y el servidor de Android pueden comunicarse entre sí. En la actualidad, esto satisfará la necesidad de Push en Android. He implementado un código de muestra y realmente funciona muy bien

Rahul Patel
fuente
¿Le gustaría proporcionar un enlace a su código de muestra? ¿Has hecho alguna prueba con respecto a la duración de la batería?
Alex
He realizado pruebas de duración de la batería: el latido que debe enviar cada seis minutos reduce la duración de la batería en un 30% en el peor de los casos (es decir, el dispositivo solo se activa para enviar un latido). En el mejor de los casos (el usuario está usando el dispositivo para navegar, llamadas, etc.), el impacto en la duración de la batería es insignificante.
carne
6

Recientemente desarrollé http://pushdroid.org, es una aplicación única que debe instalarse en el teléfono tal como Google lo implementó en 2.2, esto funciona desde 1.5 y se transmite por intención.

Stefan
fuente
4

El problema con GCM es que hay mucha configuración involucrada en el proceso:

  • Tienes que agregar una gran cantidad de repeticiones a tu aplicación de Android
  • Debe configurar un servidor externo para comunicarse con el servidor GCM
  • Tendrás que escribir pruebas

Si te gustan las cosas simples (como yo), deberías probar UrbanAirship . Es (en mi humilde opinión) la forma más fácil de usar GCM en su aplicación sin hacer mucha configuración. También le ofrece una interfaz gráfica de usuario bonita para probar que sus mensajes GCM se entregan correctamente.

  • Puede encontrar los documentos y la guía de inicio aquí
  • Puedes encontrar una aplicación de muestra aquí

Nota: no estoy afiliado a UrbanAirship de ninguna manera

fernandohur
fuente
2

Tienen sus oyentes, que usted debe usar utilizando sus clases de biblioteca en su código. No necesita preocuparse por empujar. Tiene que enviar el mensaje al servidor servidor empujará el mensaje al dispositivo. Ellos usan OAuth. Con respecto a los protocolos, hay dos métodos que utilizan CCS y XMPP. CCS solo usa XMPP como una capa de transporte autenticada, por lo que puede usar la mayoría de las bibliotecas XMPP para administrar la conexión. Para enviar notificaciones al dispositivo, puede escribir código en la aplicación de Android para enviar, así como el código de su servidor. el envío del mensaje se realizará solo con su código. El resto será atendido por Google Server en el caso de GCM. Puedes consultar los detalles en este enlace

http://developer.android.com/google/gcm/server.html

Además, por cuestiones de seguridad

seguridad de mensajería en la nube de Google https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

En caso de que su aplicación no se esté ejecutando, los dispositivos también pueden recibir notificaciones porque debe escribir código para los oyentes de difusión. En segundo plano, estará escuchando al servidor y cada vez que haya algún paquete de mensajes, recibirá el mensaje como notificación. Android tiene un servicio que no debes molestarte. Solo tiene que usar esos recursos usando la clase de biblioteca que facilita su trabajo y les permite escribir si su aplicación no se está ejecutando, entonces también recibirá una notificación. Obviamente, habrá algún oyente que haga que la aplicación reciba. Verifique la sección "Recibir el mensaje" en este enlace.

http://developer.android.com/google/gcm/client.html

Aceptará la solicitud de los usuarios también. Para GCM lo hará. Por favor marque "Enviar un mensaje"

http://developer.android.com/google/gcm/client.html

revs ajitksharma
fuente