撤回消息
撤回消息
您的用户通过 App 成功发送了一条消息之后,可能发现消息内容错误等情况,希望将消息撤回,同时从接收者的消息记录中移除该消息。您可以使用撤回消息功能实现该需求。
recallMessage
会替换聊天记录中的原始消息为一条 objectName 为 RC:RcNtf
的撤回通知消息(RCRecallNotificationMessage)。同时消息接收方可通过 RCIMClientReceiveMessageDelegate
的 messageDidRecall
回调方法获取服务端通知,在收到对方已撤回通知时进行相应操作并刷新界面。
撤回通知消息的结构说明可参见服务端文档通知类消息格式。
默认情况下,融云对撤回消息的操作者不作限制。如需限制,可考虑以下方案:
- App 客户端自行限制撤回消息的操作者。例如,不允许 App 业务中的普通用户撤回他人发送的消息,允许 App 业务中的管理员角色撤回他人发送的消息。
- 如需避免用户撤回非本人发送的消息,可以提交工单申请打开IMLib SDK 只允许撤回自己发送的消息。从融云服务端进行限制,禁止用户撤回非本人发送的消息。
IMLib 对于撤回消息并没有做时间限制,现在主流的社交软件都会进行撤回时间限制,建议开发者自行做撤回时间限制。
撤回消息
撤回指定消息,只有已发送成功的消息可被撤回。撤回成功结果中返回消息的 messageId
,但此时该消息已被替换为撤回提示小灰条消息(RCRecallNotificationMessage
)。您可以根据 messageId
从数据库中获取撤回提示小灰条消息并在界面展示。
[[RCIMClient sharedRCIMClient] recallMessage:msg pushContent:nil success:^(long messageId) {
} error:^(RCErrorCode errorcode) {
}];
已复制
1
2
3
4
5
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 需要撤回的消息 |
pushContent | NSString | push 显示的内容 |
successBlock | Block | 撤回成功的回调。返回撤回消息的 messageId ,该消息已经变更为新的撤回提示小灰条消息。 |
errorBlock | Block | 撤回失败的回调。RCErrorCode 为错误码。 |
如果需要通过消息 ID (数据库索引唯一值)或者 UID(服务器消息唯一 ID)撤回消息,可先通过以下方法获取待撤回的消息,再使用 recallMessage
撤回消息。
撤回消息时携带用户信息(userInfo)和附加信息(extra)
某些情况下,您可能希望在撤回消息的同时附加一些用户信息和其他的一些额外信息。为了实现这个功能,您可以在调用撤回消息的 API 时,为消息内容中的 senderUserInfo
和 extra
字段设置相应的值。以下是如何在 Objective-C 代码中实现上述功能的示例:
// 获取消息实例。
RCMessage *msg = [[RCCoreClient sharedCoreClient] getMessage:messageId];
// 设置用户信息,包括用户 ID,用户名,和头像 URL。
msg.content.senderUserInfo = [[RCUserInfo alloc] initWithUserId:@"userId" name:@"name" portrait:@""];
// 设置附加信息。
msg.content.extra = @"user‘s extra information";
// 执行撤回操作,设置撤回后的消息推送内容为空,并定义成功和失败的回调。
[[RCIMClient sharedRCIMClient] recallMessage:msg pushContent:nil success:^(long messageId) {
// 撤回成功处理逻辑。
} error:^(RCErrorCode errorcode) {
// 撤回失败处理逻辑。
}];
已复制
1
2
3
4
5
6
7
8
9
10
11
12
撤回操作完成后,消息的 senderUserInfo
和 extra
字段将更新为撤回时所附带的信息。
监听消息被撤回事件
消息发送方调用 recallMessage
后,消息接收方可通过 RCIMClientReceiveMessageDelegate
的 messageDidRecall
回调方法获取服务端通知,在收到对方已撤回通知时进行相应操作并刷新界面,或进行相应处理。
实现此功能需要开发者遵守 RCIMClientReceiveMessageDelegate
协议。
设置代理委托
[[RCIMClient sharedRCIMClient] setReceiveMessageDelegate:self object:nil];
已复制
1
代理方法
消息接收方可通过下面方法监听到被撤回的消息。
@protocol RCIMClientReceiveMessageDelegate <NSObject>
/*!
消息被撤回的回调方法
@param message 被撤回的消息
@discussion 被撤回的消息会变更为RCRecallNotificationMessage,App需要在UI上刷新这条消息。
@discussion 和上面的 - (void)onMessageRecalled:(long)messageId 功能完全一致,只能选择其中一个使用。
*/
- (void)messageDidRecall:(RCMessage *)message;
@end
已复制
1
2
3
4
5
6
7
8
9
10
11