聊天室


在集成聊天室之前,推荐开发者首先阅读这里

聊天室功能概述

聊天室功能对应的管理类为 NIMChatroomManagerNIMChatroomManager 提供了聊天室的业务管理,如进入/退出聊天室,获取相关信息以及权限操作等。目前不支持通过 SDK 接口建立/解散聊天室。

聊天室模型特点:

聊天室鉴权模式:

关于聊天室独立模式,同名章节会有详细介绍

进入聊天室

用户要在聊天室内说话,必须先调用接口进入此聊天室。用户进入聊天室后,不会收到此聊天室的历史消息推送。如有历史消息需求,可以调用消息查询接口进行显示。

@protocol NIMChatroomManager <NSObject>
/**
 *  进入聊天室
 *
 *  @param request    进入聊天室请求
 *  @param completion 进入完成后的回调
 */
- (void)enterChatroom:(NIMChatroomEnterRequest *)request
           completion:(NIMChatroomEnterHandler)completion;
@end

NIMChatroomEnterRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
roomNickname NSString 聊天室昵称
roomAvatar NSString 聊天室头像,上层可以自主设置在聊天室内的头像,没有设置则使用用户本身的信息
roomExt NSString 本人的聊天室成员信息拓展字段,仅对当次进入有效
roomNotifyExt NSString 聊天室事件通知拓展字段
retryCount NSInteger 聊天室重连次数,默认为三次,设置成 0 后一旦一次连接失败后,SDK 将不在重试。 APP 可以根据自己的需求进行设置
mode NIMChatroomIndependentMode 聊天室独立模式. 默认为 nil,即聊天室登录需要依赖 IM 登录,只有 IM 登录后才能够登录聊天室。设置后可以在不依赖 IM 通道的情况下进行登录

NIMChatroomEnterRequest 中包含了聊天室的基本数据信息,包括需要进入的聊天室 id 和一些供用户自定义的扩展字段,后续当前用户的所有聊天室消息都会带上登录时设置的扩展字段。

扩展包括:

独立聊天室模式

NIMChatroomIndependentMode 参数决定了聊天室的鉴权方式,默认为 nil,即聊天室登录需要依赖 IM 登录。如果开发者创建并赋值了此属性,则尝试以独立模式进入聊天室。

NIMChatroomIndependentMode 参数列表

参数 类型 说明
username NSString 独立模式下的用户名,设置为 nil 情况下,SDK 将使用自动生成的匿名账号进行登录。在匿名模式下,NIMChatroomEnterRequest 必须设置昵称和头像信息
token NSString 独立模式下的 Token。 当用户名为空时,token 无效。

当依赖 IM 连接进入聊天室时,SDK可以通过 IM 连接获取具体聊天室服务的 IP 地址。而当在独立聊天室模式下,由于没有数据通道,SDK 无法自动获取聊天室服务的 IP 地址,需要上层开发者手动提供。

@interface NIMChatroomIndependentMode : NSObject
/**
 *  注册获取聊天室地址的回调方法
 *
 *  @param handler 获取聊天室地址信息的方法
 *  @discussion 在进入聊天室和刷新聊天室 IP 时,SDK 都会主动调用这个回调方法,并传入相应的两个参数 `roomId` 和 `callback`。
 *              当前回调接口要求上层使用 `roomId` 走自己的网络请求获取对应聊天室地址并通过 callback 回调给 SDK。
 *              需要注意的时候无论请求成功,都需要通过 callback 进行回调,否则进入聊天室请求将会一直等待。同时此接口只需注册一次即可,多次注册将使用后者覆盖前者。
 */
+ (void)registerRequestChatroomAddressesHandler:(NIMRequestChatroomAddressesHandler)handler
@end

代码示例

 [NIMChatroomIndependentMode registerRequestChatroomAddressesHandler:^(NSString * _Nonnull roomId, NIMRequestChatroomAddressesCallback  _Nonnull callback) {
             [YourHTTPService request:roomId completion:^(NSError *error,NSArray *addresses)
             {
                 //无论请求是否成功,都需要进行回调
                 if(callback)
                 {
                     callback(error,addresses);
                 }
             }];
         }];

其中 YourHTTPService 为开发者上层的应用服务器接口,应用服务器可以调用云信服务端的请求聊天室地址 API 来获取具体的聊天室 IP 。

聊天室独立模式的切换规则

监听聊天室连接变化

进入聊天室会建立新的连接,不同的聊天室对应着不同的连接,开发者可以监听连接状态做一些业务处理。

