【问题标题】:How to send XMPP message when sender is offline?发送者离线时如何发送 XMPP 消息?
【发布时间】:2015-06-02 06:36:12
【问题描述】:

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

但是当发件人离线或他的互联网在通信之间中断时该怎么办?

aSmack/Smack 是否提供任何 api 来保持消息直到互联网恢复?

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

【问题讨论】:

  • 你好@Sushant,我也遇到了同样的问题,求帮助
  • @AT_AB 我最终使用了共享首选项和 sqlite。在向他发送消息之前将收件人姓名存储在共享首选项中,然后从 sqlite 获取所有未发送的消息并将它们发送给该收件人,并在成功发送后从共享首选项中删除收件人。

标签: android xmpp offline asmack sender


【解决方案1】:

一段时间后回答得很好,但也许它仍然会为某人指明正确的方向。

搜索了一会,才知道aSmack不提供离线存储。

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

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

【讨论】:

  • 我想你说的只是发送方,如果接收方离线,当接收方上线时,他/她是否在离线期间收到消息?
  • @Ahesanali Momin XMPP 服务器处理了这种情况。它在接收者离线时存储消息,并在接收者连接到服务器时传递它们。
  • 非常感谢,您说得对。如果我们启用这个离线消息插件,XMPP 服务器就会这样做。
  • 嗨@AhesanaliMomin :您能否提供插件名称,如果用户在 GROUP 下离线并连接到互联网,他/她将立即收到消息?
  • 在 openfire 中它被列为保存离线消息。类似的东西。
【解决方案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());

ions/xep-0199.html

【讨论】:

  • 感谢您的回答。但我不是要求 openfire 离线存储。我在询问 aSmack 离线存储。有api吗?
  • 编辑答案添加离线提供商
  • 是的。我知道我们可以在重新连接到服务器时收到离线消息。但是,如果我在发送消息时处于离线状态,则消息会丢失。我想要的是保留消息,直到我重新连接到网络并在网络恢复时发送。
猜你喜欢
  • 2016-02-28
  • 2011-05-31
  • 1970-01-01
  • 2011-06-25
  • 2013-02-12
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多