开发指南
addMessageBlockedListener和removeMessageBlockedListener方法从 SDK 1.3.0 版本开始支持。
默认情况下,消息发送方无法感知消息是否已被融云审核服务拦截。如果 App 希望在消息因触发审核规则而无法下发时通知消息发送方,可开通使用敏感信息拦截回调服务。
融云的内容审核服务(包括消息敏感词、IM 审核服务、消息回调服务),可能在以下情况下拦截消息:
- 文本消息内容命中了融云内置的消息敏感词,导致消息不下发给接收方。
 - 文本消息内容命中了您自定 义的消息敏感词(屏蔽敏感词),导致消息不下发给接收方。
 - 消息命中了 IM 审核服务,或消息回调服务设置的审核规则,导致消息不下发给接收方。
 
开通服务
您可以在融云控制台,在 IM 服务>功能配置>安全&审核>含敏感词消息屏蔽状态回调发送端,开启此功能。
添加和移除敏感信息拦截监听器
您可以通过 addMessageBlockedListener 方法添加敏感词拦截监听器,监听到被拦截的消息以及拦截原因。
提示
- 您需要将监听器设置的时机放在调用 IMLib SDK 连接接口之前,初始化 IMLib SDK 之后,保证与融云服务端建立 IM 连接后的第一时间获取到拦截回调。
 - 建议将监听器设置给单例对象,保证整个 App 生命周期内监听器的设置都是有效的。
 
MessageBlockedListener 接口定义
TypeScript
interface MessageBlockedListener {
  onMessageBlocked: (blockInfo: MessageBlockInfo) => void;
}
接口原型
TypeScript
public addMessageBlockedListener(listener: MessageBlockedListener): void
public removeMessageBlockedListener(listener: MessageBlockedListener): void
注意
addMessageBlockedListener和removeMessageBlockedListener需要配合使用,避免内存泄露。- 重复 add 同一个 Listener 对象,只有第一个 Listener 会被 add。
 
敏感信息拦截监听器说明
在发出的消息被拦截时,SDK 会触发 MessageBlockedListener.onMessageBlocked 方法,回调参数为 MessageBlockInfo 对象。
MessageBlockInfo 里包含了被拦截消息的相关信息,您可以通过下表列出的属性访问:
参数说明
| 属性名称 | 类型 | 说明 | 
|---|---|---|
| conversationType | ConversationType | 被拦截消息所在会话的会话类型 | 
| targetId | string | 被拦截消息所在的会话 Id | 
| messageUid | string | 被拦截消息的唯一 Id | 
| blockType | MessageBlockType | 消息被拦截的原因,详见下方 MessageBlockType 说明。 | 
| extra | string | 被拦截消息的附加信息 | 
| sourceType | MessageBlockSourceType | 被拦截的超级群消息的源类型。0:原始消息触发了拦截(默认)。1:消息扩展触发了拦截。2:修改消息后的消息内容触发了拦截(仅支持超级群)。 | 
| sourceContent | string | 被拦截的超级群消息或扩展的内容 JSON 字符串。sourceType 字段为 1 时表示扩展内容。sourceType 为 2 时表示修改后的消息内容。详见下方 sourceContent 说明(仅支持超级群)。 | 
- 
MessageBlockType说明TypeScriptenum MessageBlockType {
/**
* 未知类型
*/
None = 0,
/**
* 全局敏感词:命中了融云内置的全局敏感词
*/
BlockGlobal = 1,
/**
* 自定义敏感词拦截:命中了客户在融云自定义的敏感词
*/
BlockCustom = 2,
/**
* 第三方审核拦截:命中了第三方(数美)或消息回调服务(原模板路由服务)决定不下发的状态
*/
BlockThirdParty = 3,
} - 
MessageBlockSourceType说明TypeScriptenum MessageBlockSourceType {
/**
* 默认,原始消息内容被拦截
*/
Default = 0,
/**
* 消息扩展被拦截
*/
Extension = 1,
/**
* 修改的消息内容被拦截
*/
Modification = 2,
} - 
sourceContent说明sourceType为0时,sourceContent 为空。sourceType为1时,sourceContent 是消息扩展内容,示例{"mid":"xxx-xxx-xxx-xxx","put":{"key":"敏感词"}}。mid 为通知信息的 ID。sourceType为2时,sourceContent 是修改后的消息内容,示例{"content":"含有敏感信息的文字"}。内置消息类型的消息内容格式消息类型概述。
 
示例代码
添加监听器
TypeScript
hilog.info(0x0000, 'IM-App', 'addMessageBlockedListener start');
let blockedListener: MessageBlockedListener = {
  onMessageBlocked: (blockInfo: MessageBlockInfo): void => {
    hilog.info(0x0000, 'IM-App', 'addMessageBlockedListener result blockInfo:%{public}s', JSON.stringify(blockInfo));
    
    // 处理被拦截的消息
    // 可以根据 blockInfo.blockType 判断拦截原因
    // 可以根据 blockInfo.messageUid 获取原消息内容
    
    // 拦截后获取原消息内容并设置消息发送状态
    IMEngine.getInstance().getMessageByUid(blockInfo.messageUid).then(result => {
      if (EngineError.Success !== result.code) {
        // 获取本地消息失败
        return;
      }
      if (!result.data) {
        // 消息不存在
        return;
      }
      // 获取本地消息成功
      let message = result.data as Message;
      
      // 设置消息发送状态为失败
      // 注意:您需要根据 SDK 提供的 SentStatus 枚举设置消息的发送状态,并自行处理 UI 刷新
    });
  }
};
IMEngine.getInstance().addMessageBlockedListener(blockedListener);
// 移除监听器(在不需要时调用,避免内存泄露)
// IMEngine.getInstance().removeMessageBlockedListener(blockedListener);