@protocol NIMChatroomManagerDelegate <NSObject>
/**
 *  聊天室连接状态变化
 *
 *  @param roomId 聊天室Id
 *  @param state  当前状态
 */
- (void)chatroom:(NSString *)roomId connectionStateChanged:(NIMChatroomConnectionState)state;
@end

NIMChatroomConnectionState 枚举列表

参数 说明
NIMChatroomConnectionStateEntering 0 正在进入聊天室
NIMChatroomConnectionStateEnterOK 1 进入聊天室成功
NIMChatroomConnectionStateEnterFailed 2 进入聊天室失败
NIMChatroomConnectionStateLoseConnection 3 和聊天室失去连接

当进入聊天室后,再发生掉线问题时,SDK 将自动重连,无需开发者再次调用进入房间接口。

在重连时,可能遇到一些特殊网络错误(如聊天室用户被封禁,聊天室状态异常),会触发以下回调,开发者应该在这个回调中退出聊天室界面。

@protocol NIMChatroomManagerDelegate <NSObject>
/**
 *  聊天室自动登录出错
 *
 *  @param roomId 聊天室Id
 *  @param error  自动登录出错原因
 */
- (void)chatroom:(NSString *)roomId autoLoginFailed:(NSError *)error;
@end

离开聊天室

离开聊天室时,会断开聊天室对应的连接,并不再收到关于此聊天室的任何消息。

@protocol NIMChatroomManager <NSObject>
/**
 *  离开聊天室
 *
 *  @param roomId     聊天室ID
 *  @param completion 离开聊天室的回调
 */
- (void)exitChatroom:(NSString *)roomId
          completion:(NIMChatroomHandler)completion;
@end

参数列表

参数 类型 说明
roomId NSString 聊天室 ID
completion NIMChatroomHandler 离开聊天室的回调

当用户被踢或者聊天室关闭时,会触发被踢回调,这个时候也会断开聊天室对应的连接:

@protocol NIMChatroomManagerDelegate <NSObject>
/**
 *  被踢回调
 *
 *  @param roomId   被踢的聊天室Id
 *  @param result   被踢的结果详情
 */
- (void)chatroomBeKicked:(NIMChatroomBeKickedResult *)result;
@end

被踢详情 NIMChatroomBeKickedResult

/**
 *  聊天室被踢结果
 */
@interface NIMChatroomBeKickedResult : NSObject

/**
 *  被踢的聊天室 Id
 */
@property (nonatomic, copy)      NSString    *roomId;

/**
 *  被踢的原因
 */
@property (nonatomic, assign)    NIMChatroomKickReason   reason;

/**
 *  被踢的扩展字段
 */
@property (nonatomic, copy)      NSString    *ext;

@end

NIMChatroomKickReason 枚举列表

参数 说明
NIMChatroomKickReasonInvalidRoom 1 聊天室已经解散
NIMChatroomKickReasonByManager 2 被聊天室管理员踢出
NIMChatroomKickReasonByConflictLogin 3 多端被踢
NIMChatroomKickReasonBlacklist 5 被拉黑

聊天室消息收发

聊天室消息收发接口与普通消息收发统一,在发送消息时指定会话类型为聊天室即可。会话 id 即为聊天室 id。

查询聊天室消息历史

进入聊天室时,不会下发关于聊天室的历史消息,可以通过下面的接口查询聊天室消息历史。

@protocol NIMChatroomManager <NSObject>
/**
 *  查询服务器保存的聊天室消息记录
 * 
 *  @param roomId  聊天室ID
 *  @param option  查询选项
 *  @param result   完成回调
 */
- (void)fetchMessageHistory:(NSString *)roomId
                     option:(NIMHistoryMessageSearchOption *)option
                     result:(NIMFetchChatroomHistoryBlock)completion;
@end

NIMHistoryMessageSearchOption 参数列表 (部分字段对聊天室消息搜索选项无效,已过滤)

参数 类型 说明
startTime NSTimeInterval 检索消息起始时间,需要检索的起始时间,没有则传入0。
limit NSUInteger 检索条数,最大限制 100 条
order NIMMessageSearchOrder 检索顺序
messageTypes NSArray 查询的消息类型,默认为 nil ,搜索全类型。

获取聊天室信息

此接口可以远程获取聊天室信息,NIM SDK 不会缓存聊天室信息,开发者需要根据业务自己做好缓存。

