我正在使用xmppframework开发聊天应用程序,我成功地完成了发送和接收消息,但
1) 如果我和用户A聊天,而用户B给我发消息,我如何识别用户B向我发消息。(我已经在核心数据中维护了消息,因此消息将被保存)2) 我如何识别收到的消息是已读还是未读
注意:为了保存消息,我使用了
xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
感谢
您可以查看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
将是唯一的,让您知道它是哪条消息响应。
适用于面临相同问题的用户。
如果您想获得已阅读的收据,则不发送自动邮件传递收据,而是在用户阅读该邮件时发送。每条消息都有相应的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"属性。对于发件人,我将聊天状态的值保留为已发送、未发送或已接收(对方是否收到)。对于接收方,我将值保持为已读或未读(我是否已读消息,以便对于未读消息,我可以发送已读回执)。
点击发送按钮:
//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中收到交货收据时,将聊天状态更新为已接收
- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{
if ([message hasReceiptResponse]) {//message read
//Update database message entity
[self updateChatStatus:@"received" withMessageID:[message receiptResponseID]];
}
}
您可以根据自己的要求设置chatStatus的值。至于未发送的消息,我已将其设置为在didSendMessage委托中发送。
注意:在我的应用程序中,我只需要显示已读、已发送和未设置状态,而不是已发送状态。如果你还想显示发送状态,那么不要评论autoSendMessageDeliveryReceives,只要阅读了消息,就向发件人发送IQ节,而不是发送回执,并相应地更改聊天状态。在发送方,您必须为已发送、未发送、已接收、已发送的聊天状态取一个值。
希望它有帮助!!