xcode 如何确定聊天中的消息状态(已读/未读)?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7402027/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to determine the message status (read/unread) in chat?
提问by enq
How to determine the message status (read/unread). Chat is realized with the XMPP protocol.
如何确定消息状态(已读/未读)。聊天是通过 XMPP 协议实现的。
回答by Joe Hildebrand
XEP-0184: Message Delivery Receipts supports notifying senders when their message has been delivered. You might be able to use that as a building block, as long as you don't expect existing clients to send these receipts -- the XEP is not widely-implemented today.
XEP-0184:消息交付收据支持在消息已交付时通知发件人。只要您不希望现有客户发送这些收据,您就可以将其用作构建块——XEP 目前并未得到广泛实施。
回答by MK.
I think you need to use the Displayed Chat Marker, per http://xmpp.org/extensions/xep-0333.html
我认为你需要使用显示的聊天标记,每个http://xmpp.org/extensions/xep-0333.html
回答by Swati Gupta
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. Add following code while making connection
如果您想获取已读回执,那么不要发送自动消息传递回执,而是在用户阅读该消息时发送它。每条消息都有其对应的 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];
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).
我通过在我的消息实体中添加“chatStatus”属性解决了这个问题。对于发件人,我已将 chatStatus 的值保留为已发送、未发送或已接收(是否被另一方接收)。对于接收方,我将值保留为已读或未读(我是否已阅读消息,以便对于未读消息,我可以发送已读收据)。
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:
在 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
最后,当您在 didReceiveMessage 中收到交付 Receipt 时,将 chatStatus 更新为已收到
- (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.
您可以根据需要设置 chatStatus 的值。至于未发送的消息,我已将其设置为在 didSendMessage 委托中发送。
Note:In my app I had to just show the read, sent and unset status, not the delivered status. If you also wanna show delivery status, then don't comment autoSendMessageDeliveryReceipts and whenever messages are read send the IQ stanza to sender instead of delivery receipt and change the chatStatus accordingly.
注意:在我的应用程序中,我只需要显示已读、已发送和未设置状态,而不是已发送状态。如果您还想显示交付状态,则不要评论 autoSendMessageDeliveryReceipts,每当读取消息时,将 IQ 节发送给发件人而不是交付收据,并相应地更改 chatStatus。
This is just the basic idea, you could use it as per your requirement.
这只是基本思想,您可以根据需要使用它。
Hope it Helps!!
希望能帮助到你!!
回答by DeSass
Xmpp does not have a read/unread receipt. While received is something that was implemented in XEP-0184.
Xmpp 没有已读/未读回执。虽然收到是在 XEP-0184 中实现的东西。