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



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

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

注意:为了保存消息,我使用了

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

感谢

您可以查看XEP-0184

这应该是消息节格式

<message
    from='sender@domain/resource'
    id='messageId-1010'
    to='receiver@domain/resource'>
  <body>your message </body>
  <request xmlns='urn:xmpp:receipts'/>
</message>

这是收到的回复信息

<message
    from='receiver@domain/resource'
    id='packetId'
    to='sender@domain/resource'>
  <received xmlns='urn:xmpp:receipts' id='messageId-1010'/>
</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"属性。对于发件人,我将聊天状态的值保留为已发送、未发送或已接收(对方是否收到)。对于接收方,我将值保持为已读或未读(我是否已读消息,以便对于未读消息,我可以发送已读回执)。

点击发送按钮:

//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中收到交货收据时,将聊天状态更新为已接收

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

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

注意:在我的应用程序中,我只需要显示已读、已发送和未设置状态,而不是已发送状态。如果你还想显示发送状态,那么不要评论autoSendMessageDeliveryReceives,只要阅读了消息,就向发件人发送IQ节,而不是发送回执,并相应地更改聊天状态。在发送方,您必须为已发送、未发送、已接收、已发送的聊天状态取一个值。

希望它有帮助!!

最新更新