2015-02-08 5 views
1

Я разрабатываю приложение чата с использованием XMPPFrameworkIOS 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:@"[email protected]%@",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]; 

Я успешно присоединяюсь к комнате, но не получаю историю предыдущих сообщений.

Btw, если хотя бы один пользователь в комнате, я получаю все предыдущие сообщения, даже если я присоединиться к комнате, как:

[xmppRoom joinRoomUsingNickname:user.deviceUUID history:nil]; 

Если все пользователи оставляют места, а затем некоторые присоединиться еще раз - история пусто = (

Что я делаю неправильно? мне нужно, чтобы включить некоторые настройки на стороне сервера, чтобы сохранить историю делать (например, регистрация)?

И некоторые вопросы о примере из документации:

Что означает параметр «от»? Означает ли это, что я прошу историю сообщений в этой комнате только от пользователя bob? И что, если я хочу получать всю историю (сообщения от любых пользователей)?

Что означает параметр «id»? Я не нашел описания в документации.

ответ

3

Когда вы создали комнату, и вы присоединились, вам необходимо настроить эту комнату, чтобы сделать упорную, что это означает, что:

Persistent Комната Комната, которая не является уничтожается, если последний пассажир выходит; antonym: Временный номер. (Вам нужна конфигурация этой комнаты).

Временный номер Комната, которая разрушается, если последний пассажир выходит; Антоним: Постоянная комната.

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, чтобы запросить начальная форма конфигурации помещения.

Пример IQ, который был отправлен в XMPP Сервер:

<iq from='[email protected]/desktop' 
    id='create1' 
    to='[email protected]' 
    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]; 
} 
+0

Спасибо за ответ, я попробую его сегодня – stsmkrv

+0

Дайте мне знать, это работает для меня! – Moral

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 

А в приложении присоединиться к комнате так:

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

Thats это!

Смежные вопросы