修改消息
消息修改功能允许用户对自己已发送成功的消息进行二次修改。
修改消息
注意事项
- 5.26.0 版本之前,该功能仅能用于修改超级群会话中的消息,5.26.0 版本开始允许修改单聊、群聊会话中的消息。
- 修改单聊、群聊消息时,受消息发送时间的影响,消息可能修改失败;超级群消息修改无此限制。
- 仅支持修改本端用户发送的消息,无法修改其他用户发送的消息。
- 消息内容大小不得超过 128KB。
- 消息类型不可修改。
通过调用 modifyMessageWithParams 接口对消息进行修改。修改成功后,您可以通过消息的 isModifyMessage
属性判断消息是否曾被修改过。
对于 5.26.0 版本之前的用户,请参考 modifyMessage 接口 APIDoc 文档。
javascript
// 以修改文本消息为例,修改后的 content 内容应与原文本消息内容结构一致
const params = {
messageUId: '<原消息 UId>', // 原消息 UId
messageContent: { // 修改后的消息内容应与原消息结构一致
content: 'text'
},
conversation: { // 消息所属会话信息
conversationType: ConversationType.PRIVATE,
targetId: 'targetId',
// channelId: '' // 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
是等效的。
javascript
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 显示。
示例代码
JavaScript
const refreshMessageUI = (code, messageUId, message) => {
if (code === ErrorCode.SUCCESS) {
// 获取最新状态成功,message 为最新的引用消息结果,覆盖刷新即可;
// ...
return;
}
if (code === ErrorCode.INVALID_PARAMETER_MESSAGE_TYPE) {
// 请求刷新的消息 'a' 并非引用消息类型,忽略
return;
}
if (code === ErrorCode.RC_DB_DATA_NOT_FOUND) {
if (message) {
// 被引用消息 b 被删除(如发送者撤回或删除),此时 message 内容中的 b 为原始内容
// 您可以按需更新 UI
// ...
return;
} else {
// 引用消息 a 已被删除或撤回,建议您更新 UI
// ...
}
return;
}
if (code === ErrorCode.SERVER_DATA_ERROR) {
// a 或 b 查询失败,服务器暂时无法获取消息最新状态,建议忽略,保持 UI 现状
if (message) {
// a 消息查询成功,但 b 消息查询失败
} else {
// 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 平台需要填写,Eelctron 平台不需要
// 其中 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);
}
})