首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何判断聊天消息的状态(已读/未读)?

如何判断聊天消息的状态(已读/未读)?
EN

Stack Overflow用户
提问于 2011-09-13 20:41:06
回答 4查看 8.7K关注 0票数 12

如何确定消息状态(已读/未读)。聊天是用XMPP协议实现的。

EN

回答 4

Stack Overflow用户

发布于 2011-09-14 07:22:03

XEP-0184:消息投递回执支持通知发件人消息已经投递完毕。只要您不期望现有客户机发送这些回执,您就可以将其用作构建块-- XEP目前还没有得到广泛实现。

票数 6
EN

Stack Overflow用户

发布于 2015-02-18 08:16:13

我认为您需要根据http://xmpp.org/extensions/xep-0333.html使用显示的聊天标记

票数 2
EN

Stack Overflow用户

发布于 2016-02-17 14:51:38

如果你想获得已读回执,那么不是发送自动消息传递回执,而是在用户阅读该消息时发送它。每条消息都有其对应的message_id。使用该message_id发送已读取的特定邮件的送达回执。在建立连接时添加以下代码

代码语言:javascript
代码运行次数:0
运行
复制
//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
    //xmppMessageDeliveryRecipts.autoSendMessageDeliveryReceipts = YES;
    xmppMessageDeliveryRecipts.autoSendMessageDeliveryRequests = YES;
    [xmppMessageDeliveryRecipts activate:self.xmppStream];

我通过在消息实体中添加'chatStatus‘属性解决了这个问题。对于发送者,我将chatStatus的值保留为已发送、未发送或已接收(由另一方接收或未接收)。对于接收方,我将值保持为已读或未读(我是否已读消息,以便对于未读消息,我可以发送已读回执)。

单击发送按钮时:

代码语言:javascript
代码运行次数:0
运行
复制
//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中:

代码语言:javascript
代码运行次数:0
运行
复制
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更新为received

代码语言:javascript
代码运行次数:0
运行
复制
- (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。

这只是一个基本的想法,你可以根据你的需要来使用它。

希望它能有所帮助!!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7402027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档