发件人离线时如何发送XMPP消息?

How to send XMPP message when sender is offline?

我正在为我的聊天应用程序使用 aSmack 和 Openfire。我能够很好地发送和接收消息。 Openfire 支持在收件人离线时进行离线消息传输,方法是在收件人上线之前保留消息。

但是当发件人离线或他的网络在通信之间掉线时怎么办?

是否有 aSmack/Smack 提供的 api 可以在互联网恢复之前保留消息?

或者我应该通过 SQLite 发送消息吗?

如果您连接到 openfire 并且互联网关闭,那么您仍然在 openfire 上在线,因为如果互联网关闭,您将无法更改在线状态。

对于这个 openfire 使用 http://xmpp.org/extensions/xep-0199.html

如果用户应用程序没有回复 ping 请求,openfire 会使其离线并开始离线存储。

要在 asmack 中获取离线消息,您需要添加以下内容 providers.After 添加这些内容,如果服务器启用了它们,您将获得离线消息

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());

ions/xep-0199.html

好吧,过一会儿再回答,但也许它仍然会给某人指明正确的方向。

找了一段时间才知道aSmack不提供离线存储。

要在发件人离线时发送消息,我们需要离线存储来存储消息,直到发件人重新在线。我为此使用了 sqlite,但如果我们必须在成功发送后删除消息,SharedPreferences 也是一个不错的选择。

我遵循的最佳解决方案是,在 sqlite 中插入消息,将其 ID 存储在 shared preferences 中,发送消息,然后从 shared preferences 中删除 ID。同时,如果互联网连接断开或消息因任何原因无法发送,那么我们会将它的 ID 作为备份共享首选项。上线后,我们可以通过shared preferences查看他们是否有待发送的消息。