2011-09-13 11 views
11

संदेश स्थिति कैसे निर्धारित करें (पढ़ें/अपठित)। चैट एक्सएमपीपी प्रोटोकॉल के साथ महसूस किया जाता है।चैट में संदेश स्थिति (पढ़ना/पढ़ना) निर्धारित करने के लिए कैसे?

+3

क्या आप इस मामले में सफल हुए हैं? मैं अपने आप को उत्सुक हूं कि इसे कैसे करें –

+0

मैं यह भी उत्सुक हूं कि इसे कैसे करें ... – Sirius

+0

यदि कोई इसमें सफल है तो कृपया कुछ जानकारी साझा करें @ डीनिप्रेलिया – juned

उत्तर

6

XEP-0184: संदेश वितरण रसीद प्रेषक को सूचित करते समय उनका संदेश वितरित करने का समर्थन करता है। आप इसे बिल्डिंग ब्लॉक के रूप में उपयोग करने में सक्षम हो सकते हैं, जब तक कि आप मौजूदा ग्राहकों को इन रसीदों को भेजने की अपेक्षा न करें - XEP आज व्यापक रूप से कार्यान्वित नहीं है।

+0

मैंने इस सुविधा को कार्यान्वित किया है और सफलतापूर्वक काम कर रहा है। मैं उलझन में हूं कि संदेश कैसे वितरित या पढ़ा जाए? क्योंकि संदेश स्थिति वितरण को संग्रहीत करने के लिए कोई प्रावधान नहीं है। क्या आप कृपया मुझे सुझाव दे सकते हैं कि मुझे क्या करना है? –

+0

यह कहना मुश्किल है कि एक संदेश वास्तव में पढ़ा गया है या नहीं। यह मौजूदा कारणों में से एक है क्योंकि मौजूदा ग्राहक XEP को लागू नहीं करते हैं। मैं कहूंगा कि संदेश प्रदर्शित करने में सक्षम होने के बारे में यह कहने में सक्षम है कि आप क्या कर सकते हैं। यदि क्लाइंट शीर्ष पर एप्लिकेशन है, जबकि संदेश वाला टैब टैब प्रदर्शित होता है, और संदेश उस स्थिति में स्क्रॉल विंडो के अंदर रहा है, तो शायद यह प्रदर्शित किया गया है। –

0

XMPP एक पढ़ा/अपठित रसीद नहीं है की जरूरत है। प्राप्त होने पर कुछ ऐसा है जो XEP-0184 में लागू किया गया था।

1

यदि आप पढ़ी रसीदें प्राप्त करना चाहते हैं तो ऑटो संदेश वितरण रसीद भेजने की बजाय, जब भी उपयोगकर्ता उस संदेश को पढ़ता है तो उसे भेजें। प्रत्येक संदेश में यह संबंधित संदेश_आईडी है। पढ़े गए विशेष संदेश के लिए डिलीवरी रसीद भेजने के लिए उस संदेश_आईडी का उपयोग करें। कनेक्शन बनाने के दौरान निम्नलिखित कोड जोड़ें

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

मैंने अपनी संदेश इकाई में 'चैटस्टैटस' विशेषता जोड़कर इस समस्या को हल किया। प्रेषक के लिए मैंने चैटस्टैटस का मूल्य भेजा, असंतोष, या प्राप्त (अन्य पक्ष द्वारा प्राप्त या नहीं) रखा है। रिसीवर साइड के लिए मैंने मानों को पढ़ने या अपठित के रूप में रखा है (क्या मैंने संदेश पढ़ा है या नहीं, ताकि अपठित संदेश के लिए मैं पढ़ी रसीद भेज सकूं)।

भेजें बटन पर क्लिक करने पर:

//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 अद्यतन आप अपनी आवश्यकता के अनुसार चैटस्टैटस के मान सेट कर सकते हैं। असंतोष संदेशों के लिए मैंने इसे भेज दिया है जैसा कि प्रेषित प्रतिनिधि प्रतिनिधि में भेजा गया है।

नोट: मेरे ऐप में मुझे केवल पढ़ने, भेजा और अनसेट स्थिति दिखाना था, डिलीवर की स्थिति नहीं। यदि आप डिलीवरी की स्थिति भी दिखाना चाहते हैं, तो ऑटोसेन्ड मैसेज डिलीवरी रीसेप्ट्स पर टिप्पणी न करें और जब भी संदेश पढ़े जाते हैं तो IQ Stanza को डिलीवरी रसीद के बजाय प्रेषक को भेजें और उसके अनुसार चैटस्टैटस को बदलें।

यह केवल मूल विचार है, आप इसे अपनी आवश्यकता के अनुसार उपयोग कर सकते हैं।

उम्मीद है कि यह मदद करता है !!

संबंधित मुद्दे