【问题标题】:How to recover the lost <message> events in Ejabberd/MongooseIM related to XEP-0022如何恢复 Ejabberd/MongooseIM 中与 XEP-0022 相关的丢失的 <message> 事件
【发布时间】:2019-04-19 21:07:37
【问题描述】:

我正在使用 MongooseIM 和 XEP-0022 事件,例如 、、、 以确认消息传递等。我对 和 但在其他两个方面有一些困难。

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

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

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

  1. 如何确保将消息传递给第二位用户并显示给第二位用户,而不必担心同时在线。
  2. 是我遗漏了什么还是可以通过一些配置更改来解决?
  3. 我需要在这里使用 FCM 吗?

【问题讨论】:

  • FCM 是什么意思?
  • 好的,我假设您的意思是 Firebase 云消息传递。
  • 是的,Firebase 云消息
  • 我找到的最后一个解决方案是,我将使用普通 和 元素以及一个特殊元素来区分普通消息节和我的 ping 消息节之间的区别,以便 mod_offline如果用户离线,有助于将其保存以供离线使用。
  • 我将检查以忽略逻辑中聊天消息的消息 ping 节。这将 100% 有效。它有点hacky,但我没有任何其他方式。你说什么?

标签: erlang xmpp chat ejabberd mongoose-im


【解决方案1】:

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

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

您应该使用由 MongooseIM(或 ejabberd 的)mod_mam 实现的 XEP-313: Message Archive Management。它将聊天记录保存在服务器的数据库中,让您可以随时获取过去的对话,而无需聊天伙伴在线。

默认情况下,mod_mam 不存储不带文本的消息(准确地说,没有或为空的&lt;body/&gt; 子元素),但它是可配置的,为了存储 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 已收到&lt;message id='message-1'/&gt;,即使kingrichard@royalty.england.lit 当前处于离线状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2019-02-12
    • 2011-06-11
    相关资源
    最近更新 更多