如何检查收到的消息是在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发送一个值,未发送收到, 交付 。
希望能帮助到你!!