@protocol NIMChatroomManager <NSObject>
/**
 *  获取聊天室信息
 *
 *  @param roomId     聊天室ID
 *  @param completion 获取聊天室信息的回调
 *  @discussion 只有已进入聊天室才能够获取对应的聊天室信息
 */
- (void)fetchChatroomInfo:(NSString *)roomId
               completion:(NIMChatroomInfoHandler)completion;
@end

参数列表

参数 类型 说明
roomId NSString 聊天室 ID
completion NIMChatroomInfoHandler 离开聊天室的回调

修改聊天室信息

此接口可以修改聊天室信息,调用完这个接口后,开发者应该自己修改内存缓存的 NIMChatroom 对象。

此接口需要生成 NIMChatroomUpdateRequest 对象来完成请求。

NIMChatroomUpdateRequest中的 needNotify 参数可以设置成功修改信息后云信服务器是否推送一条修改的聊天室消息通知。

NIMChatroomUpdateRequest中的 notifyExt 参数可以设置推送的聊天室消息通知里带的自定义扩展字段。

@protocol NIMChatroomManager <NSObject>
/**
 *  修改聊天室信息
 *
 *  @param request    聊天室修改请求
 *  @param completion 修改后完成的回调
 */
- (void)updateChatroomInfo:(NIMChatroomUpdateRequest *)request
                completion:(nullable NIMChatroomHandler)completion;
@end

NIMChatroomEnterRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
updateInfo NSDictionary 修改信息字段,修改传入的数据键值对是 {@(NIMChatroomUpdateTag) : NSString},无效数据将被过滤
needNotify BOOL 是否需要通知
notifyExt NSString 放到事件通知里的扩展字段

获取聊天室成员

此接口可以远程获取聊天室成员列表,NIM SDK 不会缓存聊天室成员列表,开发者需要根据业务自己做好缓存。 NIM SDK 提供两种方式获取聊天室成员:

@protocol NIMChatroomManager <NSObject>
/**
 *  获取聊天室成员
 *
 *  @param request    获取成员请求
 *  @param completion 请求完成回调
 */
- (void)fetchChatroomMembers:(NIMChatroomMemberRequest *)request
                  completion:(NIMChatroomMembersHandler)completion;
@end

NIMChatroomMemberRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
type NIMChatroomFetchMemberType 聊天室成员类型
lastMember NIMChatroomMember 最后一位成员锚点,不包括此成员。填nil会使用当前服务器最新时间开始查询,即第一页。
limit NSUInteger 获取聊天室成员个数
@protocol NIMChatroomManager <NSObject>
/**
 *  根据用户ID获取聊天室成员信息
 *
 *  @param request    获取成员请求
 *  @param completion 请求完成回调
 */
- (void)fetchChatroomMembersByIds:(NIMChatroomMembersByIdsRequest *)request
                    completion:(NIMChatroomMembersHandler)completion;
@end

NIMChatroomMembersByIdsRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
userIds NSArray 用户ID列表,最多20个

修改自己的聊天室成员信息

此接口可以修改聊天室成员信息,调用完这个接口后,开发者应该自己修改内存缓存的 NIMChatroomMember 对象。

此接口需要生成 NIMChatroomMemberInfoUpdateRequest 对象来完成请求。

NIMChatroomMemberInfoUpdateRequest中的 needNotify 参数可以设置成功修改信息后云信服务器是否推送一条修改的聊天室消息通知。

NIMChatroomMemberInfoUpdateRequest中的 notifyExt 参数可以设置推送的聊天室消息通知里带的自定义扩展字段。

- (void)updateMyChatroomMemberInfo:(NIMChatroomMemberInfoUpdateRequest *)request
                        completion:(nullable NIMChatroomHandler)completion;

聊天室权限管理

聊天室可以调整成员的类型,分固定成员和非固定成员两种,固定成员又分为创建者、管理员、普通成员和受限成员四种。禁言用户和拉黑用户都属于受限用户。

@protocol NIMChatroomManager <NSObject>
/**
 *  标记为聊天室管理员
 *
 *  @param request    更新请求
 *  @param completion 请求回调
 */
- (void)markMemberManager:(NIMChatroomMemberUpdateRequest *)request
              completion:(NIMChatroomHandler)completion;
@end
@protocol NIMChatroomManager <NSObject>
/**
 *  标记为聊天室普通成员
 *
 *  @param request    更新请求
 *  @param completion 请求回调
 */
- (void)markNormalMember:(NIMChatroomMemberUpdateRequest *)request
            completion:(NIMChatroomHandler)completion;
