Spent hours trying to solve this problem and I\'m stumped!
Trying to grab the Chat History between 2 users on my OpenFire server and I read that I plugin was needed
Please have a detailed Stanza detail at : https://stackoverflow.com/a/29097289/2225439
It is Platform independent just you need to understand the structure of Stanza and can be created as per the libraries that you are using.
This is the Series of Stanza that you will need to send to get Archived Messages. For more detail you can checkout 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>
To Fetch List of all Conversations
<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>
If you are looking for a chat history, I think you have to save the messages to core data and retrieve them from there. For saving data using the XMPPFramework inbuilt functionality, you have to use this code:
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()];
Now you have to retrieve that messages from core data by this:
-(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(@"***************************************************");
}
}
}
When you mention start tag in the request then it matches with the chat having the exact time stamp that's why it returns error code '404' or '500'. I ommited start tag from my request and wrote following code which returns whole chat history with the user.
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];
Here this will return whole chat history in XML response between user Rahul and the user currently logged in.
For more detailed info please refer this blog http://question.ikende.com/question/363439343236313430
XMPPFramework implements XEP-0136. Have you tried using XMPPMessageArchiving to set preferences or synchronize the server's archive to the client?