消息回复实现方案
更新时间: 2024/09/27 10:50:00
若您需要实现简单的回复功能,可以参考我们在 UIKit 上使用的回复逻辑,以实现简单的类微信的消息回复功能。
方案介绍
在回复的消息中通过扩展参数,保留被回复消息的相关内容。在消息体 IMMessage
中可以通过 getRemoteExtension
和 setRemoteExtension
来获取和设置消息体中的远程传输的扩展参数,回复消息的内容就以 Map 形式保存在该消息体中,数据格式如下:
"yxReplyMsg": {
"idClient": "消息的UUID",//被回复消息本地产生的唯一ID
"from": "fromAccount",//被回复消息的发送者账号
"to": "sessionId",//会话ID
"time": 1683361848167,//被回复消息的发送时间,数据类型为 Long
"scene": "P2P",//被回复消息的会话类型,P2P代表单聊,Team代表群里,会会话类型的String值
"idServer": serverId //被回复消息的serverID,服务端产生的消息唯一ID,数据类型为 Long
}
在发送一条回复消息时,会将上述被回复消息的内容,设置到该消息的 RemoteExtension
中。
实现流程
- 创建一条文本消息。
IMMessage textMsg = MessageBuilder.createTextMessage(sessionId, sessionType, "这是一条文本消息");
- 在文本消息中插入被回复消息内容。
//创建回复消息的远程参数,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);
- 发送消息。
ChatRepo.sendMessage(textMsg, true, callback);
- 对接收到的消息进行解析,根据
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) { } }
- 通过获取到消息的
idClient
(Android端称为 uuid)或者idserver
(服务端产生的唯一ID)来查询被回复的消息。List<String> uuidList = new ArrayList<>(1); uuidList.add(uuid); //根据UUID查询本地数据库,被回复消息的内容 ChatRepo.queryMessageListByUuid(uuidList,callback);
此文档是否对你有帮助?