如何在ejabbered/XMPP中获取发送/接收消息的确认?

7
如何通过XMPP框架ejabberd确定消息已成功发送给其他用户?我们使用XEP-0184类来进行消息传递收据的确认,在发送消息时同时发送收据请求,但没有收到任何响应。
我的问题是,我是否需要在服务器上进行任何配置(或更改ejabberd.cfg文件),或者我们需要做任何客户端代码方面的更改。
2个回答

6

不,XEP-0184是一种纯客户端协议,因此无需在服务器上进行任何设置。

您未收到任何确认的原因可能有:

  • 您的客户可能没有启用XEP-0184功能。
  • 根据您正在使用的XMPP库(在发送方和接收方的两个客户端上),如果查询到对等方未启用XEP-0184发送方可能会决定甚至不请求回执

    更明确地说:XEP通常建议实现检查是否支持XEP定义的功能,并在不支持该功能时不尝试使用它。并非所有库和客户端都这样做,但有些库和客户端确实如此。这意味着某些实现可能会像这样进行:好的,我被要求发送交付收据请求,因此

    1. 对我即将联系的对等方进行服务发现。
    2. 检查它是否启用了XEP-0184
    3. 如果没有启用,则只需悄悄地不附加任何收据请求。

    特定的XMPP库是否自己执行此操作取决于它的“智能”程度。

如果您所说的XMPP Framework是指this library,请尝试阅读其源代码以查看它是否“聪明”,并请求对等方的能力,然后检查是否启用了XEP-0184
此外,请检查是否可以启用客户端交换的XML流的日志记录。 检查它们是调试XMPP相关问题的最佳方法。

2
您可以使用XEP-0022消息事件扩展来实现此目的:
以下是您的消息格式:
<message to='username@domain.com' id='msgId-21102012,12:12:11'>
  <body>How are you doing?</body>
  <x xmlns='jabber:x:event'>
    <offline/>
    <delivered/>
    <composing/>
  </x>
</message>

根据接收方的状态,开火将会响应消息事件状态。请查看XEP-022扩展。

2
XEP-0022已经过时了(虽然在某些服务器实现中,如ejabberd中非常有用,可以通知消息被存储在离线存储中等)。 - kostix
@kostix 我正在使用ejabberd服务器,所以XEP-0022会与之兼容吗?如果您有任何关于XEP-0022的Objective-C版本的链接,请提供给我们。 - Rohit Pathak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接