【问题标题】:Offline message not retrive from smack api 4.1.6 from xmpp MongooseIM server离线消息未从 xmpp MongooseIM 服务器的 smack api 4.1.6 检索
【发布时间】:2016-07-26 07:26:15
【问题描述】:

我正面临使用 XMPP Mongoose 服务器的 smack api 在 android 应用程序中检索离线消息的问题。根据代码流尝试在用户登录 xmpp mongoose 服务器时检索离线消息,然后再将可用状态发送到 mongoose 服务器。

尝试了两种不同的方式来检索离线消息,但仍然无法找到相同的工作解决方案。我尝试过的这两种方法都在下面详细解释。

在我们用于 xmpp 连接和所有其他扩展的 Api 下方:

// Smack(XMPP 客户端库)

编译'org.igniterealtime.smack:smack-android:4.1.6'

编译'org.igniterealtime.smack:smack-tcp:4.1.6'

编译'org.igniterealtime.smack:smack-im:4.1.6'

编译'org.igniterealtime.smack:smack-android-extensions:4.1.6'

尝试使用 offlineMessageManager 检索离线消息

以下是我在登录后和向服务器发送可用状态之前尝试检索离线消息的代码

试试{

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();

Iterator i = (Iterator) offlineMessageManager.getMessages();

while (i.hasNext())

{ 消息消息 = i.next(); System.out.println("得到文本 [" + msg.getBody() + "] 从 [" + msg.getFrom() + "]");

} 捕获(XMPPException e)

{ System.out.println("错误离线消息。"); e.printStackTrace(); }

catch (SmackException.NotConnectedException e)

{ System.out.println("错误离线消息。无连接"); e.printStackTrace(); }

catch (SmackException.NoResponseException e)

{ System.out.println("错误离线消息。无响应"); e.printStackTrace(); }

问题案例 1:

以下是上述代码执行时产生的异常详情

在下面的代码行执行时出现异常。

Iterator i = (Iterator) offlineMessageManager.getMessages();

以下是上述行执行时生成的异常描述

org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: service-unavailable - cancel

问题案例 2:

如果检查是使用来自 xmmp mongoose 服务器的 smack 从 android 代码支持的灵活离线消息,那么我得到了错误值。以下是我用于测试的代码。

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();

问题案例 3:

当我尝试使用下面的 smack 代码使用下面的方法检索支持的功能时。

ServiceDiscoveryManager 经理 = ServiceDiscoveryManager

.getInstanceFor(连接);

列出所有功能 = manager.getFeatures();

以下是我检索的功能列表:

http://jabber.org/protocol/bytestreams,

jabber:iq:privacy, urn:xmpp:ping,

http://jabber.org/protocol/commands,

jabber:iq:版本,

jabber:iq:last,

http://jabber.org/protocol/xdata-validate,

http://jabber.org/protocol/xhtml-im,

vcard-温度,

http://jabber.org/protocol/chatstates,

urn:xmpp:receipts, urn:xmpp:time,

http://jabber.org/protocol/xdata-layout,

http://jabber.org/protocol/muc,

http://jabber.org/protocol/disco#items,

http://jabber.org/protocol/disco#info,

http://jabber.org/protocol/caps,

jabber:x:数据

尝试使用 XMPP MongooseIM 的包侦听器检索离线消息

下面是我尝试使用来自 smack api 4.1.6 的包侦听器的代码。

private static final StanzaFilter MESSAGE_PACKET_FILTER= new OrFilter(StanzaTypeFilter.MESSAGE);

配置 = XMPPTCPConnectionConfiguration.builder()

            .setServiceName(SERVICE_NAME)

            .setHost(KDevelopmentXMPPServer)

            .setPort(PORT)

            .setSendPresence(false)

            .build();

//使用配置的详细信息创建xmpp连接的Connection对象

connection = new XMPPTCPConnection(configuration);

connection.addAsyncStanzaListener(new StanzaListener() {

            @Override

            public void processPacket(Stanza packet) throws SmackException.NotConnectedException {


                Log.d("CheckPacket", "OfflineMEssage");


                Message message = (Message) packet;

                if (message != null) {

                    if (message.getBody() != null) {



                        Log.i("XMPPClient", "Got text [" + message.getBody()

                                + "] from [" + message.getFrom() + "]");



                    }

                }



            }

        }, MESSAGE_PACKET_FILTER);

connection.login(用户、密码);

在此先感谢,请任何人帮助我为我的关键问题找到最佳可行的解决方案。

【问题讨论】:

  • 您确定在您的 MongooseIM 实例中启用了离线消息支持(模块 mod_offline)吗?好像不是这样的。
  • 嗨,erszcz,是的,它已启用。在我们正在运行的 ios 应用程序中。但问题仅存在于使用 smack api 的 android 中。
  • 它将帮助您检查 XML XMPP 级别的流量。您将看到您发送到服务器的确切内容以及服务器回复的内容。

标签: android asmack mongoose-im


【解决方案1】:

我知道我写这篇文章太晚了,但是如果像我这样正在寻找与 “如何在 android 应用程序中保存和获取存档消息” 中相同的查询的人可以参考这个答案:

注意: 这是在最新版本中实现的

要求:

  1. 截至目前最新的开火4.1.4
  2. 在 openfire 中安装 Archives 插件
    MamManager mamManager = MamManager.getInstanceFor(connection);
    boolean isSupported = mamManager.isSupportedByServer();
    if (isSupported) {
        MamManager.MamQueryResult mamQueryResult = mamManager.queryArchive(500);
        List<Forwarded> forwardedMessages = mamQueryResult.forwardedMessages;
        Forwarded d = forwardedMessages.get(0);
    }

请参考:Documention for MamManager Class

【讨论】:

  • 我收到了这个异常XMPPError: feature-not-implemented - cancel,知道是什么问题吗?
  • @ADM 你必须在 opoen fire 中添加插件
【解决方案2】:

问题在于尝试在之前获取离线消息 发送初始存在。 XEP-0160 状态:

当接收者下一次向服务器发送非否定的可用状态时,服务器会将消息传递给已发送该状态的资源。 [...]

MongooseIM 按照此建议工作。

您已经指出isFlexibleRetrievalSupport 的信号 - 服务器不支持灵活的离线消息检索。

【讨论】:

  • 是的,服务器不支持灵活的离线消息检索。这就是为什么使用 offlinemessagemnager 无法检索离线消息的原因。** 如果服务器不支持这种灵活的离线消息检索,还有其他方法可以在 android 中使用 smack api 4.1.6 检索离线消息吗?**
  • 正如我在上面的答案中所说:服务器仅在您发送初始状态后发送离线消息。发送初始状态,您将收到消息。
  • @KavitaMevada 到目前为止有什么进展吗?
猜你喜欢
  • 1970-01-01
  • 2016-12-09
  • 2023-03-24
  • 2012-12-26
  • 2015-10-20
  • 2011-05-31
  • 2016-01-03
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多