【问题标题】:How to get the Message read/unread report in xmpp frame work?如何在 xmpp 框架中获取消息已读/未读报告?
【发布时间】:2016-05-16 15:21:48
【问题描述】:

嗨,我正在开发聊天应用程序,所以我正在使用 xmpp 框架。聊天工作正常,但是如何像在 whatsapp、facebook 等中一样获得消息传递,我搜索了我发现这里的一些文档是我的代码到现在我已实施

在连接方法中

XMPPMessageDeliveryReceipts* xmppMessageDeliveryRecipts = [[XMPPMessageDeliveryReceipts alloc] initWithDispatchQueue:dispatch_get_main_queue()];
xmppMessageDeliveryRecipts.autoSendMessageDeliveryReceipts = YES;
xmppMessageDeliveryRecipts.autoSendMessageDeliveryRequests = YES;
[xmppMessageDeliveryRecipts activate:self.xmppStream];

在发送消息方法中添加了这一行

NSXMLElement *request = [NSXMLElement elementWithName:@"request"];
 [request addAttributeWithName:@"xmlns" stringValue:@"urn:xmpp:receipts"];
 [message addChild:request];
[message addChild:body];

但这适用于是否已发送的消息我们如何检查已发送的消息是否已读我已经看到这些扩展 XEP-0184、XEP-0333 但我不知道如何实现已读/未读消息。请帮帮我

【问题讨论】:

    标签: ios xmpp chat xmppframework


    【解决方案1】:

    如果您想获取已读回执,而不是发送自动消息传递回执,而是在用户阅读该消息时发送它。每条消息都有其对应的 message_id。使用该 message_id 发送已阅读特定消息的送达回执。因此,请评论以下行

    //xmppMessageDeliveryRecipts.autoSendMessageDeliveryReceipts = YES;
    

    我通过在消息实体中添加“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 委托中发送。

    希望对你有帮助!!

    【讨论】:

    • 感谢重播可以请发件人告诉我你做了什么吗?您是否将每条消息都存储在具有检查状态的 coredata 中?以及您如何知道特定消息已被阅读/发送/传递?
    • 如果您正在发送消息,那么您就是发送者,并将 ChatStatus 设置为已发送、未发送或已接收(一旦您在 didReceiveMessage 委托中获得其他用户的已读回执,chatStatus 将更改为已接收)。是的,我使用 chatStatus 将每条消息存储在核心数据中并相应地更新它。 [[CoreDataMethods sharedCoreDataMethods] saveUserMessage:m] 用于在我的消息实体中保存数据。我已经制作了一个单例类,用于将数据保存到核心数据中,您可以将此行替换为代码以将数据保存到核心数据中。
    • 但我没有将我的消息保存在核心数据中我正在使用 sqlite 是它工作还是我需要维护核心数据
    • 不要混淆发送方和接收方。如果您是该消息的发送者,则将 chatStatus 值保持为已发送、未发送或已接收。如果您收到该消息,则将该值设置为已读或未读(如果您已阅读该消息,则为已读,如果您尚未阅读该消息,则为未读,因为您在其他屏幕上)。对于您的未读消息,将 readReceipt 发送给消息的发件人并将 ChatStatus 更改为已读。 ChatStatus 是“消息”表中的属性/字段。
    • 使用核心数据是一个好方法。但是 sqlite 也可以。无论是核心数据还是 sqlite,您只需在表中添加一个属性 chatStatus。
    猜你喜欢
    • 2013-12-30
    • 2017-01-06
    • 2011-12-09
    • 2015-08-06
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多