XMPPFramework – 检索Openfire邮件存档
花了几个小时试图解决这个问题,我很难过!
试图抓住我的OpenFire服务器上2个用户之间的聊天logging,我读了我需要做的插件。
所以,我在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项目可以成功地发送/接收消息给用户我试图接收聊天logging,所以我真的不知道我在做什么错。 此外,插件使我可以通过聊天消息(通过OpenFirepipe理)search成功的结果,所以它似乎是工作和存储的消息。
任何帮助,将不胜感激。 谢谢!
如果您正在查找聊天logging,我认为您必须将邮件保存到核心数据并从那里检索。 为了使用XMPPFramework内置function保存数据,您必须使用以下代码:
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(@"***************************************************"); } } }
请有详细的Stanza详细信息: https : //stackoverflow.com/a/29097289/2225439
它是平台独立的,只需要了解Stanza的结构,就可以根据您使用的库进行创build。
这是您需要发送以获取存档消息的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”。 我从我的请求ommited开始标记并写下面的代码,返回与用户的整个聊天logging。
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和当前login用户之间的XML响应中的整个聊天logging。
欲了解更多详细信息,请参阅此博客http://question.ikende.com/question/363439343236313430
XMPPFramework实现XEP-0136。 您是否尝试过使用XMPPMessageArchiving设置首选项或将服务器的存档同步到客户端?