使用XMPPFramework为ios存储消息?

use*_*719 28 iphone storage core-data ios xmppframework

我不确定如何使用XMPPFramework的核心数据来存储传入的消息.有没有人有关于如何做到这一点的任何教程?我看到了User对象,而这些对象又可以拥有许多"资源".收到的每条消息都应该是我创建和保留的新资源吗?

我不知道我的责任是什么部分以及框架提供的有关消息历史的部分.我可以拦截每一个传入的消息.那么我应该使用核心数据在Messages表中创建和存储每条消息吗?我有一个消息实体.每个XMPPUser都有一个Message对象数组.但是,那么我不会推出自己的解决方案,这会对框架起作用吗?

谢谢!

Sim*_*mon 51

我知道这是一个旧线程,但由于我目前正在使用iOS上的XMPP,我必须说有一个内置支持在XMPP中归档消息.

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

xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
Run Code Online (Sandbox Code Playgroud)

以下一行代码可以避免您将存档特定节发送到xmpp服务器,这很可能会响应服务未实现

[xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES];

[xmppMessageArchivingModule activate:xmppStream];
[xmppMessageArchivingModule  addDelegate:self delegateQueue:dispatch_get_main_queue()];
Run Code Online (Sandbox Code Playgroud)

你就定了.从那一刻开始,消息(传出和传入)将存储在框架创建的表中.

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

@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]);
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)

  • 这是一段很棒的代码.我在下面张贴了一个片段,直接加载到表格视图中. (2认同)
  • @Smita刚刚完成.转到XMPPMessageArchiving_Message_CoreDataObject并选择要筛选结果的变量.在我的情况下,因为我有多个连接,消息的"to"字段对于我收到的每条消息都是不同的,所以我添加了一个"to"属性.基于此我添加:NSString*predicateFrmt = @"to ==%@"; NSPredicate*predicate = [NSPredicate predicateWithFormat:predicateFrmt,@"aBareJid"]; request.predicate =谓词; 希望能帮助到你. (2认同)

dee*_*ter 10

指示XMPP Framework未保存历史记录的响应不正确.

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

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];
Run Code Online (Sandbox Code Playgroud)


Ven*_*kat -4

XMPPFramework不存储消息历史记录,所以我建议你最好使用核心数据。以发送者、接收者、消息、时间为列创建一个表。在发送消息方法调用和接收消息方法调用时插入记录...

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

    }

}
Run Code Online (Sandbox Code Playgroud)

当从表视图中选择特定用户时检索聊天历史记录...以下方法显示如何检索聊天历史记录...并从 didSelectRowAtIndexPath 方法调用此方法并将目标 id 作为参数传递

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


}
Run Code Online (Sandbox Code Playgroud)

我希望这对你有用