XMPPFramework – 从Openfire服务器中检索已存档的消息

我正在开发一个使用XMPP和openfire服务器的iPhone聊天应用程序,OpenFire服务器存储用户之间的所有聊天logging,但是当我尝试检索特定用户的聊天logging时,我只获取聊天消息的date和数量,实际的文字信息

我已经在openfire上安装了用于消息归档的开放归档插件

这是我已经传递给Openfire服务器的节

<iq type='get' id='pk1'> <list xmlns='urn:xmpp:archive' with='piyush@openfire'> <set xmlns='http://jabber.org/protocol/rsm'> <max>30</max> </set> </list> </iq> 

这是我从服务器收到的结果

  <iq type="result" id="pk1" to="vivek@openfire/iphone"> <list xmlns="urn:xmpp:archive"> <chat with="piyush@openfire" start="2012-07-04T13:16:12.291Z"/> <chat with="piyush@openfire" start="2012-07-05T08:25:31.555Z"/> <chat with="piyush@openfire" 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='vivek@openfire/iphone' id='page1'> <chat xmlns='urn:xmpp:archive' with='piyush@openfire' 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> 

请帮我拿到理想的结果

谢谢

您必须使用<retrieve>执行请求(请参阅http://xmpp.org/extensions/xep-0136.html ),然后您可以从收到的<list>结果中获取特定的时间。 例如:

发送:

  <iq type='get' id='pk1'> <list xmlns='urn:xmpp:archive' with='piyush@openfire'> <set xmlns='http://jabber.org/protocol/rsm'> <max>30</max> </set> </list> </iq> 

接收:

  <iq type="result" id="pk1" to="vivek@openfire/iphone"> <list xmlns="urn:xmpp:archive"> <chat with="piyush@openfire" start="2012-07-04T13:16:12.291Z"/> <chat with="piyush@openfire" start="2012-07-05T08:25:31.555Z"/> <chat with="piyush@openfire" 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> 

现在你select一个start和发送(date和小时必须严格):

  <iq type='get' id='pk1'> <retrieve xmlns='urn:xmpp:archive' with='piyush@openfire'' start='2012-07-04T13:16:12.291Z'> <set xmlns='http://jabber.org/protocol/rsm'> <max>100</max> </set> </retrieve> </iq> 

你会收到这样的东西(取决于最大值 – >最大= 30,身体= 30):

  <iq type='result' to='vivek@openfire/iphone' id='page1'> <chat xmlns='urn:xmpp:archive' with='piyush@openfire' 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> 

检索聊天的具体时间

发送它以获得时间:

  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:@"amit@openfire"]; 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]; 

检索聊天logging

使用开始date并发送:

  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:@"amit@openfire"]; [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]; 

首先,要从openfire检索聊天logging,您需要安装Open Archive插件,因为Monitering Plugin只是用于监视和logging聊天logging在pipe理面板上,所以一旦您安装了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”。 我从我的请求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

从openfire服务器获取归档消息的Swift版本请求:

 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: "partner@domain") 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是您想要提取存档消息的人的jid