描述
消息被拦截后,在客户端应该如何处理将消息置为发送失败的状态。
解决方案
-
被拦截的消息,在客户端发送消息的回调中,默认是发送成功的状态,如果需要让客户端感知到消息被拦截,需要开通下图功能。此功能不会额外收费。
-
开通此功能后,不同平台客户端还需要分别去处理被拦截的消息:
Android 端:
a. 需要设置敏感信息拦截监听器,被拦截的消息信息会在此监听器中回调,具体参考下面链接:敏感信息拦截回调 | 融云开发者文档 。
b. 此监听器中会返回被拦截的消息 Uid(BlockMsgUId),需调用 io.rong.imlib.RongCoreClient#getMessageByUid 方法,获取到被拦截消息的详细信息。
c. 含 Ui 集成,可以调用 io.rong.imkit.IMCenter#setMessageSentStatus 方法,修改为发送失败的状态,此方法会自动刷新 UI。
d. 无 Ui 集成,调用 io.rong.imlib.RongCoreClient#setMessageSentStatus 方法,修改为发送失败的状态,业务侧处理 UI 刷新即可。
e. 修改发送失败状态可参考下面代码块.
message.setSentStatus(SentStatus.FAILED); // 含 UI 集成调用此方法 IMCenter.getInstance().setMessageSentStatus(message, null); // 无 UI 集成调用此方法 RongCoreClient.getInstance().setMessageSentStatus(message, null);
iOS 端:
a. 需要设置敏感信息拦截监听器,被拦截的消息信息会在此监听器中回调,具体参考下面链接:敏感信息拦截回调 | 融云开发者文档
b. 实现对应回调方法后,参考下面代码实现修改消息状态的逻辑:#pragma mark - RCMessageBlockDelegate - (void)messageDidBlock:(RCBlockedMessageInfo *)blockedMessageInfo { // 通过 messageUID 获取对应的 message 信息 RCMessage *blockMessage = [[RCCoreClient sharedCoreClient] getMessageByUId:blockedMessageInfo.blockedMsgUId]; // 调用 IMLibCore 接口修改消息的发送状态 [[RCCoreClient sharedCoreClient] setMessageSentStatus:blockMessage.messageId sentStatus:SentStatus_FAILED completion:^(BOOL ret) { // 如果使用的是 IMKit ,需要延时发送刷新消息状态的通知; 如果是使用的 IMLib 则需要您自行处理 UI 刷新 RCMessageCellNotificationModel *notifyModel = [[RCMessageCellNotificationModel alloc] init]; notifyModel.actionName = CONVERSATION_CELL_STATUS_SEND_FAILED; notifyModel.messageId = blockMessage.messageId; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:KNotificationMessageBaseCellUpdateSendingStatus object:notifyModel]; }); }]; }
如有疑问,欢迎提交工单。