跳到主要内容

删除消息

用户成功发送了一条消息之后,可能发现消息内容错误等情况,希望删除消息。

用法

Global IM UIKit 默认启用删除功能。用户在会话页面长按消息(已发送成功的消息)可打开弹窗,点击删除后,可能的选项有在我的设备上删除或者在所有人的设备上删除。在所有的设备上删除后,一定时间内可以重新编辑。

alt(width=250) alt(width=250)

Global IM UIKit 默认实现了上图展示的消息删除功能:

  • 在我的设备上删除:从用户设备的本地消息数据库中删除该消息。开启了消息云存储后,当前用户云端历史消息记录中的对应消息也会一并被删除。
  • 在所有人的设备上删除:从消息发送者(当前用户)和消息接收者的消息记录中移除该消息,即撤回消息。默认在当前用户发送消息后 120 秒内允许操作,超过时限后不再展示该选项。删除成功后,IMLib SDK 会将设备本地消息数据库中的原始消息替换为一条撤回通知消息(RCRecallNotificationMessage)。。开启了消息云存储后,当前用户和所有消息接受者的云端历史消息记录中的对应消息也会一并被删除。

定制化

修改允许在所有人的设备上删除的时限

Global IM UIKit 默认允许在消息发送后 120 秒内在所有人的设备上删除。您可以通过会话页面配置调整该上限。

self.config.recallDuration = 120;

处理重新编辑按钮点击事件

删除消息后,会话页面中会展示 RCRecallNotificationMessage,消息 Cell 中会展示「重新编辑」按钮。输入框无论有无内容,每点击一次重新编辑,就换行追加,可以无限追加。如需调整重新点击事件,可以在会话页面,重写 tableViewCell:didTapReedit: 方法:

/*!
点击撤回消息Cell中重新编辑的回调

- Parameter model: 消息Cell的数据模型

点击撤回消息Cell中重新编辑,会调用此回调,不会再触发didTapMessageCell:。
*/
- (void)tableViewCell:(UITableViewCell *)cell
didTapReedit:(RCMessageModel *)messageModel;

自定义处理删除事件

消息长按展示的编辑事件,可以通过重写 willDisplayEditMenu:forMessageModel: 方法,调整现有事件或增加新的事件:

- (NSArray<RCMessageEditBarItem *> *)willDisplayEditMenu:(NSArray<RCMessageEditBarItem *> *)items forMessageModel:(RCMessageModel *)messageModel {
NSArray *array = [super willDisplayEditMenu:items forMessageModel:messageModel];
for (RCMessageEditBarItem *item in array) {
if (item.tag == RCMessageEditBarItemDelete) {
item.action = ^(RCBarItem *item) {
// custom action
};
break;
}
}
return array;
}

如果已有实现无法满足您的需求,可以使用 IMLib SDK 中相关 API。详见以下文档:

在所有人的设备上删除消息的权限

危险

默认情况下,即时通讯服务对“在所有人的设备上删除消息”的操作者不作限制,这意味着如果您自定义处理 UI,可以允许 App 业务中的管理员角色用户撤回他人发送的消息,也可能因实现不当导致任何人都可以撤回他人发送的消息。

在定制化 Global IM UIKit 的删除消息功能时,如需限制在所有人的设备上删除消息的权限,可考虑以下方案

  • App 客户端重写 willDisplayEditMenu:forMessageModel: 方法,根据业务需求,判断用户是否可以删除。
  • 如需避免用户撤回非本人发送的消息,可以提交工单申请打开 IMLib SDK 只允许撤回自己发送的消息。从融云服务端进行限制,禁止用户撤回非本人发送的消息。