问题描述
解决方案
可以通过消息扩展配合已读回执进行实现。流程如下:A-->B 发送阅后即焚消息:首先,如果是阅后即焚消息,需要在消息中标明,该消息是阅后即焚,这个时候,用到了EMMessage的ext属性,NSMutableDictionary *fireDict = [NSMutableDictionary dictionary];message.ext = [NSDictionarydictionaryWithObject:[NSNumber numberWithBool:YES]forKey:@"isFire"];[fireDict setObject:message forKey:message.messageId];[[EaseMob sharedInstance].chatManager asyncSendMessage:message progress:nil];到此,A构建了一个带有ext的message,其中带有isFire的key,并且将其发出给B。同时,我本地维护了一个dict,里面的key为messageID,value为阅后即焚的message当B实现了IChatManagerDelegate委托,会调用回调方法,收到A发来的消息B收到消息:-(void)didReceiveMessage:(EMMessage *)message{// 此时收到了A发来的消息,这个时候,我们需要对这个消息进行分析,看它是否是阅后即焚的消息BOOL isFire = [[message.ext objectForKey:@"isFire"] boolValue];到目前为止,可以判断B收到的消息是否为阅后即焚消息。之后的逻辑如下如果该消息为阅后即焚,在B看过这条消息后,调用- (void)sendHasReadResponseForMessage:(EMMessage *)message;方法,向A发送“已读”如A实现IChatManagerDelegate委托,会调用方法:- (void)didReceiveHasReadResponse:(EMReceiptResp *)resp;具体处理如下,A收到消息后:从我们的fireDict中,通过id,查找该message是否存在EMMessage *message = [fireDict objectForKey:resp.chatId];此时如果存在,说明该消息是阅后即焚,且B已读。接下来就是ui处理和db处理,EMConversation *conversation = [[EaseMob sharedInstance].chatManagerconversationForChatter:resp.fromisGroup:NO]; // 因为只有单聊中存在阅后即焚,所以isGroup始终为NO通过resp.from 来查到message对应的conversation,[conversation removeMessage:resp.chatId];然后调用删除message的接口把它删掉,之后处理ui上的删除。此时,阅后即焚功能就已经完成。