2011-09-13 34 views
11

Cách xác định trạng thái tin nhắn (đọc/chưa đọc). Trò chuyện được thực hiện với giao thức XMPP.Làm cách nào để xác định trạng thái tin nhắn (đọc/chưa đọc) trong trò chuyện?

+3

Bạn đã thành công trong vấn đề này chưa? Tôi tò mò về việc làm thế nào để làm điều đó –

+0

Tôi cũng tò mò về cách làm điều đó ... – Sirius

+0

Nếu có ai thành công trong việc này hãy chia sẻ một số thông tin @danipralea – juned

Trả lời

6

XEP-0184: Biên lai gửi thư hỗ trợ thông báo cho người gửi khi thư của họ được gửi. Bạn có thể sử dụng nó như một khối xây dựng, miễn là bạn không mong đợi các khách hàng hiện tại gửi các biên nhận này - XEP không được triển khai rộng rãi hiện nay.

+0

Tôi đã thực hiện tính năng này và làm việc thành công. Tôi đang bối rối làm thế nào để quyết định tin nhắn được gửi hoặc đọc? Vì không có bất kỳ điều khoản nào để lưu trữ trạng thái gửi thư. Bạn có thể gợi ý cho tôi những gì tôi cần phải làm? –

+0

Rất khó để biết một thư đã thực sự được đọc chưa. Đây là một trong những lý do chính khiến khách hàng hiện tại không triển khai XEP. Tôi sẽ nói rằng có thể cho biết nếu tin nhắn đã được hiển thị là về tốt nhất bạn có thể làm. Nếu ứng dụng khách ở trên cùng trong khi tab có thông báo là tab đang được hiển thị và thông báo nằm bên trong cửa sổ cuộn trong khi ở trạng thái đó, nó có thể được hiển thị. –

0

XMPP không có một đọc/nhận chưa đọc. Trong khi nhận được là một cái gì đó đã được thực hiện trong XEP-0184.

1

Nếu bạn muốn nhận biên nhận đã đọc, thay vì gửi biên lai gửi tin nhắn tự động, hãy gửi nó bất cứ khi nào người dùng đọc tin nhắn đó. Mỗi tin nhắn có message_id tương ứng. Sử dụng message_id đó để gửi biên nhận giao hàng cho thư cụ thể đã được đọc. Thêm mã sau đây trong khi thực hiện kết nối

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

Tôi giải quyết vấn đề này bằng cách thêm thuộc tính 'chatStatus' vào thực thể thư của tôi. Đối với người gửi, tôi đã giữ giá trị của chatStatus như đã gửi, chưa gửi hoặc đã nhận (đã nhận được từ phía bên kia hay không). Đối với Bên nhận Tôi đã giữ các Giá trị là đã đọc hoặc chưa đọc (Tôi có đọc tin nhắn hay không, Vì vậy, đối với tin nhắn chưa đọc, tôi có thể gửi Biên nhận đã đọc).

On Click của nút Gửi:

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

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

Và cuối cùng khi bạn nhận được hóa đơn giao hàng trong didReceiveMessage, cập nhật chatStatus để nhận

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

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

Bạn có thể thiết lập các giá trị của chatStatus theo yêu cầu của bạn. Đối với các tin nhắn chưa gửi, tôi đã thiết lập nó như được gửi trong delegate didSendMessage.

Lưu ý: Trong ứng dụng của tôi, tôi phải chỉ hiển thị trạng thái đã đọc, đã gửi và không được đặt, chứ không phải trạng thái đã gửi. Nếu bạn cũng muốn hiển thị trạng thái phân phối, thì đừng bình luận autoSendMessageDeliveryReceipts và bất cứ khi nào tin nhắn được đọc, hãy gửi thông báo IQ đến người gửi thay vì nhận giao hàng và thay đổi chatStatus tương ứng.

Đây chỉ là ý tưởng cơ bản, bạn có thể sử dụng nó theo yêu cầu của bạn.

Hy vọng nó sẽ giúp ích !!

Các vấn đề liên quan