过滤消息

更新时间: 2025/07/22 16:07:00

网易云信即时通讯 SDK(NetEase IM SDK)提供消息过滤功能,帮助您有效管理和筛选接收的消息。

支持平台

本文内容适用的开发平台或框架如下表所示:

安卓 iOS macOS/Windows Web/uni-app/小程序 Node.js/Electron 鸿蒙 Flutter
✔️️️ ✔️️️ ✔️ ✔️️️ ✔️ ✔️️️ ✔️

功能概述

NIM SDK 提供消息过滤器,注册过滤器后可过滤消息(一般针对通知消息)。设置消息过滤后,被过滤的消息:

  • 不会存储至数据库。
  • 不会触发消息接收回调。
  • 应用层也不会收到对应的消息。

使用场景

  • 适用于过滤用户不需要关注的消息(如通知消息),使用户免受过多信息的干扰。
  • 适应于屏蔽特定用户的消息。
  • 适用于忽略特定群组的消息。

注意事项

  • 推荐配合本地会话使用:消息过滤功能建议与本地会话功能一起使用,不建议在云端会话模式下使用。
  • 注册时机:建议在 SDK 初始化时注册消息过滤器,确保漫游消息和离线消息也能被正确过滤。
  • 过滤范围:消息过滤仅对客户端收到的在线消息、离线消息和漫游消息有效,云端历史记录无法通过此功能过滤。
  • 性能考虑:过滤器回调中应避免耗时操作,以防止线程阻塞。

前提条件

在开始实现消息过滤功能前,请确保:

实现步骤

安卓
  1. 调用 V2NIMMessageFilter.shouldIgnore 方法创建消息过滤器,传入需要过滤的消息。
