【问题标题】:how to check received message is read or unread in xmpp framework in ios如何在ios的xmpp框架中检查收到的消息是已读还是未读
【发布时间】:2013-12-30 12:10:59
【问题描述】:

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

1) 如果我与用户 A 聊天并且用户 B 向我发送消息,我如何识别用户 B 向我发送消息。 (我已经在核心数据中维护了消息,因此将保存消息) 2) 我如何识别 received 消息是已读还是未读

注意:我使用了消息保存

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

谢谢

【问题讨论】:

    标签: ios iphone xmpp xmppframework


    【解决方案1】:

    你可以看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 将是唯一的,让您知道它是哪个消息响应。

    【讨论】:

    • 作为接收者的角色:我在在线用户列表中,有人向我发送消息,那么我如何确定是谁向我发送消息??
    • 在消息节中必须有from 属性。 from 属性值是发送者 JID
    • 我想你没有听懂我的意思.. 我问的是接收者和 XEP-0184 的所有关于发送者功能的问题
    • @MitsBhadeshiya 你的问题到底是什么。 XEP-0184 仅用于报告消息的传递状态。当您收到消息时,您肯定能够获得发件人 JID。同样,当收据响应将来到这里时,节数据包中也有 JID。如果您是接收者,则必须有您的 JID。
    • 我想在我的应用程序中分离出已读和未读消息。 (例如什么应用程序:-> 1 条新消息)任何人向我发送我正在存储的消息,但我如何确定该消息是否未读??
    【解决方案2】:

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

    如果您想获取已读回执,而不是发送自动消息传递回执,而是在用户阅读该消息时发送它。每条消息都有其对应的 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中收到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 节发送给发件人而不是交付收据并相应地更改聊天状态。在发件人方面,您必须为已发送的聊天状态取一个值,未发送,收到,已送达

    希望对你有帮助!!

    【讨论】:

    • 能否请您帮我解决如何检测邮件未读或已读?
    猜你喜欢
    • 2016-05-16
    • 2017-01-06
    • 2015-05-08
    • 1970-01-01
    • 2011-08-21
    • 2018-01-16
    • 2015-08-06
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多