消息回复实现方案
更新时间: 2024/09/27 10:50:00
若您需要实现简单的回复功能,可以参考我们在 UIKit 上使用的回复逻辑,以实现简单的类微信的消息回复功能。
方案介绍
在回复的消息中通过扩展参数,保留被回复消息的相关内容。在消息体 NIMMessage
中可以通过 remoteExtension
参数来定义消息体中的远程传输的扩展信息,回复消息的内容就以 Map 形式保存在该消息体中,数据格式如下:
"yxReplyMsg": {
"idClient": "消息的UUID",//被回复消息本地产生的唯一ID
"from": "fromAccount",//被回复消息的发送者账号
"to": "sessionId",//会话ID
"time": 1683361848167,//被回复消息的发送时间,数据类型为 int
"scene": "P2P",//被回复消息的会话类型,P2P代表单聊,Team代表群里,会会话类型的String值
"idServer": "serverId" //被回复消息的serverID,服务端产生的消息唯一ID,数据类型为 String
}
在发送一条回复消息时,会将上述被回复消息的内容,设置到该消息的 remoteExtension
中。
实现流程
-
创建一条文本消息。
var textMsg = await MessageBuilder.createTextMessage( sessionId: sessionId, sessionType: sessionType, text: '文本消息');
-
在文本消息中插入被回复消息内容。
//创建回复消息的远程参数 var msgInfo = ReplyMessageInfo( idClient: replyMsg.uuid!, scene: replyMsg.sessionType?.name, to: replyMsg.sessionId, from: getIt<LoginService>().userInfo?.userId, idServer: replyMsg.serverId?.toString(), time: replyMsg.timestamp); //将回复信息设置到要发送的消息中 message.remoteExtension![ChatMessage.keyReplyMsgKey] = msgInfo.toMap();
上述示例中回复消息的 key 值,ReplyMessageInfo类已经定义,可以直接使用。定义如下所示:
///回复消息的key static const keyReplyMsgKey = 'yxReplyMsg';
-
发送消息。
ChatMessageRepo.sendMessage(message: message, resend: resend)
-
对接收到的消息进行解析,根据
remoteExtension
中的值来判断是否包含被回复的消息。String? _getReplyMessageId(ChatMessage message) { var replyMessageInfoMap = message.nimMessage.remoteExtension?[ChatMessage.keyReplyMsgKey] as Map?; if (replyMessageInfoMap != null) { return ReplyMessageInfo.fromMap( replyMessageInfoMap.cast<String, dynamic>()) .idClient; } return null; }
-
通过获取到消息的
idClient
或者idserver
(服务端产生的唯一ID)来查询被回复的消息。var messageResult = await NimCore.instance.messageService .queryMessageListByUuid([replayMessageId], sessionId, sessionType);
此文档是否对你有帮助?