【问题标题】:Persistent XMPP MUC (XEP-45), like WhatsApp groupchats持久性 XMPP MUC (XEP-45),例如 WhatsApp 群聊
【发布时间】:2014-11-16 21:53:00
【问题描述】:

从规范——

7.14 退出房间

为了退出多用户聊天室,居住者发送出席信息 类型为“不可用”的节 目前在房间内使用。

示例 80. 住户离开房间

<presence
    from='hag66@shakespeare.lit/pda'
    to='coven@chat.shakespeare.lit/thirdwitch'
    type='unavailable'/>

这意味着一旦用户与 XMPP 服务器断开连接,他就会从服务器端的组中删除。问题很简单——我不想要这种行为;我想要一个类似于 Whatsapp 的行为,即即使用户离线,他仍然是 MUC 房间的一部分(配置为在服务器端持久化)并且会接收来自其他占用者的消息。

鉴于 XEP-0045 和 XMPPFramework for iOS 的规范和文档,我不知道如何完成此操作,或者是否可以在传统的 ejabberd 服务器中完成此操作。

【问题讨论】:

标签: xmpp muc groupchat


【解决方案1】:

XEP-45 是在 10 多年前设计的。那时,设计师们想到了 IRC 频道之类的东西。 XEP-45 的一切都是基于用户在启动/终止客户端时进入和离开房间的假设而设计的。

WhatsApp 群聊不同:加入群聊的用户能够查看该聊天的(完整)历史记录。即使用户客户端离线/不可用,他仍然被视为群聊的一部分。

XMPP 社区目前正在开发提供此类功能的新 XEP。它被称为 XEP-0369: Mediated Information eXchange。它是 XEP-0045 的精神继承者,提供人们期望从现代群聊中获得的功能。

【讨论】:

    【解决方案2】:

    您可以通过使用 MUC 的服务器端历史记录(消息存档管理,XEP-0313)来模拟类似这样的事情,这样当客户端登录时,他们就能够在他们未登录时请求 MUC 的历史记录不在里面。

    如果您还希望能够显示房间的离线伪占用者,最简单的方法可能是为每个房间映射一个 pubsub 节点以存储客户端可以读取的这些伪占用者的列表补充通常的入住清单。

    这里可能还有其他解决方案,但我立即想到的解决方案涉及以非标准方式更改服务器的行为,例如允许普通用户查询会员列表,这通常只有管理员才能做到。

    【讨论】:

    • 谢谢凯夫。实施定制解决方案还有其他问题。消息存档很好,但通知呢?离线用户将永远不会收到来自服务器的任何消息,除非他们实际打开应用程序。进一步考虑,我是否可以简单地使用 PubSub 作为我的模型而不是传统的 MUC?
    • 你可以在 pubsub 之上重建 MUC,是的,虽然那是一堆工作。您还可以使会话保持活动状态并从服务器获取通知。不幸的是,目前还没有标准化,但在今年 2 月的 XMPP 峰会上,对实现这一点的机制进行了大量讨论,并且正在制定规范。
    • 好的。鉴于我们手头没有太多时间,所以这不在窗口中。但是根据实际的建议——如何让 xmpp 会话在 iOS 中无限期地保持活动状态?我知道人们的回答与此类似,但我不确定我是否理解正确。
    • @Kev XEP 的当前状态是否可用?它叫什么名字?
    【解决方案3】:

    Whatsapp 模型比您想象的要简单得多 - 即使用户断开连接,它们也只是保持用户会话在线,并在他“重新连接”会话时重新发送消息。 XEP-0198 引入了与传统 XMPP 会话类似的概念。您只需要配置更长的不活动时间(通常 XEP-0198 假设为 300 秒,但类似 ​​whatsapp 的信使会保持会话 24 小时以上)

    【讨论】:

    • 感谢vitalyster。 “Whatsapp 模型比你想象的要简单得多——即使用户断开连接,它们也只是保持用户会话在线,并在他“重新连接”会话时重新发送消息。”这是在服务器端吗?如果是这样,他们可能会用“可用”存在覆盖“不可用”存在。就 XEP-0198 而言,我不确定如何在 iOS 应用程序的上下文中实现它。
    • 例如,如果您基本上终止 iOS 应用程序 - 您的流将断开连接。
    • 如果您终止 iOS 应用程序 - 流将断开连接,但会话保持活动状态,它们只会忽略 TCP 断开连接,而不是存在。因为您仍然可以从状态菜单下线并离开群聊。使用 XEP-0198,您也可以得到相同的结果。
    • 我刚刚在网上乱了阵脚,现在已经阅读了流管理 XEP 0198,但我仍然不清楚 Whatsapp 是如何做到的,或者按照你的说法是如何做到的。如果流断开连接,如何在 iOS 上保持会话活动?比如说——一个简单的网络问题,或者如果用户手动终止了应用程序。你能解释一下我应该如何用简单的伪代码在客户端启用这个功能吗?这真的很有帮助。
    • 为了让会话“活跃” - 它是在 服务器 端完成的,而不是在客户端。
    【解决方案4】:

    是的,您可以通过以这种方式设置其配置来使您的组持久化:

    NSString *var = [field attributeStringValueForName:@"var"];
    if ([var isEqualToString:@"muc#roomconfig_persistentroom"])
    {
        [field removeChildAtIndex:0];
        [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];
    }
    

    【讨论】:

    • 可以分享演示吗?
    猜你喜欢
    • 2015-10-15
    • 2012-07-25
    • 2013-09-24
    • 2013-10-16
    • 2017-07-13
    • 2016-02-29
    • 1970-01-01
    • 2013-12-11
    • 2015-05-17
    相关资源
    最近更新 更多