来自规范 -
7.14退出房间
为了退出多用户聊天室,占用者发送存在 类型"不可用的节"到< room @ service / nick>它是 目前在房间里使用。
示例80.乘员退出房间
<presence
from='hag66@shakespeare.lit/pda'
to='coven@chat.shakespeare.lit/thirdwitch'
type='unavailable'/>
这意味着只要用户断开与XMPP服务器的连接,就会从服务器端的组中删除该用户。问题很简单 - 我不想要这种行为;我想要一个类似于Whatsapp所做的行为,即使用户离线,他仍然是MUC房间的一部分(配置为在服务器端持久)并且将接收来自其他占用者的消息。
鉴于适用于iOS的XEP-0045和XMPPFramework的规范和文档,我不知道如何完成此操作,或者是否可以在传统的ejabberd服务器中实现此目的。
答案 0 :(得分:9)
XEP-45是在10年前设计的。那时候,设计师们想到了类似IRC频道的东西。 XEP-45的所有内容都是基于用户在启动/终止其客户端时进入和离开房间的假设而设计的。
WhatsApp Groupchats是不同的:用户加入群聊是能够查看该聊天的(完整)历史记录。即使用户客户端离线/不可用,他仍然被认为是群聊的一部分。
XMPP社区目前正在开发提供此类功能的新XEP。它被称为 XEP-0369: Mediated Information eXchange 。它是XEP-0045的精神继承者,提供了人们对现代群聊的期望。
答案 1 :(得分:5)
你可以通过使用MUC的服务器端历史(消息档案管理,XEP-0313)来模拟这样的事情,这样当客户登录时他们能够在他们不知道的情况下请求MUC的历史记录。进去吧。
如果您还希望能够显示房间的离线伪占用者,最简单的方法是将每个房间的pubsub节点映射到存储客户端可以读取的这些伪占用者的列表补充通常的入住名单。
这里可能还有其他解决方案,但我想到的那些解决方案涉及以非标准方式改变服务器的行为,例如允许普通占用者查询成员列表,这通常只有管理员可以做。
答案 2 :(得分:5)
Whatsapp模型比您想象的要简单得多 - 即使用户断开连接,他们也只是在线维护用户会话,并在“重新连接”会话时重新发送消息。 XEP-0198引入了与传统XMPP会话类似的概念。您只需要配置更长的不活动时间段(通常XEP-0198假定为300秒,但类似Whatsapp的信使会话超过24小时)
答案 3 :(得分:1)
是的,您可以通过以下方式设置其配置来使您的群组持久:
NSString *var = [field attributeStringValueForName:@"var"];
if ([var isEqualToString:@"muc#roomconfig_persistentroom"])
{
[field removeChildAtIndex:0];
[field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];
}