消息回复实现方案
更新时间: 2024/09/27 10:50:00
若您需要实现简单的回复功能,可以参考网易云信在 IM UIKit 上使用的回复逻辑,以实现简单的类微信的消息回复功能。
方案介绍
在回复的消息中通过扩展参数,保留被回复消息的相关内容。在消息体 V2NIMMessage
中可以通过 serverExtension
来获取和设置消息体中的远程传输的扩展参数,回复消息的内容就以 NSDictionary 形式保存在该消息体中,数据格式如下:
json"yxReplyMsg": {
"idClient": "消息的 ID,唯一标识",//被回复消息本地产生的唯一 ID
"from": "fromAccount",//被回复消息的发送者账号
"to": "sessionId",//会话 ID
"time": 1683361848167,//被回复消息的发送时间,数据类型为 Int,单位为毫秒
"scene": 1,//被回复消息的会话类型,1 代表单聊,2 代表群聊,会话类型的 Int 值
"idServer": serverId //被回复消息的 serverID,服务端产生的消息唯一 ID
}
在发送一条回复消息时,会将上述被回复消息的内容,设置到该消息的 serverExtension
中。
实现流程
-
创建一条文本消息。
swift
let message = V2NIMMessage() message.text = "这是一条文本消息"
-
在文本消息中插入被回复消息内容。
swift
//创建回复消息的远程参数,replyMessage 代表被回复消息 NIMMessage 对象。 let yxReplyMsg: [String: Any] = [ "idClient": replyMessage.messageClientId as Any, "scene": replyMessage.conversationType.rawValue, "from": replyMessage.senderId as Any, "to": replyMessage.conversationId as Any, "idServer": replyMessage.messageServerId as Any, "time": Int(replyMessage.createTime * 1000), ] var remoteExt = NECommonUtil.getDictionaryFromJSONString(message.serverExtension ?? "") as? [String: Any] if remoteExt == nil { remoteExt = [keyReplyMsgKey: yxReplyMsg] } else { remoteExt![keyReplyMsgKey] = yxReplyMsg } message.serverExtension = NECommonUtil.getJSONStringFromDictionary(remoteExt ?? [:])
上述示例中的
keyReplyMsgKey
为回复内容的 key,已在常量中定义,可以直接使用。swift
public let keyReplyMsgKey = "yxReplyMsg"
-
发送消息。
swift
ChatRepo.shared.sendMessage(message: message, conversationId: conversationId, completion)
-
对接收到的消息进行解析,根据
idClient
或者idServer
来判断是否包含回复内容。swift
var replyId: String? = message.threadReply?.messageClientId // 兼容 thread 方案 let replyDic = ChatMessageHelper.getReplyDictionary(message: message) replyId = replyDic?["idClient"] as? String
-
通过扩展内容拼接
V2NIMMessageRefer
来查询被回复的消息。swift
let refer = ChatMessageHelper.createMessageRefer(replyDic) ChatRepo.shared.getMessageListByRefers([refer], completion)
此文档是否对你有帮助?