iOS:XMPP:群聊消息的消息归档

所有的一对一聊天都以消息types作为聊天发送。 因此,消息存档技术(如下所示)对我保存/检索聊天logging工作良好。

// Setup message archiving xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance]; xmppMessageArchiving = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage]; [xmppMessageArchiving setClientSideMessageArchivingOnly:YES]; // Activate xmpp modules [xmppMessageArchiving activate:xmppStream]; // Add delegate [xmppMessageArchiving addDelegate:self delegateQueue:dispatch_get_main_queue()]; 

但对于群聊,发送的消息types是“群聊”,这不会被XMPPMessageArchivingCoreDataStorage存档


有人可以指导我如何实现群聊消息的消息存档。

这是您需要发送以获取存档消息的Stanza系列。 欲了解更多详情,你可以结帐http://xmpp.org/extensions/xep-0136.html

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>Wow !! This is Archived Message</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> 

您可以轻松地从xmpp核心数据库获取存档消息。 使用下面的代码。

 XMPPMessageArchivingCoreDataStorage *_xmppMsgStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance]; NSManagedObjectContext *moc = [_xmppMsgStorage mainThreadManagedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject" inManagedObjectContext:moc]; NSFetchRequest *request = [[NSFetchRequest alloc]init]; [request setEntity:entityDescription]; //[request setFetchLimit:20]; NSError *error; NSString *predicateFrmt = @"bareJidStr == %@"; NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFrmt, [NSString stringWithFormat:@"%@%@",GroupName,GROUP_CHAT_DOMAIN]]; request.predicate = predicate; NSArray *messages = [moc executeFetchRequest:request error:&error];