XMPPFramework - получение архивных сообщений с сервера Openfire
Я разрабатываю приложение для чата для iPhone, используя сервер XMPP и OpenFire, сервер OpenFire сохраняет историю чатов между пользователями, но когда я пытаюсь получить историю чата для конкретного пользователя, я получаю только дату и количество чатов сообщения, но не фактические текстовые сообщения
Я уже установил плагин с открытым архивом для архивирования сообщений на openfire
Это строфа, которую я передал серверу Openfire
<iq type='get' id='pk1'>
<list xmlns='urn:xmpp:archive'
with='[email protected]'>
<set xmlns='http://jabber.org/protocol/rsm'>
<max>30</max>
</set>
</list>
</iq>
Это результат, который я получил с сервера
<iq type="result" id="pk1" to="[email protected]/iphone">
<list xmlns="urn:xmpp:archive">
<chat with="[email protected]" start="2012-07-04T13:16:12.291Z"/>
<chat with="[email protected]" start="2012-07-05T08:25:31.555Z"/>
<chat with="[email protected]" start="2012-07-05T12:38:24.098Z"/>
<set xmlns="http://jabber.org/protocol/rsm">
<first index="0">15</first>
<last>25</last>
<count>3</count>
</set>
</list>
</iq>
Это результат, который я хочу и которого я ожидал
<iq type='result' to='[email protected]/iphone' id='page1'>
<chat xmlns='urn:xmpp:archive'
with='[email protected]'
start='2012-07-04T13:16:12.291Z'
subject='She speaks!'
version='4'>
<from secs='0'><body>Art thou not Romeo, and a Montague?</body></from>
<to secs='11'><body>Neither, fair saint, if either thee dislike.</body></to>
.
[98 more messages]
.
<from secs='9'><body>How cam'st thou hither, tell me, and wherefore?</body></from>
<set xmlns='http://jabber.org/protocol/rsm'>
<first index='0'>0</first>
<last>99</last>
<count>217</count>
</set>
Пожалуйста, помогите мне получить желаемый результат
Спасибо
Ответы
Ответ 1
Вы должны сделать запрос с <retrieve>
(см. http://xmpp.org/extensions/xep-0136.html), тогда вы можете принять определенное время от полученного <list>
результат. Например:
Отправить:
<iq type='get' id='pk1'>
<list xmlns='urn:xmpp:archive'
with='[email protected]'>
<set xmlns='http://jabber.org/protocol/rsm'>
<max>30</max>
</set>
</list>
</iq>
Получать:
<iq type="result" id="pk1" to="[email protected]/iphone">
<list xmlns="urn:xmpp:archive">
<chat with="[email protected]" start="2012-07-04T13:16:12.291Z"/>
<chat with="[email protected]" start="2012-07-05T08:25:31.555Z"/>
<chat with="[email protected]" start="2012-07-05T12:38:24.098Z"/>
<set xmlns="http://jabber.org/protocol/rsm">
<first index="0">15</first>
<last>25</last>
<count>3</count>
</set>
</list>
</iq>
Теперь вы выбираете один из start
и отправляете (дата и час должны быть точными):
<iq type='get' id='pk1'>
<retrieve xmlns='urn:xmpp:archive'
with='[email protected]''
start='2012-07-04T13:16:12.291Z'>
<set xmlns='http://jabber.org/protocol/rsm'>
<max>100</max>
</set>
</retrieve>
</iq>
Вы получите что-то вроде этого (зависит от максимального значения → max = 30, органов = 30):
<iq type='result' to='[email protected]/iphone' id='page1'>
<chat xmlns='urn:xmpp:archive'
with='[email protected]'
start='2012-07-04T13:16:12.291Z'
subject='She speaks!'
version='4'>
<from secs='0'><body>Art thou not Romeo, and a Montague?</body></from>
<to secs='11'><body>Neither, fair saint, if either thee dislike.</body></to>
.
[28 more messages]
.
<from secs='9'><body>How cam'st thou hither, tell me, and therefore? </body>
</from>
<set xmlns='http://jabber.org/protocol/rsm'>
<first index='0'>0</first>
<last>29</last>
<count></count>
</set>
<iq>
Ответ 2
Чтобы получить определенное время чата
Отправьте его, чтобы получить время:
NSXMLElement *iq1 = [NSXMLElement elementWithName:@"iq"];
[iq1 addAttributeWithName:@"type" stringValue:@"get"];
[iq1 addAttributeWithName:@"id" stringValue:@"pk1"];
NSXMLElement *retrieve = [NSXMLElement elementWithName:@"list" xmlns:@"urn:xmpp:archive"];
[retrieve addAttributeWithName:@"with" stringValue:@"[email protected]"];
NSXMLElement *set = [NSXMLElement elementWithName:@"set" xmlns:@"http://jabber.org/protocol/rsm"];
NSXMLElement *max = [NSXMLElement elementWithName:@"max" stringValue:@"100"];
[iq1 addChild:retrieve];
[retrieve addChild:set];
[set addChild:max];
[xmppStream sendElement:iq1];
Чтобы получить историю чата
Используйте дату начала и отправьте:
NSXMLElement *iq1 = [NSXMLElement elementWithName:@"iq"];
[iq1 addAttributeWithName:@"type" stringValue:@"get"];
[iq1 addAttributeWithName:@"id" stringValue:@"pk1"];
NSXMLElement *retrieve = [NSXMLElement elementWithName:@"retrieve" xmlns:@"urn:xmpp:archive"];
[retrieve addAttributeWithName:@"with" stringValue:@"[email protected]"];
[retrieve addAttributeWithName:@"start" stringValue:@"2013-11-18T05:11:53.460Z"];
NSXMLElement *set = [NSXMLElement elementWithName:@"set" xmlns:@"http://jabber.org/protocol/rsm"];
NSXMLElement *max = [NSXMLElement elementWithName:@"max" stringValue:@"100"];
[iq1 addChild:retrieve];
[retrieve addChild:set];
[set addChild:max];
[xmppStream sendElement:iq1];
Ответ 3
Во-первых, для извлечения истории чата из openfire вам нужно установить плагин Open Archive, потому что Monitering Plugin предназначен для мониторинга и регистрации истории чатов на панели администратора, поэтому, как только вы установите Open Archive, вы не получите никакой ошибки с кодом "500",
Вы можете загрузить и узнать, как установить Open Archive со следующих ссылок.
https://nexus.reucon.com/content/repositories/opensource-snapshots/com/reucon/openfire/plugins/archive/
https://maven.reucon.com/projects/public/archive/
Другая проблема в приведенном выше коде заключается в том, что когда вы указываете начальный тег в запросе, он совпадает с чатом с точной меткой времени, почему он возвращает код ошибки "404". Я пропустил начальный тег из моего запроса и написал следующий код, который возвращает всю историю чата с пользователем.
NSXMLElement *iq1 = [NSXMLElement elementWithName:@"iq"];
[iq1 addAttributeWithName:@"type" stringValue:@"get"];
[iq1 addAttributeWithName:@"id" stringValue:@"pk1"];
NSXMLElement *retrieve = [NSXMLElement elementWithName:@"retrieve" xmlns:@"urn:xmpp:archive"];
[retrieve addAttributeWithName:@"with" stringValue:@"[email protected]"];
NSXMLElement *set = [NSXMLElement elementWithName:@"set" xmlns:@"http://jabber.org/protocol/rsm"];
NSXMLElement *max = [NSXMLElement elementWithName:@"max" stringValue:@"100"];
[iq1 addChild:retrieve];
[retrieve addChild:set];
[set addChild:max];
[[[self appDelegate] xmppStream] sendElement:iq1];
Здесь это вернет всю историю чата в ответе XML между пользователем Rahul и пользователем, который в настоящий момент вошел в систему.
Для получения более подробной информации см. этот блог http://question.ikende.com/question/363439343236313430
Ответ 4
Быстрая версия извлечения архивных сообщений с сервера openfire
Запрос:
func getArchieveMessages(){
let iQ = DDXMLElement.elementWithName("iq")
iQ.addAttributeWithName("type", stringValue: "get")
iQ.addAttributeWithName("id", stringValue: "page1")
let list = DDXMLElement.elementWithName("retrieve")
list.addAttributeWithName("xmlns", stringValue: "urn:xmpp:archive")
list.addAttributeWithName("with", stringValue: "[email protected]")
let set = DDXMLElement.elementWithName("set")
set.addAttributeWithName("xmlns", stringValue: "http://jabber.org/protocol/rsm")
let max = DDXMLElement.elementWithName("max")
max.addAttributeWithName("xmlns", stringValue: "http://jabber.org/protocol/rsm")
//(max as! DDXMLElement).setStringValue("30")
(set as! DDXMLElement).addChild(max as! DDXMLNode)
list.addChild(set as! DDXMLNode)
iQ.addChild(list as! DDXMLNode)
xmppStream.sendElement(iQ as! DDXMLElement)
}
Ответ:
func xmppStream(sender: XMPPStream!, didReceiveIQ iq: XMPPIQ!) -> Bool {
let chat = iq.elementForName("chat")
let chats = (chat as DDXMLElement).children()
for chat in chats{
let msg = chat
let body = (msg as! DDXMLElement).elementForName("body")
if body != nil{
if body.stringValue() != nil{
//print(body.stringValue()!)
chatMessages.append(body.stringValue()!)
if msg.attributeForName("jid") == nil{
type.append("Send")
}
else{
type.append("Receive")
}
}
}
}
print("Did receive IQ")
return false
}
* with - это смещение человека, чьи архивные сообщения вы хотите получить