@end
@protocol NIMChatroomManager <NSObject>
/**
 *  更新用户聊天室黑名单状态
 *
 *  @param request    更新请求
 *  @param completion 请求回调
 */
- (void)updateMemberBlack:(NIMChatroomMemberUpdateRequest *)request
              completion:(NIMChatroomHandler)completion;
@end
@protocol NIMChatroomManager <NSObject>
/**
 *  更新用户聊天室静言状态
 *
 *  @param request    更新请求
 *  @param completion 请求回调
 */
- (void)updateMemberMute:(NIMChatroomMemberUpdateRequest *)request
            completion:(NIMChatroomHandler)completion;
@end

NIMChatroomMemberUpdateRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
userId NSString 用户 ID
enable BOOL 标记是否有效
notifyExt NSString 操作通知事件扩展

踢出成员

创建者或管理员可以将权限比自己低的用户踢出聊天室

@protocol NIMChatroomManager <NSObject>
/**
 *  将特定成员踢出聊天室
 *
 *  @param request    踢出请求
 *  @param completion 请求回调
 */
- (void)kickMember:(NIMChatroomMemberKickRequest *)request
        completion:(NIMChatroomHandler)completion;
@end

NIMChatroomMemberKickRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
userId NSString 用户 ID ,仅管理员可以踢人;如userId是管理员仅创建者可以踢
notifyExt NSString 被踢通知扩展字段

聊天室通知消息

在聊天室中所有的通知都以消息 NIMMessage 的形式展示,内部 messageObjectNIMNotificationTypeChatroom 类型的 NIMNotificationObject。上层开发在收到具体消息需要进行过滤和显示。目前支持的聊天室消息事件定义在 NIMChatroomEventType 枚举里,具体有:

解析聊天室通知消息的详细步骤:

  1. 判断消息是否为通知消息

    • 判断 NIMMessagemessageType 字段是否为 NIMMessageTypeNotification
  2. 判断通知消息是否为聊天室通知

    • NIMMessagemessageObject 字段强类型转换为 NIMNotificationObject
    • 判断转换后的 NIMNotificationObjectnotificationType 字段是否为 NIMNotificationTypeChatroom
  3. 解析聊天室通知的具体内容

    • NIMNotificationObjectcontent 字段强类型转换为 NIMChatroomNotificationContent
    • 查看转换后 NIMChatroomNotificationContent 的具体字段。

聊天室通知内容 NIMChatroomNotificationContent 的字段说明:

    - (void)enterChatroom:(NIMChatroomEnterRequest *)request completion:(nullable NIMChatroomEnterHandler)completion;

在这个请求中,请求对象 NIMChatroomEnterRequest 里可以定义一个通知扩展字段 roomNotifyExt。 定义后当用户进入聊天室,会触发用户进入聊天室的事件消息通知,此时,收到消息的其他聊天室成员就可以通过读取 NIMChatroomNotificationContentnotifyExt 字段来获取进入的用户定义的 roomNotifyExt 字段。

聊天室禁言

聊天室 SDK 允许群主或管理员将部分成员禁言。

聊天室禁言通知

聊天室禁言通知类型被同样定义在了 NIMChatroomEventType 中,分别为

具体解析步骤请参考之前小节 聊天室通知消息

聊天室禁言单个成员

聊天室提供禁言单个成员接口

@protocol NIMChatroomManager <NSObject>

/**
 *  更新用户聊天室静言状态
 *
 *  @param request    更新请求
 *  @param completion 请求回调
 */
- (void)updateMemberMute:(NIMChatroomMemberUpdateRequest *)request
              completion:(nullable NIMChatroomHandler)completion;

@end

其中禁言操作请求

/**
 *  聊天室成员标记请求
 */
@interface NIMChatroomMemberUpdateRequest : NSObject

/**
 *  聊天室ID
 */
@property (nonatomic,copy) NSString *roomId;

/**
 *  用户ID
 */
@property (nonatomic,copy) NSString *userId;

/**
 *  标记是否有效
 */
@property (nonatomic,assign) BOOL enable;

/**
 *  操作通知事件扩展
 */
@property (nullable,nonatomic,copy) NSString *notifyExt;

@end

聊天室临时禁言成员

与前一接口比较,增加可配置禁言时长 duration

@protocol NIMChatroomManager <NSObject>

/**
 *  更新用户聊天室临时禁言状态
 *
 *  @param request    更新请求
 *  @param duration   临时禁言时长,单位为秒
 *  @param completion 请求回调
 */
