我正在使用XMPPFramework
开发聊天应用程序如何在加入现有房间后收到消息历史记录?
现在我加入这样的房间:
XMPPJID *roomJid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@conference.%@",systemName,xmppServer]];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:[XMPPRoomHybridStorage sharedInstance] jid:roomJid];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppRoom activate:xmppStream];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
[history addAttributeWithName:@"maxstanzas" stringValue:@"100"];
[xmppRoom joinRoomUsingNickname:user.deviceUUID history:history];
我也阅读documentation
的例子根据这个例子,我也尝试以这种方式加入会议室:
XMPPJID *roomJid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@conference.%@",systemName,xmppServer]];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:[XMPPRoomHybridStorage sharedInstance] jid:roomJid];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppRoom activate:xmppStream];
NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
[presence addAttributeWithName:@"from" stringValue:[NSString stringWithFormat:@"bob@%@",xmppServer]];
[presence addAttributeWithName:@"to" stringValue:[NSString stringWithFormat:@"%@@conference.%@/%@",systemName,xmppServer,user.deviceUUID]];
NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"http://jabber.org/protocol/muc"];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
[history addAttributeWithName:@"maxstanzas" stringValue:@"100"];
[x addChild:history];
[presence addChild:x];
[xmppRoom joinRoomUsingNickname:user.deviceUUID history:presence];
我成功加入了房间,但没有收到以前消息的历史记录。
顺便说一下,如果房间里至少有一个用户,我会收到所有之前的消息,即使我加入了这样的房间:
[xmppRoom joinRoomUsingNickname:user.deviceUUID history:nil];
如果所有用户都离开了房间,然后再加入一些人 - 历史记录为空=(
我做错了什么? 我是否需要打开服务器端的某些设置以保存历史记录(例如,记录)?
关于文档示例的一些问题:
"来自"参数?这是否意味着我只是从用户bob询问这个房间的消息历史?如果我想收到所有历史记录(来自任何用户的消息)该怎么办?
什么意思" id"参数?我在文档中找不到任何描述。
答案 0 :(得分:3)
当你创建了一个房间并且你已经加入时,你需要配置那个空间以使持久,这意味着:
持续房间 如果最后一个乘客离开,房间不会被破坏;反义词:临时房间。 (你想要这个房间的配置)。
临时房间 如果最后一个乘客离开,房间将被毁坏;反义词:持久性房间。
1。因此,您创建并加入了一个房间。
XMPPJID *roomJid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@conference.%@",systemName,xmppServer]];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:[XMPPRoomHybridStorage sharedInstance] jid:roomJid];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppRoom activate:xmppStream];
[xmppRoom joinRoomUsingNickname:user.deviceUUID history:history];
2. 然后,调用委托方法xmppRoomDidJoin:sender;
(仅当所有方法都正确时),并且您必须配置您的房间
-(void)xmppRoomDidJoin:(XMPPRoom *)sender {
NSLog("I did join.");
[sender fetchConfigurationForm];
}
fetchConfigurationForm
方法发送IQ以请求初始房间配置表单。
已发送到XMPP服务器的IQ示例:
<iq from='crone1@shakespeare.lit/desktop'
id='create1'
to='coven@chat.shakespeare.lit'
type='get'>
<query xmlns='http://jabber.org/protocol/muc#owner'/>
</iq>
3. 当XMPP服务器使用房间配置回答-xmppRoom:sender didFetchConfigurationForm:configForm;
时
方法被调用。 在这里您可以更改房间的默认值以设置持久性,房间名称,仅限会员等。
示例:
-(void)xmppRoom:(XMPPRoom *)sender didFetchConfigurationForm:(NSXMLElement *)configForm {
NSXMLElement *newConfig = [configForm copy];
NSArray *fields = [newConfig elementsForName:@"field"];
for (NSXMLElement *field in fields) {
NSString *var = [field attributeStringValueForName:@"var"];
// Make Room Persistent
if ([var isEqualToString:@"muc#roomconfig_persistentroom"]) {
[field removeChildAtIndex:0];
[field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];
}
}
[sender configureRoomUsingOptions:newConfig];
}
答案 1 :(得分:1)
感谢@Moral的解释。 但就我而言,解决方案非常简单。
在ejabberd.yml
的聊天服务器中,只添加了模块muc配置中的默认选项:
mod_muc: ## host: "conference.HOST"
db_type: odbc
access: muc
access_create: muc_create
access_persistent: muc_create
access_admin: muc_admin
min_message_interval: 1.0
min_presence_interval: 5.0
default_room_options:
logging: true
persistent: true
以这种方式在app加入会议室:
XMPPJID *roomJid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@conference.%@",systemName,xmppServer]];
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:[XMPPRoomHybridStorage sharedInstance] jid:roomJid];
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()];
[xmppRoom activate:xmppStream];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
[history addAttributeWithName:@"maxstanzas" stringValue:@"100"];
[xmppRoom joinRoomUsingNickname:user.deviceUUID history:history];
多数民众赞成!