修改消息
消息修改功能允许用户对自己已发送的消息进行编辑,帮助纠正错别字、补充遗漏信息或更新消息内容。
修改消息
- 5.26.0 版本之前,该功能仅能用于修改超级群会话中的消息,5.26.0 版本开始允许修改单聊、群聊会话中的消息。
- 修改单聊、群聊消息时,受消息发送时间的影响,消息可能修改失败;超级群消息修改无此限制。
- 仅支持修改本端用户发送的消息,无法修改其他用户发送的消息。
- 消息内容大小不得超过 128 KB。
- 消息类型不可修改。
通过调用 modifyMessageWithParams 接口对消息进行修改。修改成功后,您可以通过消息的 isModifyMessage 属性判断消息是否曾被修改过。
对于 5.26.0 版本之前的 SDK,请参考 modifyMessage 接口 APIDoc 文档。
// 以修改文本消息为例,修改后的内容结构应与原消息保持一致
const params = {
messageUId: '<原消息 UId>', // 原消息的 UId
messageContent: { // 修改后的消息内容,结构需与原消息一致
content: 'text'
},
conversation: { // 消息所属的会话信息
conversationType: ConversationType.PRIVATE,
targetId: 'targetId',
// channelId: '' // 超级群频道 ID,修改超级群消息时必填,单聊、群聊可不填
},
};
RongIMLib
.modifyMessageWithParams(params)
.then(res => {
if (res.isOk) {
console.log('消息修改成功!');
} else {
console.log('消息修改失败:', res.code);
}
});
监听消息修改通知
您可以通过监听 Events.MESSAGE_MODIFIED 事件,实时获取消息被修改的通知。
对于 5.26.0 版本之前的 SDK,可 监听 Events.ULTRA_GROUP_MESSAGE_MODIFIED 事件,该事件与 Events.MESSAGE_MODIFIED 是等效的。
RongIMLib.addEventListener(RongIMLib.Events.MESSAGE_MODIFIED, (messages) => {
console.log('被修改的消息列表:', messages)
})
监听离线消息修改同步完成
SDK 连接后,会自动从服务器同步当前设备离线期间产生的单、群聊消息。当离线消息同步完成后,SDK 会开始同步离线消息的修改记录,此过程完成后,会对外通知 Events.MESSAGE_MODIFIED_SYNC_COMPLETED 事件。
您可以按需监听该事件,以优化新设备登录后拉取大量离线消息时产生的渲染性能开销。
修改被引用消息
由于历史技术实现限制,对于引用消息来说,假设存在消息 a 为引用消息(RC:ReferenceMsg),其引用了另一条消息 b;当消息 b 被修改、撤回、删除时,IMLib SDK 目前无法通过消息 b 反向查找到消息 a,也无法同步对消息 a 进行修改。
因此从 SDK 获取到的历史消息列表中,引用消息 a 所包含的 b 的消息内容仍然为原始内容。此时您需要在渲染消息列表时,调用 refreshReferenceMessageWithParams 接口获取引用消息 a 的最新状态,并在获取到结果后更新 UI 显示。
示例代码
Web 端从 5.30.0 版本开始支持 referMsgStatus 数据,参考 ReferenceMessageStatus。建议升级至 5.30.0 版本以上按下方示例代码进行集成。5.30.0 版本之前,referMsgStatus 数据在 Web 平台下无效。
const refreshMessageUI = (code, messageUId, message) => {
if (message) {
// referMsgStatus 用来标识被引用消息的状态
const referMsgStatus = message.content.referMsgStatus;
switch (referMsgStatus) {
case RongIMLib.ReferenceMessageStatus.DEFAULT:
// 被引用消息 'b' 无修改
break;
case RongIMLib.ReferenceMessageStatus.MODIFY:
// 被引用消息 'b' 曾被修改过,建议通过刷新 UI
break;
case RongIMLib.ReferenceMessageStatus.RECALLED:
case RongIMLib.ReferenceMessageStatus.DELETE:
// 被引用消息 'b' 被撤回或被删除,此时 message.content 为消息 'b' 的原始内容,开发者可按需更新 UI
// Web 端无法分辨消息在服务器端被撤回或被删除,因此统一标识为 ReferenceMessageStatus.DELETE
break;
}
} else {
// message 无值,说明查询引用消息 'a' 失败,可能 'a' 已被删除或撤回
}
};
const callback = (list) => {
list.forEach((item) => {
const { code, messageUId, message } = item;
refreshMessageUI(code, messageUId, message);
});
};
const params = {
// 引用消息 UID 列表,支持批量查找
messageUIds: ['a'],
// 消息所属会话信息
conversationIdentifier: {
conversationType: RongIMLib.ConversationType.PRIVATE, // 所属会话类型
targetId: '<Target-Id>', // 消息所属会话 ID
channelId: '', // 超级群频道 ID,非超级群可忽略不填
},
// 引用关系描述,仅 Web 平台需要填写,Electron 平台不需要
// 其中 key 为引用消息 UID,value 为被引用消息 UID
messageInfoMap: {
'a': 'b', // 描述消息 a 引用了消息 b
},
// 本地查询结果回调。Electron 存在本地数据库,因此会优先查找本地数据,Web 端回调数据固定为 []
localMessageBlock: callback,
// 服务器查询结果回调
remoteMessageBlock: callback,
}
RongIMLib
.refreshReferenceMessageWithParams(params)
.then((res) => {
if (res.isOk) {
// 请求成功后,引用消息查询结果将通过 localMessageBlock、remoteMessageBlock 两个回调依次返回
console.log('请求成功');
} else {
console.log('请求失败:', res.code);
}
})
消息编辑草稿
在实际使用场景中,用户可能需要对已发送的消息进行多次编辑。为了提升用户体验,避免编辑内容意外丢失,SDK 从 5.28.0 版本开始,在 Electron 平台提供消息编辑草稿功能,支持草稿的存储、获取和清理。
此功能仅支持 Electron 平台。由于非 Electron 平台没有本地持久化存储能力,因此暂不支持此功能。