- (void)updateMemberTempMute:(NIMChatroomMemberUpdateRequest *)request
                    duration:(unsigned long long)duration
                  completion:(nullable NIMChatroomHandler)completion;

@end

聊天室队列

聊天室提供队列服务,供先入先出的排队场景使用。

获取聊天室队列

@protocol NIMChatroomManager <NSObject>
/**
 *  获取聊天室队列
 *
 *  @param roomId     聊天室ID
 *  @param completion 请求回调
 */
- (void)fetchChatroomQueue:(NSString *)roomId
                completion:(nullable NIMChatroomQueueInfoHandler)completion;
@end

示例

NSString *roomId = @"your_room_id";
[[NIMSDK sharedSDK].chatroomManager fetchChatroomQueue:roomId completion:^(NSError * _Nullable error, NSArray<NSDictionary<NSString *,NSString *> *> * _Nullable info) {
    if (!error)
    {
        //deal with info
    }
    else
    {
        //deal with error
    }
}];

加入或者更新队列元素

@protocol NIMChatroomManager <NSObject>
/**
 *  加入或者更新聊天室通用队列元素,权限由 NIMChatroom 的 queueModificationLevel 决定
 *
 *  @param request    聊天室队列请求
 *  @param completion 请求回调
 */
- (void)updateChatroomQueueObject:(NIMChatroomQueueUpdateRequest *)request
                       completion:(nullable NIMChatroomHandler)completion;
@end

NIMChatroomQueueUpdateRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
key NSString 更新元素的 Key 值,如果 key 在队列中存在则更新,不存在则放到队列尾部 ,长度限制为 32 字节
value NSString 更新元素的 Value 值,长度限制为 4096 字节
transient BOOL 当提交这个新元素到聊天室队列的用户从聊天室掉线或退出的时候,是否需要删除这个元素,默认为 false 不删除。当设置为 YES 时,掉线或退出后,聊天室会发出队列批量元素变更通知,详见 队列变更通知章节

示例

NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc] init];
request.roomId = @"your_room_id";
request.key    = @"key";
request.value  = @"value";
request.transient = YES;
[[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) {
    if (!error)
    {
        //deal with success
    }
    else
    {
        //deal with error
    }
}];

移除聊天室队列元素

@protocol NIMChatroomManager <NSObject>
/**
 *  移除聊天室队列元素,权限由 NIMChatroom 的 queueModificationLevel 决定
 *
 *  @param request    拉取请求
 *  @param completion 请求回调
 */
- (void)removeChatroomQueueObject:(NIMChatroomQueueRemoveRequest *)request
                       completion:(nullable NIMChatroomQueueRemoveHandler)completion;
@end

NIMChatroomQueueRemoveRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
key NSString 拉去元素的Key值,如果要拉取第一个元素,则传空

示例

NIMChatroomQueueRemoveRequest *request = [[NIMChatroomQueueRemoveRequest alloc] init];
request.roomId = @"your_room_id";
request.key    = @"key";
[[NIMSDK sharedSDK].chatroomManager removeChatroomQueueObject:request completion:^(NSError * _Nullable error, NSDictionary<NSString *,NSString *> * _Nullable element) {
    if (!error)
    {
        //deal with removed element
    }
    else
    {
        //deal with error
    }
}];

批量更新队列元素

@protocol NIMChatroomManager <NSObject>
/**
 *  批量更新聊天室通用队列元素,权限由 NIMChatroom 的 queueModificationLevel 决定
 *
 *  @param request    聊天室队列批量请求
 *  @param completion 请求回调
 */
- (void)batchUpdateChatroomQueueObject:(NIMChatroomQueueBatchUpdateRequest *)request
                       completion:(nullable NIMChatroomQueueBatchUpdateHandler)completion;
@end

NIMChatroomQueueBatchUpdateRequest 参数列表

参数 类型 说明
roomId NSString 聊天室 ID
elements NSDictionary 批量更新元素的key-value对,key/value分别是elementKey和elementValue(elementKey限制128字节,elementValue限制4096字节),一次最多更新100个
needNotify BOOL 是否需要发送广播通知
notifyExt NSString 通知中的自定义字段,长度限制 2048 字节

示例

