过滤消息
更新时间: 2025/07/22 16:07:00
网易云信即时通讯 SDK(NetEase IM SDK)提供消息过滤功能,帮助您有效管理和筛选接收的消息。
支持平台
本文内容适用的开发平台或框架如下表所示:
安卓 | iOS | macOS/Windows | Web/uni-app/小程序 | Node.js/Electron | 鸿蒙 | Flutter |
---|---|---|---|---|---|---|
✔️️️ | ✔️️️ | ✔️ | ✔️️️ | ✔️ | ✔️️️ | ✔️ |
功能概述
NIM SDK 提供消息过滤器,注册过滤器后可过滤消息(一般针对通知消息)。设置消息过滤后,被过滤的消息:
- 不会存储至数据库。
- 不会触发消息接收回调。
- 应用层也不会收到对应的消息。
使用场景
- 适用于过滤用户不需要关注的消息(如通知消息),使用户免受过多信息的干扰。
- 适应于屏蔽特定用户的消息。
- 适用于忽略特定群组的消息。
注意事项
- 推荐配合本地会话使用:消息过滤功能建议与本地会话功能一起使用,不建议在云端会话模式下使用。
- 注册时机:建议在 SDK 初始化时注册消息过滤器,确保漫游消息和离线消息也能被正确过滤。
- 过滤范围:消息过滤仅对客户端收到的在线消息、离线消息和漫游消息有效,云端历史记录无法通过此功能过滤。
- 性能考虑:过滤器回调中应避免耗时操作,以防止线程阻塞。
前提条件
在开始实现消息过滤功能前,请确保:
实现步骤
安卓
- 调用
V2NIMMessageFilter.shouldIgnore
方法创建消息过滤器,传入需要过滤的消息。
返回值 | V2NIMMessageFilter 接口 | 说明 |
---|---|---|
boolean | shouldIgnore(V2NIMMessage message) |
是否过滤消息:true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。false ,即不过滤(默认存储到数据库并通知应用上层)。 |
- 调用
setMessageFilter
设置消息过滤器。
iOS
-
初始化 SDK 时,创建一个
NIMSDKConfigDelegate
对象,并实现下列方法。-(BOOL)shouldIgnoreNotification:(NIMNotificationObject *)notification
方法,返回YES
表示忽略某条通知消息。-(BOOL)shouldIgnoreMessage:(NIMMessage *)message
方法,返回YES
表示忽略某条普通消息。普通胸袭 就
-
将
NIMSDKConfigDelegate
对象赋值给NIMSDKConfig
的delegate
属性。不建议在消息过滤函数或方法中进行耗时操作,否则将导致线程阻塞。
macOS/Windows
- 调用
V2NIMMessageFilter.shouldIgnore
方法创建消息过滤器,传入需要过滤的消息。
返回值 | V2NIMMessageFilter 接口 | 说明 |
---|---|---|
bool | shouldIgnore(V2NIMMessage message) |
是否过滤消息:true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。false ,即不过滤(默认存储到数据库并通知应用上层)。 |
- 调用
setMessageFilter
设置消息过滤器。
web/uni-app/小程序
- 调用
V2NIMMessageFilter.shouldIgnore
方法创建消息过滤器,传入需要过滤的消息。
返回值 | V2NIMMessageFilter 接口 | 说明 |
---|---|---|
boolean | shouldIgnore(message V2NIMMessage) |
是否过滤消息:true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。false ,即不过滤(默认存储到数据库并通知应用上层)。 |
- 调用
setMessageFilter
设置消息过滤器。
Node.js/Electron
- 调用
V2NIMMessageFilter.shouldIgnore
方法创建消息过滤器,传入需要过滤的消息。
返回值 | V2NIMMessageFilter 接口 | 说明 |
---|---|---|
boolean | shouldIgnore: V2NIMMessageFilterProvider |
是否过滤消息:true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。false ,即不过滤(默认存储到数据库并通知应用上层)。 |
- 调用
setMessageFilter
设置消息过滤器。
鸿蒙
-
在初始化时,通过配置
NIMServiceOptions.messageServiceConfig.messageFilter
指定对特定消息进行过滤(默认不过滤)。 -
调用
V2NIMMessageFilter.shouldIgnore
方法创建消息过滤器,传入需要过滤的消息。
若需要实现过滤消息的回调,可以提前在初始化时注册过滤器,过滤器会将接收到的消息对象,按照开发者应用上层定义的逻辑进行过滤。
返回值 | V2NIMMessageFilter 接口 | 说明 |
---|---|---|
boolean | shouldIgnore(message: V2NIMMessage) |
是否过滤消息:true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。false ,即不过滤(默认存储到数据库并通知应用上层)。 |
Flutter
- 调用
NIMMessageFilter.shouldIgnore
方法创建消息过滤器,传入需要过滤的消息。
返回值 | V2NIMMessageFilter 接口 | 说明 |
---|---|---|
boolean | shouldIgnore(NIMMessage message) |
是否过滤消息:true 表示过滤(SDK 将不存储此消息,应用上层不会收到此消息)。false ,即不过滤(默认存储到数据库并通知应用上层)。 |
- 调用
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;
}
);
参考文档
此文档是否对你有帮助?