撤回消息
您通过 IMLib SDK 成功发送了一条消息之后,可能发现消息内容错误等情况,希望将消息撤回,同时从接收者的消息记录中移除该消息。您可以使用撤回消息功能实现该需求。
撤回消息接口 recallMessage
默认会替换聊天记录中的原始消息为一条 objectName 为 RC:RcNtf
的撤回通知消息(RCRecallNotificationMessage)。同时消息接收方可通过 RCIMClientReceiveMessageDelegate
的 messageDidRecall
回调方法获取服务端通知,在收到对方已撤回通知时进行相应操作并刷新界面。
撤回通知消息的结构说明可参见服务端文档通知类消息格式。
默认情况下,融云对撤回消息的操作者不作限制。如需限制,可考虑以下方案:
- App 客户端自行限制撤回消息的操作者。例如,不允许 App 业务中的普通用户撤回他人发送的消息,允许 App 业务中的管理员角色撤回他人发送的消息。
- 如需避免用户撤回非本人发送的消息,可以提交工单申请打开IMLib SDK 只允许撤回自己发送的消息。从融云服务端进行限制,禁止用户撤回非本人发送的消息。
IMLib SDK 对于撤回消息并没有做时间限制,现在主流的社交软件都会进行撤回时间限制,建议您根据消息的 sentTime 自行做撤回时间限制。
监听消息被撤回事件
消息发送方调用撤回消息方法后,消息接收方可通过 RCIMClientReceiveMessageDelegate
的 messageDidRecall
回调方法获取服务端的通知,在收到对方已撤回通知时进行相应操作并刷新界面或处理其他业务逻辑。
设置代理委托
实现此功能需要您遵守 RCIMClientReceiveMessageDelegate
协议,并在初始化 IMLib SDK 后,连接 IM 之前设置代理委托:
[[RCCoreClient sharedCoreClient] setReceiveMessageDelegate:self object:nil];
实现代理方法
消息接收方可通过下面方法监听到被撤回的消息。
@protocol RCIMClientReceiveMessageDelegate <NSObject>
/*!
消息被撤回的回调方法
@param message 被撤回的消息
@discussion 如果原消息没有被删除,则被撤回的消息会变更为 RCRecallNotificationMessage;如果原来的消息被删除,则回调的消息为被撤回的原消息。此时 App 都建议在 UI 上刷新这条消息。
*/
- (void)messageDidRecall:(RCMessage *)message;
@end
撤回消息
- 撤回指定消息时,仅支持撤回已成功发送的消息。
- 从 5.16.1 版本开始支持配置撤回 的相关参数。
IMLib SDK 自 5.16.1 版本开始,支持通过创建 RCRecallMessageOption
对象进行撤回消息的自定义配置。撤回成功后,如果撤回配置项中的 isDelete
参数为 NO,则成功回调中返回新的变更后的消息 RCRecallNotificationMessage
; 如果撤回配置项中的 isDelete
参数为 YES,则成功回调中返回已经被删除原消息。
接口原型
- (void)recallMessage:(RCMessage *)message
option:(nullable RCRecallMessageOption *)option
pushContent:(nullable NSString *)pushContent
success:(nullable void (^)(RCMessage *message))successBlock
error:(nullable void (^)(RCErrorCode errorCode))errorBlock;
参数说明
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 需要撤回的消息 |
option | RCRecallMessageOption | 撤回消息的配置项,无配置可传 nil |
pushContent | NSString | push 显示的内容 |
successBlock | Block | message 为撤回的消息体。isDelete 为 NO 时,该消息已经变更为新的消息RCRecallNotificationMessage ; isDelete 为 YES 时,该消息已经被删除。 |
errorBlock | Block | 撤回失败的回调。errorCode:RCErrorCode 为错误码。 |
示例代码
/// - Since: 5.16.0
RCRecallMessageOption *option = [[RCRecallMessageOption alloc] init];
option.isDelete = YES;
option.isAdmin = YES;
option.disableNotification = YES;
[[RCCoreClient sharedCoreClient] recallMessage:message option:option pushContent:nil success:^(RCMessage * _Nonnull message) {
// 成功返回完整消息体
} error:^(RCErrorCode errorCode) {
}]
如果 IMLib SDK 版本号低于 5.16.1,撤回消息接口不支持配置相关参数,调用撤回消息成功后,接口会返回被撤回消息的 messageId
,但此时该消息已被替换为撤回提示的小灰条消息(RCRecallNotificationMessage
)。您可以根据 messageId
通过 getMessage 接口从数据库中获取该撤回提示消息并在界面上展示。
/// - Since: 5.0.0
[[RCCoreClient sharedCoreClient] recallMessage:message pushContent:nil success:^(long messageId) {
// 成功返回消息体 ID
} error:^(RCErrorCode errorCode) {
}]
如果需要通过消息 messageId (本地数据库索引唯一值)或者 messageUId(服务器消息唯一 ID)撤回消息,可先通过以下方法获取待撤回的消息,再使用 recallMessage
撤回消息。