【问题标题】:How to determine the message status (read/unread) in chat?如何确定聊天中的消息状态(已读/未读)?
【发布时间】:2011-11-16 03:39:06
【问题描述】:

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

【问题讨论】:

  • 这件事你成功了吗?我很好奇自己该怎么做
  • 我也很好奇该怎么做...
  • 如果有人在这方面取得了成功,请分享一些信息@danipralea

标签: xcode xmpp chat message status


【解决方案1】:

XEP-0184: 消息传递回执支持在消息已传递时通知发件人。只要您不期望现有客户发送这些收据,您就可以将其用作构建块——XEP 目前尚未广泛实施。

【讨论】:

  • 我已经实现了这个功能并成功运行。我很困惑如何决定消息是传递还是阅读?因为没有任何规定来存储消息状态传递。你能建议我做什么吗?
  • 很难判断一条消息是否真的被阅读过。这是现有客户不实施 XEP 的主要原因之一。我想说能够判断消息是否已显示是您能做的最好的事情。如果客户端是顶部的应用程序,而带有消息的选项卡是正在显示的选项卡,并且在该状态下消息已在滚动窗口内,则可能已显示。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您想获取已读回执,而不是发送自动消息传递回执,而是在用户阅读该消息时发送它。每条消息都有其对应的 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
        //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中收到delivery Receipt时,将chatStatus更新为received

    - (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 节发送给发件人而不是投递收据并相应地更改聊天状态。

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

    希望对你有帮助!!

    【讨论】:

      【解决方案4】:

      Xmpp 没有已读/未读回执。虽然收到的是在 XEP-0184 中实现的东西。

      【讨论】:

        猜你喜欢
        • 2018-05-20
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多