我正在将MongooseIM用于XEP-0022 <消息>事件,例如<脱机>,<传递>,<显示>,<编写>等,以确认消息传递等。我对<脱机>和<组成>,但在另两个方面有困难。
如果两个用户(聊天)都在线,则一切正常。但是,如果考虑以下用例:
简而言之,两个都必须同时在线才能使其正常工作。所以,我的担心是:
答案 0 :(得分:2)
首先,XEP-0022被淘汰。最好遵循XSF的建议-这是标准化XMPP的基础-并使用更现代的XEP解决此问题。话虽如此,我将XEP-0085: Chat State Notifications用于<composing/>
,如通知,将XEP-0333: Chat Markers用于<received/>
或<displayed/>
收据。
如何确保将消息传递并显示给第二个用户,而又不会同时使它们同时联机。
您应使用由MongooseIM(或ejabberd)的XEP-313: Message Archive Management实现的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
当前离线。