如何確定消息狀態(讀取/未讀取)。聊天是通過XMPP協議實現的。如何確定聊天中的消息狀態(讀取/未讀)?
回答
XEP-0184:消息傳遞迴執支持在發送消息時通知發件人。只要您不希望現有客戶發送這些收據,您可以將其用作構建模塊 - XEP目前尚未廣泛實施。
我已經實現了這個功能,併成功地工作。我很困惑如何決定郵件是傳遞還是閱讀?因爲沒有任何規定來存儲消息狀態傳遞。你能告訴我我需要做什麼? –
很難判斷消息是否真的被讀取過。這是現有客戶不實施XEP的主要原因之一。我會說,能夠告訴消息是否已經顯示是你所能做的最好的。如果客戶端是頂部的應用程序,而帶有消息的選項卡是顯示的選項卡,並且該消息在該狀態下處於滾動窗口內部,則可能顯示該消息。 –
我認爲你需要使用顯示的聊天標記,每http://xmpp.org/extensions/xep-0333.html
XMPP協議不具有讀/未讀回執。雖然收到的是在XEP-0184中實施的東西。
如果您希望獲取已讀回執,而不是發送自動消息傳遞收據,則只要用戶閱讀該消息就發送它。每條消息都有相應的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,更新chatStatus收到
- (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節發送給發件人,而不是發送收據並相應地更改chatStatus。
這只是基本的想法,你可以根據你的要求使用它。
希望它有助於!
- 1. Quickblox聊天消息閱讀狀態
- 2. 使用FQL讀取聊天消息
- 3. 如何計算javascript中的firebase聊天消息中的未讀消息
- 4. 節點js實時聊天讀取或不讀取狀態
- 5. Twilio聊天消息Android和iOS的消費地平線和閱讀狀態
- 6. mysql和php中的未讀聊天消息
- 7. 如何閱讀Android中的Facebook聊天消息?
- 8. Facebook聊天API是否支持讀取以前的聊天消息?
- 9. FB PHP SDK將未讀消息狀態更改爲讀取和計數未讀消息
- 10. 如何以編程方式從Gmail獲取所有(讀取和未讀取)消息,讀取狀態等?
- 11. 使用iOS sdk更新Twilio聊天消息正文和屬性並獲取已讀/未讀消息計數器
- 12. 如何使用jQuery在聊天中檢查消息狀態「消息可見」
- 13. 未捕獲TypeError:無法讀取未定義的屬性'聊天'
- 14. 如何區分Android ListView中的讀取和未讀消息?
- 15. PHP報文API讀取組聊天消息
- 16. Java聊天服務器,可以讀取和寫入消息
- 17. 如何從mysql獲取未讀消息
- 18. Quickblox iOS - 未讀取消息
- 19. 實現未讀/讀取檢查消息
- 20. 無法讀取屬性的「聊天」的不確定
- 21. 如何區分讀取和未讀的消息
- 22. SocketIO聊天 - 不能讀取的不確定
- 23. iOS聊天應用程序的用戶狀態消息
- 24. netty如何確定讀取完成時的狀態?
- 25. 未捕獲的ReferenceError:消息未定義流星聊天教程
- 26. 如何獲取/設置Domino通過Domino COM對象讀取消息的狀態?
- 27. 自動更新Google聊天狀態消息
- 28. 未讀取註冊表的UAC狀態
- 29. 如何在android中讀取新消息中的消息內容?
- 30. 如何在android中讀取USSD消息?
你在這件事上成功了嗎?我很好奇自己如何去做 –
我也很好奇如何做到這一點...... – Sirius
如果有人在這方面取得成功,請分享一些信息@danipralea – juned