XMPP XEP-0313 Smack Android 获取所有名册成员的最新消息

Posted

技术标签:

【中文标题】XMPP XEP-0313 Smack Android 获取所有名册成员的最新消息【英文标题】:XMPP XEP-0313 Smack Android Get the most recent message for all roster members 【发布时间】:2018-08-16 02:09:08 【问题描述】:

一旦我有了名册,我就可以遍历所有成员并使用 MamManager 进行查询 mamManager.mostRecentPage(jid, QUERY_META_DATA_PAGE_SIZE)

但是,这只能让我一次获取一个 jid 的数据,这意味着如果用户有 1000 个连接,我必须进行 1000 个网络调用。有什么方法可以获取多个 jids 的最新消息?

编辑

所以我已经从 smack 的 4.2.3 更新到 4.3 以获得最新的 api,我仍然可以找到一种方法来执行我想要的查询,而无需遍历 jids

for (int i = 0; i < jidList.size(); i++) 
    MamQueryArgs mamQueryArgs = MamQueryArgs.builder()
        .setResultPageSize(1)
        .limitResultsToJid(jidList.get(i))
        .queryLastPage().build();
    MamQuery mamQuery = mamManager.queryArchive(mamQueryArgs);

所以在新用户第一次登录时,我会访问服务器 1000 次

编辑 2

实际上,对于第一次登录,上面的查询没有返回任何内容,可能是因为本地存档为空,所以我必须执行以下操作:

for (Jid : jidList) 
    MamQuery mamQuery = mamManager.queryMostRecentPage(jid, 1);

【问题讨论】:

使用“1”的结果页面大小似乎是一个糟糕的主意。我建议使用更大的尺寸,例如 10。 是的,当用户从聊天列表进入聊天时,我可以缓冲更多,但这不是真正的问题,问题是它对服务器进行的 1000 次查询最多需要 10 分钟同步 我不确定您到底想实现什么,但通常客户端只是同步本地用户存档,如果操作正确,这是一个单一的查询。 那会是什么查询?我正在尝试构建一个聊天连接屏幕,显示完整的花名册,以及发送的最后一条消息的文本,基本上就像 whatsapp,但这些花名册可能很大,p95 是花名册中大约 1000 个连接,每个聊天有 65 个聊天很旧,几个月没用过 可能是在位于存档本地副本之上的消息 ID 之后的查询。然后翻页,直到您到达存档的末尾(即最近的消息)。 【参考方案1】:

有没有办法获取多个jids的最新消息?

这是一个与您帖子标题“获取所有名册成员的最新消息”中的问题不同的问题,不是吗?但我相信这两个问题的答案都是一样的。消息存档管理 (XEP-0313) 查询查询存档。 'jid' 参数仅将结果限制为仅包含具有该 JID 的消息。

如果您查询本地用户存档(常见情况),那么您可以使用带有

的 Smack 简单地查询最后 X 条消息
MamQueryArgs mamQueryArgs = MamQueryArgs.builder()
                                .setResultPageSize(<X>)
                                .queryLastPage()
                                .build();
MamQuery mamQuery = mamManager.queryArchive(mamQueryArgs);

更多信息,请查看MamManager's javadoc。

【讨论】:

谢谢,我查看了 javadoc,但不清楚。如果我 setResultPageSize(1) 是否意味着我将收到 1 条与我连接的所有 jid 的消息? 不,它设置结果的页面大小。我可以建议在 XEP-0313 中阅读它吗? 所以我只是通读了xmpp.org/extensions/xep-0313.html#query,看起来如果不这样循环就无法实现我想要的查询 for (int i = 0; i

以上是关于XMPP XEP-0313 Smack Android 获取所有名册成员的最新消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XMPP 实现聊天列表

多用户聊天 OMEMO 加密消息和 MAM (XEP-0313)

如何为 xmpp 实现 smack

Xmpp 连接因 smack 失败

收到消息时通知 XMPP + Smack

android中的XMPP连接使用smack