iOS XMPPFramework - 房间/聊天消息历史记录

时间:2015-02-08 14:55:18

标签: ios xmpp xmppframework

我正在使用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"参数?我在文档中找不到任何描述。

2 个答案:

答案 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];

多数民众赞成!