美文网首页iOS
环信ios阅后即焚功能

环信ios阅后即焚功能

作者: 以德扶人 | 来源:发表于2016-10-10 16:46 被阅读474次

思路如下:
阅后即焚,是指对方查看你发的消息后,双方同时删除。
这个功能可以用环信的“已读”回调实现,当对方查看消息后,发送已读通知,双方同时删除就可以了。


856c309d694c530ddaadbd735a230570.jpg

我在文字消息里面添加了阅后即焚
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上的删除。
此时,阅后即焚功能就已经完成。

相关文章

  • 环信ios阅后即焚功能

    思路如下:阅后即焚,是指对方查看你发的消息后,双方同时删除。这个功能可以用环信的“已读”回调实现,当对方查看消息后...

  • 如何利用融云 IMLib 来实现一个阅后即焚功能

    如何利用融云 IMLib 来实现一个阅后即焚功能 场景 项目需要在私聊中来实现一个阅后即焚的功能,即 A 用户给 ...

  • 火葬场

    阅人无数 阅后即焚

  • 《阅后即焚》

    前段买了巴金文革后创作的集子《随想录》。这几天没事,就打开阅读。先生文风质朴,明白如话,就着墨香,如听长者...

  • 阅后即焚

    今少饮,微醺,月缺…… 今大饮,醉,有两个月亮…… 宿醉,看到日出了…… 如果不是偶然翻起在伊拉克用的日记本,我都...

  • 阅后即焚

  • 阅后即焚

    人们挖坑, 手拉手跳入。 浮在脸上的微笑, 泛着油光。 以前,人们在黄昏撕下一页日历, 后来时间被打入虚拟。 只消...

  • 阅后即焚

    道冲乃陕西东府洛滨人,故土素以蒸馍扬名寰宇,余自髫年随祖母大人攻乎是技,遍访民间高人,通览诸经典籍,数十年鸡窗所...

  • 阅后即焚

    钢琴的声音汩汩流出 就想起对黑白键的向往 就想什么时候一定要学一学 每每如是 别人的舞姿翩翩而起 就仿佛看到曼妙的...

  • 阅后即焚

    1. 我呢,自认为是个身体比较强壮的人,一两年不会感冒发烧一次那种。除了每个月折磨我的大姨妈,其他一切安好。而治大...

网友评论

  • feng_dev:用了环信的UI,如何实现阅后即焚呢?
    以德扶人:@伤感的小孩 具体你需要看看环信给的sdk,找到对应的接口就行

本文标题:环信ios阅后即焚功能

本文链接:https://www.haomeiwen.com/subject/cvhvyttx.html