返回值 V2NIMMessageFilter 接口 说明
boolean shouldIgnore(V2NIMMessage message) 是否过滤消息:
  • 返回 true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。
  • 默认 false,即不过滤(默认存储到数据库并通知应用上层)。
    1. 调用 setMessageFilter 设置消息过滤器。
    iOS
    1. 初始化 SDK 时,创建一个 NIMSDKConfigDelegate 对象,并实现下列方法。

      • -(BOOL)shouldIgnoreNotification:(NIMNotificationObject *)notification 方法,返回 YES 表示忽略某条通知消息。
      • -(BOOL)shouldIgnoreMessage:(NIMMessage *)message 方法,返回 YES 表示忽略某条普通消息。普通胸袭 就
    2. NIMSDKConfigDelegate 对象赋值给 NIMSDKConfigdelegate 属性。

      不建议在消息过滤函数或方法中进行耗时操作,否则将导致线程阻塞。

    macOS/Windows
    1. 调用 V2NIMMessageFilter.shouldIgnore 方法创建消息过滤器,传入需要过滤的消息。
    返回值 V2NIMMessageFilter 接口 说明
    bool shouldIgnore(V2NIMMessage message) 是否过滤消息:
  • 返回 true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。
  • 默认 false,即不过滤(默认存储到数据库并通知应用上层)。
    1. 调用 setMessageFilter 设置消息过滤器。
    web/uni-app/小程序
    1. 调用 V2NIMMessageFilter.shouldIgnore 方法创建消息过滤器,传入需要过滤的消息。
    返回值 V2NIMMessageFilter 接口 说明
    boolean shouldIgnore(message V2NIMMessage) 是否过滤消息:
  • 返回 true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。
  • 默认 false,即不过滤(默认存储到数据库并通知应用上层)。
    1. 调用 setMessageFilter 设置消息过滤器。
    Node.js/Electron
    1. 调用 V2NIMMessageFilter.shouldIgnore 方法创建消息过滤器,传入需要过滤的消息。
    返回值 V2NIMMessageFilter 接口 说明
    boolean shouldIgnore: V2NIMMessageFilterProvider 是否过滤消息:
  • 返回 true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。
  • 默认 false,即不过滤(默认存储到数据库并通知应用上层)。
    1. 调用 setMessageFilter 设置消息过滤器。
    鸿蒙
    1. 在初始化时,通过配置 NIMServiceOptions.messageServiceConfig.messageFilter 指定对特定消息进行过滤(默认不过滤)。

    2. 调用 V2NIMMessageFilter.shouldIgnore 方法创建消息过滤器,传入需要过滤的消息。

    若需要实现过滤消息的回调,可以提前在初始化时注册过滤器,过滤器会将接收到的消息对象,按照开发者应用上层定义的逻辑进行过滤。

    返回值 V2NIMMessageFilter 接口 说明
    boolean shouldIgnore(message: V2NIMMessage) 是否过滤消息:
  • 返回 true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。
  • 默认 false,即不过滤(默认存储到数据库并通知应用上层)。
  • Flutter
    1. 调用 NIMMessageFilter.shouldIgnore 方法创建消息过滤器,传入需要过滤的消息。
    返回值 V2NIMMessageFilter 接口 说明
    boolean shouldIgnore(NIMMessage message) 是否过滤消息:
  • 返回 true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。
  • 默认 false,即不过滤(默认存储到数据库并通知应用上层)。
    1. 调用 setMessageFilter 设置消息过滤器。

    示例代码

    安卓
    Java// 创建消息过滤器实现类
    V2NIMMessageFilter messageFilter = new V2NIMMessageFilter() {
        @Override
        public boolean shouldIgnore(V2NIMMessage message) {
            // 根据消息内容进行过滤
            // 例如:过滤掉所有文本消息
            if (message.getMsgType() == V2NIMMessage.V2NIM_MESSAGE_TYPE_TEXT) {
                return true; // 返回 true 表示忽略消息
            }
            
            // 例如:过滤掉来自特定发送者的消息
            if ("blockedUser123".equals(message.getFromAccount())) {
                return true;
            }
            
            // 例如:过滤掉特定群组的消息
            if (message.getConversationType() == V2NIMConversation.V2NIM_CONVERSATION_TYPE_GROUP 
                && "groupId123".equals(message.getTargetId())) {
                return true;
            }
            
            // 不过滤其他消息
            return false;
        }
    };
    
    // 设置消息过滤器
    NIMClient.getService(V2NIMMessageService.class).setMessageFilter(messageFilter);
    
    // 移除消息过滤器
    // NIMClient.getService(V2NIMMessageService.class).setMessageFilter(null);
    
    iOS
    Objective-C- (BOOL)shouldIgnoreMessage:(NIMMessage *)message
    {
        // 例:过滤所有机器人消息
        NIMMessageType type = NIMMessageTypeRobot;
        if (message.messageType == type) {
            return YES;// 返回 YES 表示忽略消息
        }
        return NO;
    }
    
    - (BOOL)shouldIgnoreNotification:(NIMNotificationObject *)notification
    {
        // 例:过滤特定类型的群通知
        BOOL ignore = NO;
        NIMNotificationContent *content = notification.content;
        if ([content isKindOfClass:[NIMTeamNotificationContent class]]) //这里做个示范如何忽略部分通知 (不在聊天界面显示)
        {
            NSArray *types = [[NTESBundleSetting sharedConfig] ignoreTeamNotificationTypes];
            NIMTeamOperationType type = [(NIMTeamNotificationContent *)content operationType];
            for (NSString *item in types)
            {
                if (type == [item integerValue])
                {
                    ignore = YES;
                    break;
                }
            }
        }
        return ignore;
    }
    
    macOS/Windows
    C++auto& messageService = v2::V2NIMClient::get().getMessageService();
    nstd::string messageClientId = "afbd7156-****-f9abf5e88191";
    V2NIMMessageType messageType = V2NIM_MESSAGE_TYPE_TEXT;
    V2NIMMessageFilter filter;
    filter.shouldIgnore = [=](const V2NIMMessage& message) {
        if (message.messageClientId == messageClientId) {
            // ignore message with messageClientId
            return true;
        }
        if (message.messageType == messageType) {
            // ignore message with messageType
            return true;
        }
        return false;
    };
    messageService.setMessageFilter(filter);
    
    web/uni-app/小程序
    TypeScript// 创建消息过滤器
    const messageFilter = {
      shouldIgnore(message) {
        // 根据消息内容进行过滤
        // 例如:过滤掉所有文本消息
        if (message.msgType === V2NIMMessageType.text) {
          return true; // 返回 true 表示忽略该消息
        }
        
        // 例如:过滤掉来自特定发送者的消息
        if (message.fromAccount === 'blockedUser123') {
          return true;
        }
        
        // 例如:过滤掉特定群组的消息
        if (message.conversationType === V2NIMConversationType.group 
            && message.targetId === 'groupId123') {
          return true;
        }
        
        // 不过滤其他消息
        return false;
      }
    };
    
    // 设置消息过滤器
    nim.V2NIMMessageService.setMessageFilter(messageFilter);
    
    // 移除消息过滤器
    // nim.V2NIMMessageService.setMessageFilter(null);
    
    Node.js/Electron
    TypeScriptimport { v2, V2NIMMessageType } from 'node-nim'
    v2.messageService?.setMessageFilter({
      shouldIgnore: (message: V2NIMMessage) => {
        if (message.messageClientId === 'afbd7156-******-f9abf5e88191') {
          // ignore message with messageClientId
          return true
        }
        if (message.messageType === V2NIMMessageType.V2NIM_MESSAGE_TYPE_TEXT) {
          // ignore message with messageType
          return true
        }
      }
    })
    
    鸿蒙
    TypeScript//初始化时注册过滤器
    
    const serviceOptions: NIMServiceOptions = {
      loginServiceConfig: {
        lbsUrls: ['https://lbs.netease.im/lbs/webconf.jsp'],
        linkUrl: 'weblink.netease.im:443'
      },
      pushServiceConfig: {
        harmonyCertificateName: "DEMO_HMOS_PUSH"
      },
      databaseServiceConfig: {
        encrypt: false,
        appKey: "45c6af3c98409b18a84451215d0bdd6e",
      },
      messageServiceConfig: {
        // MessageFilterNotification 为 V2NIMMessageFilter 的实现类
        messageFilter: new MessageFilterNotification() // 实现 V2NIMMessageFilter
      }
    }
    
    /**
     * 自定义消息过滤器(需要按照 V2NIMMessageFilter 类型实现接口),如过滤通知类消息
     */
    
    import { V2NIMMessage, V2NIMMessageFilter, V2NIMMessageType } from '@nimsdk/base'
    
    export class MessageFilterNotification implements V2NIMMessageFilter {
      async shouldIgnore(message: V2NIMMessage): Promise<boolean> {
        if (message.messageType === V2NIMMessageType.V2NIM_MESSAGE_TYPE_NOTIFICATION) {
          return true
        } else {
          return false
        }
      }
    }
    
    Flutter
    dartNimCore.instance.messageService.setMessageFilter(
            (message)async{
              //例如过滤图片消息
              if(message.messageType ==  NIMMessageType.image){
                return true;
              }
              return false;
            }
        );
    

    参考文档

    此文档是否对你有帮助?
    有帮助
    去反馈
    • 支持平台
    • 功能概述
    • 使用场景
    • 注意事项
    • 前提条件
    • 实现步骤
    • 示例代码
    • 参考文档