使用XMPPFramework为ios存储消息?

我不确定如何使用XMPPFramework的核心数据来存储传入的消息。 有没有人有任何教程如何做到这一点? 我看到用户对象,这反过来可以有很多“资源”。 是否收到每条消息应该是我创build并保留的新资源?

我不知道什么是我的责任,框架提供了什么关于消息历史的部分。 我可以拦截每个传入的消息。 那么我是否应该使用核心数据在消息表中创build和存储每条消息? 我有一个消息实体。 每个XMPPUser都有一个Message对象的数组。 但是,那么我不会在自己的解决scheme,这将违背框架?

谢谢!

我知道这是一个古老的线程,但是因为我目前正在iOS上使用XMPP,所以我必须说在XMPP中有内置的对归档消息的支持。

我下载了iOS的XMPP框架,并在其中有标记为XEP-0136的文件夹。 在XCode中导入文件夹,并通过在实例化XMPP客户端的类中使用以下代码行来激活客户端归档:

xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance]; xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage]; 

下面的一行代码可以节省您将归档特定节发送到xmpp服务器,而xmpp服务器很可能会响应服务未实现

 [xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES]; [xmppMessageArchivingModule activate:xmppStream]; [xmppMessageArchivingModule addDelegate:self delegateQueue:dispatch_get_main_queue()]; 

而你被设置。 从那一刻起,消息(即将到来的)将被存储在由框架创build的表格中。

如果您需要更多信息,请发表评论,我会尽快回复您。

@PraviJay

我这样做:

 -(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]); } } } 

希望能帮助到你 :)

指示XMPP框架的响应不保存历史logging是不正确的。

要将结果集成到表视图中,请使用:

 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]; 

XMPPFramework不存储消息历史,所以我build议你最好使用核心数据。创build一个表,通过将发送者,接收者,消息,时间作为列。插入logging当发送消息方法调用和接收消息方法调用…

 -(void)saveChatHistory:(NSString *)sender:(NSString*)receiver:(NSString*)message:(NSString*)time { NSManagedObjectContext *context=[[self appDelegate] managedObjectContext]; NSManagedObject *newContext=[NSEntityDescription insertNewObjectForEntityForName:@"ChatHistory" inManagedObjectContext:context]; [newContext setValue:sender forKey:@"sender"]; [newContext setValue:receiver forKey:@"receiver"]; [newContext setValue:message forKey:@"message"]; [newContext setValue:time forKey:@"time"]; NSError *error; if(![context save:&error]) { UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Error Occured" message:@"Data is not Stored in Database Try Again" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil]; [alertView show]; } } 

当从tableview中select特定的用户时,返回聊天logging….下面的方法显示如何检索聊天logging…并从didSelectRowAtIndexPath方法调用此方法,并将目标标识作为parameter passing

 -(void)getChatHistory:(NSString*)jidString1 { NSManagedObjectContext *context=[[self appDelegate] managedObjectContext]; NSEntityDescription *entity=[NSEntityDescription entityForName:@"ChatHistory" inManagedObjectContext:context]; NSFetchRequest *req=[[NSFetchRequest alloc] init]; NSPredicate *predicate=[NSPredicate predicateWithFormat:@"receiver=%@",jidString1]; [req setEntity:entity]; [req setPredicate:predicate]; NSManagedObject *matchRecords=nil; NSError *error; NSArray *objects=[context executeFetchRequest:req error:&error]; if([objects count]==0) { UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"No Record found" message:@"there is no previous chat history" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil]; [alertView show]; } else { for(int i=0;i<[objects count];i++) { matchRecords=[objects objectAtIndex:i ]; NSLog(@"sender is %@",[matchRecords valueForKey:@"sender"]); NSLog(@"reciver is %@",[matchRecords valueForKey:@"receiver"]); NSLog(@"messages is %@",[matchRecords valueForKey:@"message"]); NSLog(@"time is %@",[matchRecords valueForKey:@"time"]); } } } 

我希望这对你有用