13

来自规范——</p>

7.14 退出房间

为了退出多用户聊天室,占用者向其当前在房间中使用的 <room@service/nick> 发送类型为“不可用”的出席信息节。

示例 80. 住户离开房间

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

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

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

4

4 回答 4

9

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

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

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

于 2014-09-23T10:43:21.163 回答
5

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

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

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

于 2014-09-22T21:24:33.633 回答
5

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

于 2014-09-22T23:40:31.480 回答
1

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

NSString *var = [field attributeStringValueForName:@"var"];
if ([var isEqualToString:@"muc#roomconfig_persistentroom"])
{
    [field removeChildAtIndex:0];
    [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];
}
于 2014-09-25T09:40:25.157 回答