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

Также я читаю пример из документации

Согласно этому примеру я также попытался присоединиться к комнате следующим образом:

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 ответа

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

Постоянная комната Комната, которая не разрушается, если последний обитатель выходит; антоним: временная комната. (Вы хотите конфигурацию этой комнаты).

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

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='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];
}

Спасибо @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];

Это оно!

Другие вопросы по тегам