检索Openfire消息存档
花了几小时试图解决这个问题,我很难过!
试图抓住我的OpenFire服务器上的两个用户之间的聊天记录,我读了我需要做的插件。
因此,我在OpenFire服务器上安装了“Open Archive”插件并发送以下XML(根据XMPP-0136协议文档):
<iq type="get" id="page1">
<retrieve xmlns="urn:xmpp:archive" with="username@server.com" start="1469-07-21T02:56:15Z">
<set xmlns="http://jabber.org/protocol/rsm">
<max>100</max>
</set>
</retrieve>
</iq>
在代码中,这是通过以下方式实现的:
NSXMLElement *iQ = [NSXMLElement elementWithName:@"iq"];
[iQ addAttributeWithName:@"type" stringValue:@"get"];
[iQ addAttributeWithName:@"id" stringValue:@"page1"];
NSXMLElement *retrieve = [NSXMLElement elementWithName:@"retrieve"];
[retrieve addAttributeWithName:@"xmlns" stringValue:@"urn:xmpp:archive"];
[retrieve addAttributeWithName:@"with" stringValue:@"username@server.com"];
[retrieve addAttributeWithName:@"start" stringValue:@"1469-07-21T02:56:15Z"];
NSXMLElement *set = [NSXMLElement elementWithName:@"set"];
[set addAttributeWithName:@"xmlns" stringValue:@"http://jabber.org/protocol/rsm"];
NSXMLElement *max = [NSXMLElement elementWithName:@"max"];
max.stringValue = @"100";
[set addChild:max];
[retrieve addChild:set];
[iQ addChild:retrieve];
[[[self appDelegate] xmppStream] sendElement:iQ];
其中返回以下错误:
<iq xmlns="jabber:client" type="error" id="page1" to="username@server.com">
<error code="404" type="cancel">
<item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
</error>
</iq>
我的Xcode项目可以成功地向用户发送/接收消息我试图接收聊天记录,所以我真的不知道我做错了什么。 此外,插件使我能够通过聊天消息(通过OpenFire管理员)搜索成功的结果,因此它似乎在工作并存储消息。
任何帮助,将不胜感激。 谢谢!
如果您正在查找聊天记录,我认为您必须将邮件保存到核心数据并从那里检索。 为了使用XMPPFramework内置功能保存数据,您必须使用以下代码:
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
[xmppMessageArchivingModule activate:xmppStream];
[xmppMessageArchivingModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
现在,您必须通过以下方式从核心数据中检索消息:
-(void)loadarchivemsg
{
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
inManagedObjectContext:moc];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
NSString *predicateFrmt = @"bareJidStr like %@ ";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFrmt, chatWithUser];
request.predicate = predicate;
NSLog(@"%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"kXMPPmyJID"]);
[request setEntity:entityDescription];
NSError *error;
NSArray *messages_arc = [moc executeFetchRequest:request error:&error];
[self print:[[NSMutableArray alloc]initWithArray:messages_arc]];
}
-(void)print:(NSMutableArray*)messages_arc{
@autoreleasepool {
for (XMPPMessageArchiving_Message_CoreDataObject *message in messages_arc) {
NSXMLElement *element = [[NSXMLElement alloc] initWithXMLString:message.messageStr error:nil];
NSLog(@"to param is %@",[element attributeStringValueForName:@"to"]);
NSMutableDictionary *m = [[NSMutableDictionary alloc] init];
[m setObject:message.body forKey:@"msg"];
if ([[element attributeStringValueForName:@"to"] isEqualToString:chatWithUser]) {
[m setObject:@"you" forKey:@"sender"];
}
else {
[m setObject:chatWithUser forKey:@"sender"];
}
[messages addObject:m];
NSLog(@"bareJid param is %@",message.bareJid);
NSLog(@"bareJidStr param is %@",message.bareJidStr);
NSLog(@"body param is %@",message.body);
NSLog(@"timestamp param is %@",message.timestamp);
NSLog(@"outgoing param is %d",[message.outgoing intValue]);
NSLog(@"***************************************************");
}
}
}
请在https://stackoverflow.com/a/29097289/2225439上提供详细的Stanza详细信息
它是平台独立的,只需要了解Stanza的结构,并且可以根据您使用的库进行创建。
这是您需要发送以获取存档消息的Stanza系列。 欲了解更多详情,可以结帐XEP 0136(http://xmpp.org/extensions/xep-0136.html#manual)
REQ
<iq type='get' id='mrug_sender@staging.openfire.com'>
<list xmlns='urn:xmpp:archive'
with='mrug_target_155@staging.openfire.com'>
<set xmlns='http://jabber.org/protocol/rsm'>
<max>6900</max>
</set>
</list>
</iq>
RES
<iq type="result" id="mrug_sender@staging.openfire.com" to="mrug_sender@staging.openfire.com/Psi">
<list xmlns="urn:xmpp:archive">
<chat with="mrug_target_155@staging.openfire.com" start="2014-06-07T06:52:26.041Z"/>
<chat with="mrug_target_155@staging.openfire.com" start="2014-06-07T07:06:53.372Z"/>
<set xmlns="http://jabber.org/protocol/rsm">
<first index="0">866</first>
<last>867</last>
<count>2</count>
</set>
</list>
</iq>
REQ
<iq type='get' id='mrug_sender@staging.openfire.com'>
<retrieve xmlns='urn:xmpp:archive' with='mrug_target_155@staging.openfire.com' start='2014-06-07T06:52:26.041Z'>
<set xmlns='http://jabber.org/protocol/rsm'>
<max>8000</max>
</set>
</retrieve>
</iq>
RES
<iq type="result" id="mrug_sender@staging.openfire.com" to="mrug_sender@staging.openfire.com/Psi">
<chat xmlns="urn:xmpp:archive" with="mrug_target_155@staging.openfire.com" start="2014-06-07T06:52:26.041Z">
<from secs="0" jid="mrug_target_155@staging.openfire.com">
<body>Hello This is Cool</body>
</from>
<set xmlns="http://jabber.org/protocol/rsm">
<first index="0">0</first>
<last>0</last>
<count>1</count>
</set>
</chat>
</iq>
获取所有对话的列表
<iq type='get' id='mrug_sender@staging.openfire.com'>
<list xmlns='urn:xmpp:archive'>
<set xmlns='http://jabber.org/protocol/rsm'>
<max>6900</max>
</set>
</list>
</iq>
当您在请求中提及开始标记时,它会与具有确切时间戳的聊天相匹配,这就是为什么它会返回错误代码“404”或“500”。 我从我的请求中删除了开始标记并编写了以下代码,它将返回与用户的整个聊天记录。
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:@"rahul@vishals-mac-pro.local"];
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];
在这里,这将返回用户Rahul和当前登录用户之间的XML响应中的整个聊天历史记录。
有关更详细的信息,请参阅此博客http://question.ikende.com/question/363439343236313430
链接地址: http://www.djcxy.com/p/94165.html