跳到主要内容

撤回消息

您的用户通过 App 成功发送了一条消息之后,可能发现消息内容错误等情况,希望将消息撤回,同时从接收者的消息记录中移除该消息。您可以使用撤回消息功能实现该需求。

recallMessage 会替换聊天记录中的原始消息为一条 objectName 为 RC:RcNtf 的撤回通知消息(RecallNotificationMessage)。同时消息接收方可通过撤回消息监听器获取服务端通知,在收到对方已撤回通知时进行相应操作并刷新界面。

撤回通知消息的结构说明可参见服务端文档通知类消息格式

默认情况下,融云对撤回消息的操作者不作限制。如需限制,可考虑以下方案:

  • App 客户端自行限制撤回消息的操作者。例如,不允许 App 业务中的普通用户撤回他人发送的消息,允许 App 业务中的管理员角色撤回他人发送的消息。
  • 如需避免用户撤回非本人发送的消息,可以提交工单申请打开IMLib SDK 只允许撤回自己发送的消息。从融云服务端进行限制,禁止用户撤回非本人发送的消息。

IMLib 对于撤回消息并没有做时间限制,现在主流的社交软件都会进行撤回时间限制,建议开发者自行做撤回时间限制。

撤回消息

撤回指定消息,只有已发送成功的消息可被撤回。撤回的结果会返回替换后撤回提示小灰条消息(RecallNotificationMessage),您可以根据需要在界面展示。

如果撤回消息需要有特定的通知内容,设置 Message.pushConfig

      // 应该用发送成功的消息,此处做了省略处理
let msg : Message;
IMEngine.getInstance().recallMessage(msg).then(result => {
if (EngineError.Success !== result.code) {
// 撤回消息失败
return;
}
if (!result.data) {
// 撤回的小灰条消息为 空
return;
}
let recallNtfMsg = result.data as RecallNotificationMessage;
})
参数类型说明
messageMessage待撤回的消息对象

如果需要通过消息 ID (数据库索引唯一值)或者 UID(服务器消息唯一 ID)撤回消息,可先通过以下方法获取待撤回的消息,再使用 recallMessage 撤回消息。

    /**
* 根据消息 id 获取消息体(数据库索引唯一值)。
*
* @param messageId 消息 id。
*/
public getMessageById(messageId: number): Promise<IAsyncResult<Message>>

/**
* 通过全局唯一 id 获取消息实体。
*
* @param uid 全局唯一 id(服务器消息唯一 id)。
*/
public getMessageByUid(messageUid: string): Promise<IAsyncResult<Message>>

监听消息被撤回事件

消息发送方调用 recallMessage 后,消息接收方可通过消息撤回监听消息被撤回的事件,并进行相应处理。

消息接收方需要使用 setMessageRecalledListener 设置一个监听器, 用于监听已接收的消息被撤回的事件。当接收到的某条消息被撤回时,会通过此监听器回调。

      IMEngine.getInstance().
setMessageRecalledListener((message: Message, recallMessage: RecallNotificationMessage) => {

});