首先,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
当前处于离线状态。