【问题标题】:Storing messages using XMPPFramework for ios?使用 XMPPFramework for ios 存储消息?
【发布时间】:2012-01-24 00:44:09
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 如果你能用作品确认并帮助你,你应该接受一个答案。
  • 以下任何解决方案对您有用吗?

标签: iphone ios core-data storage xmppframework


【解决方案1】:

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

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

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

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

[xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES];

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

你已经准备好了。从那一刻起,消息(传出和传入)将存储在框架创建的表中。

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

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

希望对你有帮助:)

【讨论】:

  • 如何从 xmppMessageArchivingModule 获取消息历史记录
  • @PraviJay 如果您有任何问题,请告诉我,也许我也遇到过。
  • thanx 伙计,我刚刚被这行 NSArray *messages = [moc executeFetchRequest:request error:&error];但你做得很好,伙计……你是救命恩人,谢谢……
  • 这是一个很棒的代码片段。我在 sn-p 下面发布了直接加载到表格视图中。
  • @Smita 刚刚完成。转到 XMPPMessageArchiving_Message_CoreDataObject 并选择您想要过滤结果的变量。在我的情况下,因为我有多个连接,消息的“to”字段对于我收到的每条消息都是不同的,所以我添加了一个“to”属性。基于此,我添加了: NSString *predicateFrmt = @"to == %@"; NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFrmt, @"aBareJid"]; request.predicate = 谓词;希望对您有所帮助。
【解决方案2】:

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

【讨论】:

  • 你好,如何获取聊天记录..我把这段代码放在哪里?
【解决方案3】:

在 Swift 4 中获取存档消息的示例

声明并初始化变量 XMPPMessageArchivingCoreDataStorage 我在其中初始化 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)

这样做,每当消息到达时,这将导致它被归档而无需执行任何其他操作。

然后,检索归档的消息

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
        }

    }

【讨论】:

    【解决方案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];
    
        }
    
    }
    

    当特定用户从 tableview 中选择时检索聊天历史......休闲方法展示了如何检索聊天历史......并从 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"]);
           }
         }
    
    
    }
    

    希望对你有用

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2018-05-10
      • 2015-04-08
      • 1970-01-01
      • 2016-05-23
      • 2012-06-21
      • 1970-01-01
      • 2013-09-20
      相关资源
      最近更新 更多