====== 阅后即焚 ====== ---- 阅后即焚:用户A发送消息,当用户B接收并查看消息后,消息将同时从用户A和用户B的设备上删除。 {{ :im:other:integrationcases:image019.png?nolink |阅后即焚消息传递过程}} 用户A发送消息给用户B,当用户B查看消息后,发送已读回执给用户A,并删除掉查看后的消息,用户A收到消息回执,同时删除消息。 - 用户A发送消息,消息扩展中添加阅后即焚标识,表示本条消息是阅后即焚消息。 - 用户B收到消息,解析消息扩展中是否有阅后即焚的标识,如果有,发送已读回执时删除本地消息。 - 用户A收到消息回执,从本地查询该消息回执对应的消息是否是阅后即焚消息,如果是就删除本地消息并更新显示。 ===== 发送阅后即焚消息 ===== === Android示例 === // 阅后即焚关键字(只是举例,您可以自定义具体字段) private final String FIRE_FLAG = "fire"; ... // 创建消息,toChatUsername 为接收方环信 id EMMessage message = EMMessage.createTxtSendMessage("这是一条阅后即焚消息", toChatUsername); // 设置为单聊 message.setChatType(ChatType.Chat); // 设置阅后即焚扩展 message.setAttribute(FIRE_FLAG, true); // 发送消息 EMClient.getInstance().chatManager().sendMessage(message); === iOS示例 === #define FIRE_FLAG @"fire" // 阅后即焚关键字(只是举例,您可以自定义具体字段) // 此处以文字消息举例 EMTextMessageBody *body = [[EMTextMessageBody alloc] initWithText:@"这是一条阅后即焚的消息"); // 设置消息body"]; NSString *toUsername = @"接收方环信id"; NSDictionary *ext = @{FIRE_FLAG:@YES}; NSString *currentUsername = [EMClient sharedClient].currentUsername; // 当前登录环信id EMChatMessage *msg = [[EMChatMessage alloc] initWithConversationID:toUsername from:currentUsername to:toUsername body:body ext:ext]; msg.chatType = EMChatTypeChat; // 设置为单聊 [EMClient.sharedClient.chatManager sendMessage:msg progress:nil completion:nil]; === web/小程序示例 === let id = conn.getUniqueId(); // 生成本地消息id let msg = new WebIM.message('txt', id); // 创建文本消息 msg.set({ msg: '这是一条阅后即焚消息', // 消息内容 to: 'username', // 接收消息对象(用户id) chatType: 'singleChat', // 设置为单聊 ext: {fire: true}, // 消息扩展,标记为阅后即焚 success: function (id, serverMsgId) {}, fail: function(e){} }); conn.send(msg.body); ===== 接收阅后即焚消息,查看后发送回执并删除本地消息 ===== === Android示例 === // 阅后即焚关键字(只是举例,您可以自定义具体字段) private final String FIRE_FLAG = "fire"; ... /** * 新消息回调 */ @Override public void onMessageReceived(List messages) { for (EMMessage message : messages) { // 判断是否为阅后即焚消息 if (message.getBooleanAttribute(FIRE_FLAG, false)) { // update ui } } } ... // 当消息已读之后,发送已读回执,并删除消息 try { EMClient.getInstance().chatManager().ackMessageRead(message.getFrom(), message.getMsgId()); // 消息所属会话 EMConversation conversation = EMClient.getInstance().chatManager().getConversation(message.getFrom(), EMConversation.EMConversationType.Chat, true); conversation.removeMessage(message.getMsgId()); } catch (HyphenateException e) { e.printStackTrace(); } === iOS示例 === #define FIRE_FLAG @"fire" // 阅后即焚关键字(只是举例,您可以自定义具体字段) // 接收消息回调 - (void)messagesDidReceive:(NSArray *)aMessages { for (EMMessage *msg in aMessages) { // 判断是否有阅后即焚消息标识 if ([message.ext[FIRE_FLAG] boolValue]) { //update ui } } } // 当用户已经读取过消息后,删除消息并发送已读回执 - (void)fireMessageAndSendAck:(EMChatMessage *)message { // 发送已读回执 [EMClient.sharedClient.chatManager sendMessageReadAck:message completion:nil]; // _conversation ,消息所在会话 [_conversation deleteMessageWithId:message.messageId error:nil ;] } === web/小程序示例 === /** * 新消息回调 */ onTextMessage(message){ // 判断是否为阅后即焚消息 if(message.ext.fire){ // update ui } } // 当用户已经读取过消息后,发送已读回执并删除本地消息 var msgId = message.id; // 需要发送已读回执的消息id var msg = new WebIM.message('read', conn.getUniqueId()); // 已读回执消息 msg.set({ id: msgId, to: message.from }); conn.send(msg.body); ===== 消息发送方收到回执,判断需要焚毁,删除本地消息 ===== === Android示例 === // 阅后即焚关键字(只是举例,您可以自定义具体字段) private final String FIRE_FLAG = "fire"; ... /** * 收到消息已读回执 */ @Override public void onMessageRead(List messages) { for (EMMessage message : messages) { if (message.getBooleanAttribute(FIRE_FLAG, false)) { // 消息所属会话 EMConversation conversation = EMClient.getInstance().chatManager().getConversation(message.getFrom(), EMConversation.EMConversationType.Chat, true); // 删除消息 conversation.removeMessage(message.getMsgId()); } } } === iOS示例 === #define FIRE_FLAG @"fire" // 阅后即焚关键字(只是举例,您可以自定义具体字段) // 收到已读回执 - (void)messagesDidRead:(NSArray *)aMessages { for (EMChatMessage *msg in aMessages) { if ([msg.ext[FIRE_FLAG] boolValue]) { EMConversation *con = [EMClient.sharedClient.chatManager getConversation:msg.from type:EMConversationTypeChat createIfNotExist:YES]; // 消息所在会话 [con deleteMessageWithId:msg.messageId error:nil]; // 删除消息 // update ui } } } === web/小程序示例 === /** * 收到消息已读回执 */ onReadMessage(message){ // 判断这个已读回执是发送的那条阅后即焚消息的回执 if(message.id === fireMessage.id){ // 删除此条消息 } } ---- 上一页:[[im:other:integrationcases:groupchatat|群组@功能]] 下一页:[[im:other:integrationcases:revokemessages|消息撤回]]