¿Cómo enviar un mensaje XMPP cuando el remitente está fuera de línea?
Estoy usando aSmack y Openfire para mi aplicación de chat. Puedo enviar y recibir el mensaje finamente. Openfire soporta la transferencia de mensajes fuera de línea cuando el destinatario está desconectado manteniendo el mensaje hasta que esté conectado.
Pero, ¿qué hacer cuando el remitente está fuera de línea o su internet cae entre la comunicación?
- Mantener la conexión XMPP (utilizando smack) en vivo durante la aplicación
- Cómo obtener DiscussionHistory para MultiUserChat habitación usando aSmack?
- Android y (millones de) notificaciones push
- Agregar participantes a las salas de chat XMPP
- Smack en Android, obteniendo el código de error = "404" servidor remoto no encontrado al enviar paquetes / mensaje entre dos usuarios a través del servidor local Openfire
¿Hay alguna api proporcionada por aSmack / Smack que mantiene el mensaje hasta que Internet está de vuelta?
¿O debo enviar mis mensajes a través de SQLite?
- ¿Cómo mantener una conexión XMPP estable en Android con (a) smack?
- Enviar / Recibir solicitud de amigo Uso del servidor XMPP en Android
- Cómo utilizar Smack 4.1 en Android?
- Vida de la batería de Android XMPP
- InstanceID y Regid GCM
- ¿Cómo crear un cliente de chat XMPP para Facebook?
- Asmack XMPP nuevo registro de usuario
- ¿Cómo podemos acceder a los mensajes del archivo en la aplicación android desde el servidor xmpp
Si estás conectado a openfire e internet se apaga entonces sigues en línea en openfire porque no puedes cambiar la presencia si internet está apagado.
Para este uso openfire http://xmpp.org/extensions/xep-0199.html
Si la aplicación de usuario no responde a la solicitud de ping, entonces openfire lo hace desconectado y se inicia el almacenamiento sin conexión.
Para obtener mensajes sin conexión en asmack es necesario agregar siguientes proveedores. Después de agregar estos obtendrá mensajes sin conexión si están habilitados desde el servidor
pm.addIQProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider()); // Offline Message Indicator pm.addExtensionProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());
Iones / xep-0199.html
Bueno respondiendo después de un tiempo, pero tal vez todavía señalaría a alguien en la dirección correcta.
Después de buscar por un tiempo, llego a saber que aSmack no proporciona ningún almacenamiento sin conexión.
Para enviar mensajes cuando el remitente está desconectado, necesitamos almacenamiento sin conexión para almacenar el mensaje hasta que el remitente vuelva a estar conectado. He utilizado sqlite
para esto, pero SharedPreferences también sería una buena opción si tenemos que borrar el mensaje después de enviar correctamente.
La mejor solución, que yo sigo es, insertar mensaje en sqlite
, almacenar su id en shared preferences
, enviar mensaje y luego eliminar la identificación de shared preferences
. En el medio mientras que si la conexión del intenet cae o el mensaje no podría enviar por ninguna razón, entonces tenemos su identificación en preferencias compartidas como reserva. Después de obtener en línea, podemos ir a través de shared preferences
para comprobar si su es cualquier mensaje está pendiente de enviar.