思路如下:
閱后即焚,是指對方查看你發的消息后,雙方同時刪除。
這個功能可以用環信的“已讀”回調實現,當對方查看消息后,發送已讀通知,雙方同時刪除就可以了。
我在文字消息里面添加了閱后即焚
message.messageType = eMessageTypeChat;
message.ext = @{@"fire":@YES};
在- (void)didReceiveHasReadResponse:(EMReceipt *)receipt這個方法里面進行判斷,代碼如下
self.conversation = [[EaseMob sharedInstance].chatManager conversationForChatter:receipt.conversationChatter conversationType:eConversationTypeChat];
EMMessage *message = [self.conversation loadMessageWithId:receipt.chatId];
if ([message.ext[@"fire"] boolValue]) {
//如果是閱后即焚消息,刪除本地并更新UI
[self.conversation removeMessage:message];
[self.conversation removeMessageWithId:message.messageId];
self.dataArray = [[self formatMessages:self.messsagesSource] mutableCopy];
[self.tableView reloadData];
}
現在遇到的問題是判斷是閱后即焚的消息后,刪除會話里面的message,tableview reload并沒有把該條消息刪掉,關掉對話框從新進來,該條消息被刪除了
方法二:
可以通過消息擴展配合已讀回執進行實現。
流程如下:
A-->B 發送閱后即焚消息:
首先,如果是閱后即焚消息,需要在消息中標明,該消息是閱后即焚,這個時候,
用到了EMMessage的ext屬性,
NSMutableDictionary *fireDict = [NSMutableDictionary dictionary];
message.ext = [NSDictionary
dictionaryWithObject:[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].chatManager
conversationForChatter:resp.from
isGroup:NO]; // 因為只有單聊中存在閱后即焚,所以isGroup始終為NO
通過resp.from 來查到message對應的conversation,
[conversation removeMessage:resp.chatId];
然后調用刪除message的接口把它刪掉,之后處理ui上的刪除。
此時,閱后即焚功能就已經完成。