当发送者离线时如何发送XMPP消息?

7
我正在使用aSmack和Openfire来开发我的聊天应用程序。我已经能够很好地发送和接收消息。当接收方不在线时,Openfire支持离线消息传递,将消息保留直到接收方上线。
但是,如果发送方不在线或在通信过程中失去了网络连接怎么办?
aSmack/Smack是否提供了任何API来保存消息,直到网络恢复?
还是我应该通过SQLite发送我的消息?

你好 @Sushant,我也遇到了同样的问题,有什么帮助吗? - AITAALI_ABDERRAHMANE
1
@AT_AB 我最终使用了共享首选项和SQLite。在向接收者发送消息之前,将接收者姓名存储在共享首选项中,然后从SQLite获取所有未发送的消息并将它们发送给该接收者。成功发送后,从共享首选项中删除接收者。 - Sushant
2个回答

2
如果您连接到Openfire,但互联网断开连接,则仍然在线于Openfire,因为如果互联网断开连接,则无法更改在线状态。
为此,Openfire使用http://xmpp.org/extensions/xep-0199.html
如果用户应用程序未回复ping请求,则Openfire将其设置为离线,并启动离线存储。
要在asmack中获取离线消息,您需要添加以下提供程序。添加这些提供程序后,如果服务器启用了离线消息,则会收到它们。
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());

enter image description hereions/xep-0199.html


谢谢您的回答。但我不是在询问Openfire离线存储。我在问aSmack离线存储。是否有相关的API呢? - Sushant
编辑了答案,添加了离线提供程序。 - Jaspreet Chhabra
是的,我知道我们可以在重新连接到服务器时获取离线消息。但如果我在发送消息时处于离线状态,那么消息将会丢失。我的意思是要保留消息,直到我重新连接到网络并在网络恢复后再发送。 - Sushant

2
很抱歉回复有些晚,但或许仍能指导某些人朝正确的方向前进。
经过一段时间的搜索,我了解到aSmack不提供任何离线存储。
要在发送者离线时发送消息,我们需要离线存储来存储消息,直到发送者重新上线。我使用了sqlite,但如果我们需要在成功发送后删除消息,则SharedPreferences也是一个不错的选择。
最好的解决方案是:将消息插入sqlite,将其ID存储在SharedPreferences中,发送消息,然后从SharedPreferences中删除ID。在此期间,如果互联网连接断开或由于任何原因无法发送消息,则我们可以在SharedPreferences中备份它的ID。在上线后,我们可以通过SharedPreferences检查是否有任何待发送的消息。

1
@Ahesanali Momin XMPP服务器处理这种情况。如果接收者离线,它会存储消息,并在接收者连接到服务器时将其传递给他们。 - Sushant
嗨 @AhesanaliMomin:你能告诉我插件的名字吗?如果用户在群组中离线但连接到互联网,他/她将立即收到消息。 - Hardik Mamtora
在Openfire中,它被列为保存离线消息。类似这样的东西。 - Ahesanali Suthar
有没有办法可以检查消息是否已发送,因为每当我发送消息并且没有抛出SmackException.NotConnectedException时,newOutgoingMessage(to: EntityBareJid?, message: Message?, chat: Chat?)总是被调用。 - Shubham AgaRwal
@Killer:我找不到任何回调方法可以在成功发送后通知我们。因此,在调用发送方法之前,我们必须检查所有内容,然后在sqlite中将该消息标记为“已发送”。 - Sushant
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接