NIMChatroomQueueBatchUpdateRequest *request = [[NIMChatroomQueueBatchUpdateRequest alloc] init];
request.roomId = @"your_room_id";
request.needNotify = YES;
request.notifyExt = @"你收到一个通知";
request.elements = dict;
[[NIMSDK sharedSDK].chatroomManager batchUpdateChatroomQueueObject:request completion:^(NSError * _Nullable error, NSArray<NSString *> * _Nullable elements) {
    if (!error)
    {
        //deal with success
    }
    else
    {
        //deal with error
    }
}];

删除聊天室队列

@protocol NIMChatroomManager <NSObject>
/**
 *  删除聊天室队列,权限由 NIMChatroom 的 queueModificationLevel 决定
 *
 *  @param roomId     聊天室ID
 *  @param completion 请求回调
 */
- (void)dropChatroomQueue:(NSString *)roomId
               completion:(nullable NIMChatroomHandler)completion;
@end

示例

NSString *roomId = @"your_room_id";
[[NIMSDK sharedSDK].chatroomManager dropChatroomQueue:roomId completion:^(NSError * _Nullable error) {
    if (!error)
    {
        //deal with success
    }
    else
    {
        //deal with error
    }
}];

修改聊天室队列的用户修改等级

默认情况下,所有用户都可以调用接口修改队列内容,在某些场景下修改队列需要一定的权限,可以通过修改聊天室配置接口实现

NIMChatroomUpdateRequest *request = [[NIMChatroomUpdateRequest alloc] init];
request.roomId = @"your_room_id";
request.updateInfo = @{@(NIMChatroomUpdateTagQueueModificationLevel) : @(NIMChatroomQueueModificationLevelManager)};
[[NIMSDK sharedSDK].chatroomManager updateChatroomInfo:request completion:^(NSError * _Nullable error) {
    if (!error)
    {
        //deal with success
    }
    else
    {
        //deal with error
    }
}];

队列变更通知

如果用户在这个聊天室里,那么在聊天室队列发生变动时,会收到聊天室变动的消息通知

聊天室变更的通知本质上是一条消息,类型为 NIMMessageTypeNotification, content 为 NIMChatroomNotificationContent

因为是一条通知消息,所以聊天室队列变更通知可以被过滤,过滤的接口为

@protocol NIMSDKConfigDelegate <NSObject>
/**
 *  是否需要忽略某个通知
 *
 *  @param notification 通知对象
 *
 *  @return 是否忽略
 */
- (BOOL)shouldIgnoreNotification:(NIMNotificationObject *)notification;
@end

示例

...
[NIMSDKConfig sharedConfig].delegate = self;
...

- (BOOL)shouldIgnoreNotification:(NIMNotificationObject *)notification
{
    if (notification.notificationType == NIMNotificationTypeChatroom)
    {
        NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notification.content;
        if (content.eventType == NIMChatroomEventTypeQueueChange || content.eventType == NIMChatroomEventTypeQueueBatchChange)
        {
            // ignore only if event is queue changed
            return YES;
        }
    }
    return NO;
}

NIMChatroomNotificationContenteventType 事件中,有两种事件属于聊天室变更事件分别为

- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages
{
    for (NIMMessage *message in messages)
    {
        if (message.messageType == NIMMessageTypeNotification)
        {
            if (notification.notificationType == NIMNotificationTypeChatroom)
            {
                NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notification.content;
                NSDictionary *info = content.ext;
                if (content.eventType == NIMChatroomEventTypeQueueChange)
                {
                    //change type
                    //NIMChatroomQueueChangeTypeOffer, NIMChatroomQueueChangeTypePoll, NIMChatroomQueueChangeTypeDrop
                    NIMChatroomQueueChangeType changeType = [[info objectForKey:NIMChatroomEventInfoQueueChangeTypeKey] integerValue];
                    //key
                    NSString *key = [info objectForKey:NIMChatroomEventInfoQueueChangeItemKey];
                    //value
                    NSString *value = [info objectForKey:NIMChatroomEventInfoQueueChangeItemValueKey];
                    //deal with key and value
                }
                if (content.eventType == NIMChatroomEventTypeQueueBatchChange)
                {
                    //change type
                    //NIMChatroomQueueBatchChangeTypePartClear
                    NIMChatroomQueueChangeType changeType = [[info objectForKey:NIMChatroomEventInfoQueueChangeTypeKey] integerValue];
                    NSDictionary *batch = [info objectForKey:NIMChatroomEventInfoQueueChangeItemsKey];
                    for (NSString *key in batch)
                    {
                        NSString *value = [batch objectForKey:key];
                        //deal with key and value
                    }
                }
            }
        }
    }
}