如何在xmpp框架中获取消息读/未读报告? [英] How to get the Message read/unread report in xmpp frame work?

查看:537
本文介绍了如何在xmpp框架中获取消息读/未读报告?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发聊天应用程序,所以我使用的是xmpp framework.Chatting工作正常,但是如何在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]; 
[请求addAttributeWithName:@xmlnsstringValue:@urn:xmpp:receipts];
[message addChild:request];
[message addChild:body];

但是这是用于发送的消息还是没有我们如何查看已发送的已发送消息这些扩展XEP-0184,XEP-0333但我不知道实现读/未读消息。请帮助我

解决方案

如果您想获取已读回执而不是发送自动留言递送收据,请在用户阅读时发送那条消息。每条消息都有相应的message_id。使用该message_id发送已读取的特定邮件的送达回执。因此,请注释以下行

  // xmppMessageDeliveryRecipts.autoSendMessageDeliveryReceipts = YES; 

我通过在我的消息实体中添加'chatStatus'属性解决了这个问题。对于发件人,我将chatStatus的值保持为已发送,未发送或已接收(由其他方接收或未接收)。对于Receiver Side,我将值保持为已读或未读(我是否已阅读消息,因此对于未读消息,我可以发送已读回执)。



On Click Of发送按钮:

  //保存到您的消息实体

NSMutableDictionary * m = [[NSMutableDictionary alloc ] 在里面];
[m setObject:message_body forKey:@message_body];
[m setObject:messageID forKey:@message_id];
[m setObject:@yesforKey:@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([[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 {
//其他泡泡,通知他们你已阅读邮件,如果邮件未读/新邮件

if([[messageDict valueForKey:@ chatStatus] isEqualToString:unread]){

//发送已读回执
NSXMLElement * receivedelement = [NSXMLElement elementWithName:@已收到xmlns:@urn:xmpp:receipts] ;

NSXMLElement * message = [NSXMLElement elementWithName:@messagexmlns:@jabber:client];
[message addAttributeWithName:@tostringValue:toId];
[message addAttributeWithName:@fromstringValue:fromID];
[receivedelement addAttributeWithName:@idstringValue:[messageDict valueForKey:@message_id]];
[message addChild:receivedelement];

// XMPPMessage * generatedReceiptResponse = [[messageDict valueForKey:@xmppMessage] generateReceiptResponse];
[[[kAppDelegate xmppHandler] xmppStream] sendElement:message];

//更新消息实体
[self updateChatStatus:read withMessageID:[messageDict valueForKey:@message_id]];
}
}

最后当您收到didReceiveMessage中的送货回收时,将chatStatus更新为已收到

   - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message {

if([message hasReceiptResponse]){// message read
//更新数据库消息实体
[self updateChatStatus:@receivedwithMessageID:[message receiptResponseID]];
}
}

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



希望它有助于!!


HI I am developing chat app so i am using xmpp framework.Chatting is working fine but how to get the message delivery like in whatsapp, facebook etc.,i searched for that i found some document here is my code upto now i am implemented

in connect Method

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

added this lines in sending messsage method

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

but This is for message delivered or not how can we check the deliverd message read or not i have seen these extentions XEP-0184,XEP-0333 but I don't have any idea to implement the read /unread messages. please help me

解决方案

If you want to get the read receipts then instead of sending auto message delivery receipts, send it whenever user reads that message. Each message has it's corresponding message_id. Use that message_id to send the delivery receipt for the particular message that has been read. So, comment the following line

//xmppMessageDeliveryRecipts.autoSendMessageDeliveryReceipts = YES;

I solved this problem by adding 'chatStatus' attribute in my message entity. For sender I have kept value of chatStatus as sent, unsent, or received(received by other side or not). For Receiver Side I have kept the Values as read or unread(Have I read message or not, So that for unread message I could send read Receipts).

On Click Of send Button:

//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];
}

In 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"]];
        }
    }

And finally when you receive the delivery Receipt in didReceiveMessage, update the chatStatus to received

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{

if ([message hasReceiptResponse]) {//message read
//Update database message entity
 [self updateChatStatus:@"received" withMessageID:[message receiptResponseID]];
}
}

You could set the values of chatStatus as per your requirement. As for unsent messages I have set it as sent in didSendMessage delegate.

Hope it Helps!!

这篇关于如何在xmpp框架中获取消息读/未读报告?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