阅后即焚


阅后即焚:用户A发送消息,当用户B接收并查看消息后,消息将同时从用户A和用户B的设备上删除。

阅后即焚消息传递过程

用户A发送消息给用户B,当用户B查看消息后,发送已读回执给用户A,并删除掉查看后的消息,用户A收到消息回执,同时删除消息。

  1. 用户A发送消息,消息扩展中添加阅后即焚标识,表示本条消息是阅后即焚消息。
  2. 用户B收到消息,解析消息扩展中是否有阅后即焚的标识,如果有,发送已读回执时删除本地消息。
  3. 用户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<EMMessage> 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<EMMessage> 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){
    // 删除此条消息
  }
}

上一页:群组@功能

下一页:消息撤回