如何检查收到的消息是在ios的xmpp框架中读取还是未读取

我正在使用xmppframework开发聊天应用程序,我已成功完成发送和接收消息,但是

1)如果我正在与用户A聊天而用户B向我发送消息,我该如何识别用户B发送给我的消息。 (我已经在核心数据中维护消息,因此将保存消息)2)如何识别接收到的消息是读取还是未读取

注意:用于保存消息

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

谢谢

你可以看看XEP-0184

这应该是消息节格式

  your message    

这是收到的回复消息

    

这里messageId-1010将是唯一的,以告诉您它是什么消息响应。

对于面临同样问题的用户。

如果您想获取已读回执,而不是发送自动邮件传递收据,请在用户阅读该邮件时发送。 每条消息都有相应的message_id。 使用该message_id发送已读取的特定邮件的送达回执。 在建立连接时添加以下行

  //message delivery XMPPMessageDeliveryReceipts* xmppMessageDeliveryRecipts = [[XMPPMessageDeliveryReceipts alloc] initWithDispatchQueue:dispatch_get_main_queue()]; //don't write this line as it will send auto receipts whenever message will be delivered, but we want to send delivery receipts when user has read the message. //xmppMessageDeliveryRecipts.autoSendMessageDeliveryReceipts = YES; xmppMessageDeliveryRecipts.autoSendMessageDeliveryRequests = YES; [xmppMessageDeliveryRecipts activate:self.xmppStream]; 

我在我的消息实体中使用了’chatStatus’属性。 对于发件人,我将chatStatus的值保持为已发送,未发送或已接收(由其他方接收或未接收)。 对于接收方,我将值保持为已读或未读(我是否已阅读消息,因此对于未读消息,我可以发送已读消息)。

点击发送按钮:

 //Save to your Message Entity NSMutableDictionary *m = [[NSMutableDictionary alloc] init]; [m setObject: message_body forKey:@"message_body"]; [m setObject:messageID forKey:@"message_id"]; [m setObject:@"yes" forKey:@"isOutgoing"]; [m setObject:dateString forKey:@"date"]; [m setObject:timeString forKey:@"time"]; [m setObject:[NSDate date] forKey:@"timeStamp"]; [m setObject:yourId forKey:@"from"]; [m setObject:toId forKey:@"to"]; if (!Is_InternetAvailable]) { [m setObject:unsent forKey:@"chatStatus"]; } else{ [m setObject:sent forKey:@"chatStatus"]; } [[CoreDataMethods sharedCoreDataMethods] saveUserMessage:m]; } 

在cellForRowAtIndexPath中:

 if ([message isoutGoing]) {//If I have sent the message // Mine bubble if ([[messageDict valueForKey:@"chatStatus"] isEqualToString:unsent]) { //set unsent image } else if ([[messageDict valueForKey:@"chatStatus"] isEqualToString:sent]){ //set sent image } else if ([[messageDict valueForKey:@"chatStatus"] isEqualToString:received]){ //set Received Image } } else{ // Other Bubble , Notify them that you have read the message if it is unread/new message if ([[messageDict valueForKey:@"chatStatus"] isEqualToString:unread]) { //send read receipt NSXMLElement *receivedelement = [NSXMLElement elementWithName:@"received" xmlns:@"urn:xmpp:receipts"]; NSXMLElement *message = [NSXMLElement elementWithName:@"message" xmlns:@"jabber:client"]; [message addAttributeWithName:@"to" stringValue:toId]; [message addAttributeWithName:@"from" stringValue:fromID]; [receivedelement addAttributeWithName:@"id" stringValue:[messageDict valueForKey:@"message_id"]]; [message addChild:receivedelement]; //XMPPMessage *generatedReceiptResponse = [[messageDict valueForKey:@"xmppMessage"] generateReceiptResponse]; [[[kAppDelegate xmppHandler] xmppStream] sendElement:message]; // update message entity [self updateChatStatus:read withMessageID:[messageDict valueForKey:@"message_id"]]; } } 

最后,当您在didReceiveMessage中收到交货收据时,请将chatStatus更新为已收到

 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{ if ([message hasReceiptResponse]) {//message read //Update database message entity [self updateChatStatus:@"received" withMessageID:[message receiptResponseID]]; } } 

您可以根据您的要求设置chatStatus的值。 对于未发送的消息,我将其设置为在didSendMessage委托中发送。

注意:在我的应用程序中,我必须只显示读取,发送和取消设置状态,而不是交付状态。 如果您还想显示发送状态,则不要评论autoSendMessageDeliveryReceipts,每当读取消息时,将IQ节发送给发件人而不是发送收据,并相应地更改chatStatus。在发送方,您必须为chatStatus发送一个值,未发送收到, 交付

希望能帮助到你!!