XMPP:如何向服务器请求用户联系人的存在状态?

put*_*uan 2 xmpp ejabberd strophe

我们有一个网站,并使用 strope.js 库和 ejabberd XMPP 服务器为其开发了一个聊天系统。我们使用通过 PHP 启动的会话附件(使用内部库)。我们所做的就是从 PHP 脚本中获取 RID 和 SID,然后使用 strope 的会话附件。所述 RID 和 SID 存储在 cookie 中,每次 strope.js 上的 RID 更新时,cookie 上的 RID 值都会更新。

这工作正常,登录后我们会收到每个联系人的在线状态。这样做的问题是,当您转到站点上的另一个页面并使用所述 RID(我们使用 strope 生成的增量值)和 SID 进行附加时,服务器将不再发送您的联系人的状态信息,而不是当您登录时。这导致我们的联系人区域显示为完全不可见,即使他们在线。仅当您(或您的联系人)注销聊天然后再次登录时,它们才会在线显示(因为您将从 XMPP 服务器收到状态更新)。

我编写了一种解决方法,当从服务器接收到在线状态时,您的联系人的在线状态将保存在 cookie 中(所有在线联系人的 JID 都会保存在 cookie 中)。每次页面加载时都会检查此功能,如果设置了 cookie,则会读取该 cookie,并且 cookie 上的所有 JID 将被标记为在线。这工作正常,但可能有一些更好的方法来解决这个问题,使用 XMPP 的默认行为。

met*_*ack 5

当您将自己的初始状态发送到服务器时,XMPP 服务器会代表您向所有联系人发送状态探测。从那时起,您将仅收到来自联系人的在线状态更改。

如果您丢失了联系人的在线状态,您将需要发送自己的在线状态探测来重新建立该状态。然而,这可能不是您想要做的很多事情,并且在大多数情况下传递存在状态可能是首选。

您可以尝试通过 XMPP 传递状态。例如,您可以使用私有 XML 存储 (XEP-0049)、Pubsub (XEP-0060) 或 PEP (XEP-0163)。

另一种替代 Cookie 来传递给客户端的选项是使用 HTML5 SharedWorker 对象来保存状态。