【发布时间】:2011-11-16 03:39:06
【问题描述】:
如何确定消息状态(已读/未读)。聊天是通过XMPP协议实现的。
【问题讨论】:
-
这件事你成功了吗?我很好奇自己该怎么做
-
我也很好奇该怎么做...
-
如果有人在这方面取得了成功,请分享一些信息@danipralea
标签: xcode xmpp chat message status
如何确定消息状态(已读/未读)。聊天是通过XMPP协议实现的。
【问题讨论】:
标签: xcode xmpp chat message status
XEP-0184: 消息传递回执支持在消息已传递时通知发件人。只要您不期望现有客户发送这些收据,您就可以将其用作构建块——XEP 目前尚未广泛实施。
【讨论】:
我认为您需要使用显示的聊天标记,每个 http://xmpp.org/extensions/xep-0333.html
【讨论】:
如果您想获取已读回执,而不是发送自动消息传递回执,而是在用户阅读该消息时发送它。每条消息都有其对应的 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 节发送给发件人而不是投递收据并相应地更改聊天状态。
这只是一个基本的想法,你可以根据你的需要使用它。
希望对你有帮助!!
【讨论】:
Xmpp 没有已读/未读回执。虽然收到的是在 XEP-0184 中实现的东西。
【讨论】: