Aplicación de chat para Android mediante un servidor XMPP y Google Cloud Messaging (o la nueva mensajería de Cloud de Firebase) para notificaciones por push

Estoy desarrollando una aplicación de chat para Android. He estado leyendo durante semanas sobre XMPP y Google Cloud Messaging (y Firebase Cloud Messaging) y todavía estoy muy confundido.

Actualmente, ya he configurado un servidor XMPP localmente (Ejabberd) y he conectado correctamente mi aplicación Android a ella usando la biblioteca Smack.

A mi entender, necesito usar GCM o el FCM más reciente para notificaciones por push, así que ya he creado un proyecto en Google Cloud Platform. Mi aplicación para Android también se puede conectar a ella usando la biblioteca Smack (en lugar de conectarse directamente a mi servidor XMPP). En mi servidor tengo una pequeña aplicación Java que se conecta a GCM usando la biblioteca Smack también.

Todo está bien hasta aquí. Mi gran confusión es: ¿Cómo puedo usar mi servidor XMPP con GCM para notificaciones por push? Cada documentación, ejemplos, guías, tutoriales que encontré para las implementaciones del lado del servidor, solo me dicen cómo conectarse a GCM, pero ninguna me dice cómo usar mi servidor XMPP junto con GCM. ¿Qué me falta? Mi aplicación Java solo se conecta a GCM, recibe y envía mensajes desde y hacia GCM, pero mi servidor XMPP está sentado allí sin hacer nada. En realidad, mi aplicación Android y la aplicación Java de servidor utilizan GCM exclusivamente, no mi servidor XMPP.

Espero que alguien me ayude a entender esto como un todo, obviamente me faltan algunos elementos clave para lograr esta implementación.

Necesitas mezclar Ejabberd y FCM juntos, así es como todas las grandes aplicaciones de chat lo hacen por ahí. Para los conceptos básicos, hay 3 componentes: App Server conectado a través de XMPP a FCM, Ejabberd y su aplicación cliente.

  1. Cuando la aplicación está en primer plano, utiliza la biblioteca Smack para conectarse directamente a su servidor Ejabberd, enviar mensajes, cambiar la presencia del usuario, etc. La conexión a su Ejabberd se mantiene durante ese tiempo . ¡ No envías mensajes en sentido ascendente durante este tiempo!
  2. Una vez que el usuario se aleje de su aplicación, se cierra la conexión . El usuario se considera ahora "Ausente" o "Sin conexión".
  3. A partir de este momento, el servidor de aplicaciones se comunica con FCM para enviar mensajes descendentes al dispositivo mediante la biblioteca Smack.
  4. En el dispositivo cliente: maneja el mensaje entrante y muestra una notificación. Con Android N, los usuarios pueden responder directamente desde la notificación. Supongo que en este caso, usaría FCM para enviar un mensaje ascendente a su servidor de aplicaciones ya que durante ese tiempo, no hay ninguna conexión activa a su servidor Ejabberd.
  5. Una vez que el usuario teclea la notificación, la aplicación vuelve al primer plano y vuelve a conectarse a Ejabberd y vuelve al paso 1.

Esta es la descripción muy básica de la arquitectura que debe tener para lograr lo que desea.

Debe configurar un servidor Java que se conecte a FCM (anteriormente GCM). A continuación, desde su dispositivo puede enviar un mensaje de arriba a FCM que luego envía ese mensaje de arriba a su servidor de Java y luego dentro de ese servidor de Java que puede manejar ese mensaje de arriba para enviar un mensaje de abajo hacia el dispositivo de destino. Luego, en el lado del dispositivo, puede manejar los mensajes de abajo que se reciben para dar una notificación de empuje.

Algunos enlaces útiles:

Cómo enviar un mensaje ascendente:
https://firebase.google.com/docs/cloud-messaging/upstream#sample-send

Cómo recibir y manejar los mensajes siguientes:
https://firebase.google.com/docs/cloud-messaging/downstream#sample-receive

Cómo configuro un servidor Java de ejemplo:
https://stackoverflow.com/a/38170310/4433653

Este es un ejemplo de proyecto java para mostrar el servidor de conexión XMPP de Firebase Cloud Messaging (FCM). Este proyecto es un servidor autónomo muy simple que desarrollé como base de un proyecto más grande. Es un servidor de aplicaciones que debemos implementar en nuestro entorno. Este servidor envía datos a una aplicación cliente a través del servidor FCM CCS utilizando el protocolo XMPP.

https://github.com/carlosCharz/fcmxmppserver

Y también he creado un video en youtube donde le explico lo que hace.

https://www.youtube.com/watch?v=PA91bVq5sHw

Esperamos que te sea útil.

También estoy construyendo la aplicación de chat en Android usando Smack v.4.1.8 que última versión de Smack, y nuestro servidor está usando ejabberd. No utilizo ningún tercero como GCM o Firebase para empujar el mensaje descendente del mensaje del usuario al usuario. Si no estoy equivocado va a utilizar GCM o Firebase para empujar el usuario al mensaje de usuario, si es así simplemente no hacer eso.

¿Por qué? El protocolo TCP es seguir escuchando un oyente de invocación que registró en la aplicación cuando la conexión se establece y sigue conectada. Smack tiene un oyente que llama "addAsyncStanzaListener ()"

AddAsyncStanzaListener se utiliza para escuchar un paquete de recepción en la aplicación. Ellos tienen

  public void processPacket(Stanza packet) 

Usted puede invocar eso, y usted escuchará el paquete sobre el tiempo.

Hago una investigación sobre mantener la conexión estable de Smack. La mayoría de Android Smartphone tiene cada configuración y restricción. No podemos probar todos los dispositivos. Aquí mis consejos para mantener la conexión estable:

  1. Utilizar ForegroundService en lugar de BackgroundService, propongo este enfoque porque la mayoría de dispositivos Android tienen restricción para una aplicación que se ejecutan en segundo plano. Ellos matan a la aplicación cuando la aplicación deslizar desde el administrador de tareas. (Por ejemplo, Asus zenphone tienen gestión de energía)
  2. ForegroundService evitará que la aplicación esté inactiva.
  3. Registrar ReconnectingManager
  4. Registrarse Pingfailed
  5. Registrar ServerPingWithAlarmManager

Y eso es. Cualquier pregunta, sólo comentario abajo 🙂

Mejor Mirada R Aditya Gumay

  • Eventos XMPP en Android
  • Conexión XMPP con Smack 4.1 en Android Studio
  • Mensajes perdidos sobre XMPP en el dispositivo desconectado
  • Cómo manejar mantener vivo la conexión en android
  • Uso de su propio servidor XMPP para la aplicación de chat Android (Smack API)
  • Smack 4.1 Problema de re-conexión
  • Vida de la batería de Android XMPP
  • No se puede iniciar sesión en el servidor ejabberd mediante el cliente XMPP en Android
  • Mensajería instantánea sobre xmpp o websocket
  • ¿Es la mejor práctica para las conexiones móviles persistentes en Android?
  • agregar / sincronizar contactos automáticamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.