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];
Это оно!