消息回复实现方案
更新时间: 2024/07/26 13:39:23
若您需要实现简单的回复功能,可以参考我们在 UIKit 上使用的回复逻辑,以实现简单的类微信的消息回复功能。
方案介绍
在回复的消息中通过扩展参数,保留被回复消息的相关内容。在消息体 NIMMessage
中可以通过 remoteExt
来获取和设置消息体中的远程传输的扩展参数,回复消息的内容就以 NSDictionary 形式保存在该消息体中,数据格式如下:
"yxReplyMsg": {
"idClient": "消息的ID,唯一标识",//被回复消息本地产生的唯一ID
"from": "fromAccount",//被回复消息的发送者账号
"to": "sessionId",//会话ID
"time": 1683361848167,//被回复消息的发送时间,数据类型为 Int,单位为毫秒
"scene": "p2p",//被回复消息的会话类型,"p2p" 代表单聊, "team" 代表群聊,会话类型的NSString值
"idServer": serverId //被回复消息的serverID,服务端产生的消息唯一ID
}
在发送一条回复消息时,会将上述被回复消息的内容,设置到该消息的 remoteExt
中。
实现流程
-
创建一条文本消息。
let message = NIMMessage() message.text = "这是一条文本消息"
-
在文本消息中插入被回复消息内容。
//创建回复消息的远程参数, target 代表被回复消息 NIMMessage 对象 let yxReplyMsg: [String: Any] = [ "idClient": target.messageId, "scene": target.session?.sessionType == .P2P ? "p2p" : "team", "from": target.from ?? "", "to": target.session?.sessionId ?? "", "idServer": target.serverID, "time": Int(target.timestamp) * 1000, ] if message.remoteExt == nil { message.remoteExt = [keyReplyMsgKey: yxReplyMsg] } else { message.remoteExt![keyReplyMsgKey] = yxReplyMsg }
上述示例中的
keyReplyMsgKey
为回复内容的 key,已在常量中定义,可以直接使用。public let keyReplyMsgKey = "yxReplyMsg"
-
发送消息。
ChatProvider.shared.sendMessage(message: message, session: session, completion)
-
对接收到的消息进行解析,根据
idClient
或者idServer
来判断是否包含回复内容。var replyId: String? = message.repliedMessageId // 兼容 thread 方案 if let yxReplyMsg = message.remoteExt?[keyReplyMsgKey] as? [String: Any] { replyId = yxReplyMsg["idClient"] as? String } guard let messageId = replyId, !messageId.isEmpty else { return }
-
通过获取到消息的
idClient
( iOS 端称为 messageId)或者idServer
(服务端产生的唯一ID,iOS 端称为serverID)来查询被回复的消息。//根据 messageId 查询本地数据库,被回复消息的内容 if let message = ConversationProvider.shared.messagesInSession(session, messageIds: [messageId])? .first { ... }
此文档是否对你有帮助?