消息回复实现方案

更新时间: 2024/03/15 18:26:20

若您需要实现简单的回复功能,可以参考我们在 UIKit 上使用的回复逻辑,以实现简单的类微信的消息回复功能。

方案介绍

在回复的消息中通过扩展参数,保留被回复消息的相关内容。在消息体 IMMessage 中可以通过 getRemoteExtensionsetRemoteExtension 来获取和设置消息体中的远程传输的扩展参数,回复消息的内容就以 Map 形式保存在该消息体中,数据格式如下:

"yxReplyMsg": {
"idClient": "消息的UUID",//被回复消息本地产生的唯一ID
"from": "fromAccount",//被回复消息的发送者账号
"to": "sessionId",//会话ID
"time": 1683361848167,//被回复消息的发送时间,数据类型为 Long
"scene": "P2P",//被回复消息的会话类型,P2P代表单聊,Team代表群里,会会话类型的String值
"idServer": serverId //被回复消息的serverID,服务端产生的消息唯一ID,数据类型为 Long
}

在发送一条回复消息时,会将上述被回复消息的内容,设置到该消息的 RemoteExtension 中。

实现流程

  1. 创建一条文本消息。
    IMMessage textMsg = MessageBuilder.createTextMessage(sessionId, sessionType, "这是一条文本消息");
    
  2. 在文本消息中插入被回复消息内容。
    //创建回复消息的远程参数,replyMsg代表被回复消息IMMessage对象
      if (replyMsg != null) {
        Map<String, Object> remote = textMsg.getRemoteExtension();
        if (remote == null) {
          remote = new HashMap<>();
        }
        Map<String, Object> replyInfo = new HashMap<>();
        replyInfo.put("idClient", replyMsg.getUuid());
        replyInfo.put("to", replyMsg.getSessionType().toString());
        replyInfo.put("from", replyMsg.getFromAccount());
        replyInfo.put("to", replyMsg.getSessionId());
        replyInfo.put("idServer", replyMsg.getServerId());
        replyInfo.put("time", replyMsg.getTime());
        remote.put("yxReplyMsg", replyInfo);
        textMsg.setRemoteExtension(remote);
      }
    

    上述示例中回复消息的 key 值,已经在常量中定义,可以直接使用。例如 idServer 对应已定义的 REPLY_REMOTE_EXTENSION_KEY,定义如下所示:

    replyInfo.put(ChatKitUIConstant.REPLY_UUID_KEY, replyMsg.getUuid());
    replyInfo.put(ChatKitUIConstant.REPLY_TYPE_KEY, replyMsg.getSessionType().toString());
    replyInfo.put(ChatKitUIConstant.REPLY_FROM_KEY, replyMsg.getFromAccount());
    replyInfo.put(ChatKitUIConstant.REPLY_TO_KEY, replyMsg.getSessionId());
    replyInfo.put(ChatKitUIConstant.REPLY_SERVER_ID_KEY, replyMsg.getServerId());
    replyInfo.put(ChatKitUIConstant.REPLY_TIME_KEY, replyMsg.getTime());
    remote.put(ChatKitUIConstant.REPLY_REMOTE_EXTENSION_KEY, replyInfo);
    
  3. 发送消息。
    ChatRepo.sendMessage(textMsg, true, callback);
    
  4. 对接收到的消息进行解析,根据 idClient 或者 idserver 来判断是否包含回复内容。
    Object replyInfo = receiveMsg.getRemoteExtension().get("yxReplyMsg");
    if (replyInfo instanceof Map) {
      try {
        Map<String, Object> replyMap = (Map<String, Object>) replyInfo;
        if (replyMap.containsKey("idClient")) {
          Object uuid = replyMap.get("idClient");
        }
      } catch (Exception e) {
      
      }
    }
    
  5. 通过获取到消息的 idClient(Android端称为 uuid)或者 idserver(服务端产生的唯一ID)来查询被回复的消息。
    List<String> uuidList = new ArrayList<>(1);
    uuidList.add(uuid);
    //根据UUID查询本地数据库,被回复消息的内容
    ChatRepo.queryMessageListByUuid(uuidList,callback);
    
此文档是否对你有帮助?
有帮助
去反馈
  • 方案介绍
  • 实现流程