Storing messages using XMPPFramework for ios?
I know this is an old thread but as I am currently working with XMPP on iOS I must say that there is a built in support for archiving messages in XMPP.
I downloaded the XMPP framework for iOS and in it there is folder marked XEP-0136. Import the folders in XCode and activate client side archiving by using the following lines of code in the class you instantiate XMPP client:
xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
the following one line of code saves you from sending archive specific stanzas to the xmpp serverwhich will most probably respond with service-not-implemented
[xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES];[xmppMessageArchivingModule activate:xmppStream];[xmppMessageArchivingModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
And you are set. From that moment on, messages (outgoing and incoming) will be stored in a table created by the framework.
If you need more info please comment and i will get back to you.
@PraviJay
I did like this :
-(void)testMessageArchiving{ XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance]; NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject" inManagedObjectContext:moc]; NSFetchRequest *request = [[NSFetchRequest alloc]init]; [request setEntity:entityDescription]; NSError *error; NSArray *messages = [moc executeFetchRequest:request error:&error]; [self print:[[NSMutableArray alloc]initWithArray:messages]];}-(void)print:(NSMutableArray*)messages{ @autoreleasepool { for (XMPPMessageArchiving_Message_CoreDataObject *message in messages) { NSLog(@"messageStr param is %@",message.messageStr); NSXMLElement *element = [[NSXMLElement alloc] initWithXMLString:message.messageStr error:nil]; NSLog(@"to param is %@",[element attributeStringValueForName:@"to"]); NSLog(@"NSCore object id param is %@",message.objectID); 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]); } }}
Hope it helps :)
The responses that indicate XMPP Framework doesn't save the history are incorrect.
To integrate results in a table view use:
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Contact_CoreDataObject" inManagedObjectContext:moc];NSFetchRequest *request = [[NSFetchRequest alloc]init];[request setEntity:entityDescription];_contactsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:nil cacheName:@"MessagesContactListCache"];NSError *error;BOOL rval = [_contactsController performFetch:&error];
an example to get archived messages in Swift 4
declares and initializes the variables XMPPMessageArchivingCoreDataStorage where I initialize the XMPPStream
var xmppMessageStorage: XMPPMessageArchivingCoreDataStorage? var xmppMessageArchiving: XMPPMessageArchiving? xmppMessageStorage = XMPPMessageArchivingCoreDataStorage.sharedInstance() xmppMessageArchiving = XMPPMessageArchiving(messageArchivingStorage: xmppMessageStorage) xmppMessageArchiving?.clientSideMessageArchivingOnly = true xmppMessageArchiving?.activate(stream) xmppMessageArchiving?.addDelegate(self, delegateQueue: DispatchQueue.main)
doing this, whenever a message arrives, this will cause it to be archived without needing to do anything else.
then, to retrieve the archived message
func RecibedMessageArchiving(idFriend: String) { let JabberIDFriend = idFriend //id friend chat, example test1@example.com let moc = xmppMessageStorage?.mainThreadManagedObjectContext let entityDescription = NSEntityDescription.entity(forEntityName: "XMPPMessageArchiving_Message_CoreDataObject", in: moc!) let request = NSFetchRequest<NSFetchRequestResult>() let predicateFormat = "bareJidStr like %@ " let predicate = NSPredicate(format: predicateFormat, JabberIDFriend) request.predicate = predicate request.entity = entityDescription //jabberID id del usuario, cliente var jabberIDCliente = "" if let jabberj = globalChat.value(forKey: "jabberID"){ jabberIDCliente = jabberj as! String } do { let results = try moc?.fetch(request) for message: XMPPMessageArchiving_Message_CoreDataObject? in results as? [XMPPMessageArchiving_Message_CoreDataObject?] ?? [] { var element: DDXMLElement! do { element = try DDXMLElement(xmlString: (message as AnyObject).messageStr) } catch _ { element = nil } let body: String let sender: String let date: NSDate let isIncomings: Bool if message?.body != nil { body = (message?.body)! } else { body = "" } if element.attributeStringValue(forName: "to") == JabberIDFriend { sender = jabberIDCliente isIncomings = false } else { sender = "test2@example.com" isIncomings = true } var m: [AnyHashable : Any] = [:] m["msg"] = message?.body print("body", message?.body) print("test", element.attributeStringValue(forName: "to")) print("test2", element.attributeStringValue(forName: "body")) } } catch _ { //catch fetch error here } }