0

我正在使用 MongooseIM 和 XEP-0022 <消息> 事件,如 <离线>、<已交付>、<显示>、<撰写> 以确认消息传递等。我对 <离线> 和 <撰写> 的工作感到满意,但是与其他两个有一些困难。

如果两个用户(聊天)都在线,那么一切都会很好。但如果考虑以下用例:

  1. 假设第 2 个用户离线,第 1 个用户在线并发送带有所有 4 个事件的 <message>,然后离线。
  2. 然后第二个用户上线(请记住,第一个用户现在离线)并且该用户收到 < message > 作为回报,他发送 <delivery> 和 <displayed> 事件,现在第二个用户进入离线阶段。
  3. 一段时间后,当第一个用户再次上线时,他没有收到任何 <delivery> 和 <displayed> 事件。

简而言之,两者都需要同时在线才能使其工作。所以,我担心的是:

  1. 如何确保将消息传递并显示给第二个用户,而不会同时使两者在线而头疼。
  2. 我是否遗漏了什么或者可以通过一些配置更改来解决?
  3. 我应该在这里使用 FCM 吗?
4

1 回答 1

2

首先,XEP-0022 已过时。最好遵循 XSF 的建议——它是标准化 XMPP 的基础——并使用更现代的 XEP 来解决这个问题。话虽如此,我会使用XEP-0085: Chat State Notifications来表示<composing/>类似的通知,并使用XEP-0333: Chat Markers来表示<received/><displayed/>收据。

如何确保将消息传递并显示给第二个用户,而不会同时使两者在线而头疼。

您应该使用XEP-313:由 MongooseIM(或 ejabberd 的)mod_mam实现的消息存档管理。它将聊天记录保存在服务器的数据库中,允许您随时获取过去的对话,而无需聊天伙伴在线。

默认情况下,mod_mam 不存储不带文本的消息(<body/>准确地说是没有子元素或空子元素),但它是可配置的,为了存储 XEP-333 聊天标记,您必须重新配置它。存储 XEP-85 通知可能没有意义,因为它们只有在两个用户都在线时才有意义。

一旦您能够获取聊天标记,客户端应用程序就必须查询消息存档、处理结果并找到与来自现在离线用户的消息相对应的任何聊天标记。请记住,虽然从在线用户发送的常规标记看起来像这样(来自 XEP-333 的示例 4):

<message from='kingrichard@royalty.england.lit/throne'
         id='message-2'
         to='northumberland@shakespeare.lit/westminster'>
  <thread>sleeping</thread>
  <received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
</message>

从存档返回的用户聊天标记northumberland@shakespeare.lit如下所示 - 它将被包裹在“信封”中,标记它是存档查询结果:

<message id='aeb213'
    from='northumberland@shakespeare.lit'
    to='northumberland@shakespeare.lit/westminster'>
    <result xmlns='urn:xmpp:mam:2' queryid='f27' id='28482-98726-73623'>
        <forwarded xmlns='urn:xmpp:forward:0'>
            <delay xmlns='urn:xmpp:delay' stamp='2010-07-10T23:08:25Z'/>
            <message from='kingrichard@royalty.england.lit/throne'
                id='message-2'
                to='northumberland@shakespeare.lit/westminster'>
                <thread>sleeping</thread>
                <received xmlns='urn:xmpp:chat-markers:0' id='message-1'/>
            </message>
        </forwarded>
    </result>
</message>

这样就northumberland@shakespeare.lit知道kingrichard@royalty.england.lit已经收到了<message id='message-1'/>,即使kingrichard@royalty.england.lit当前处于离线状态。

于 2018-11-16T19:01:49.267 回答