群消息管理
更新时间: 2023/09/13 18:43:29
网易云信 NIM SDK 支持群组中的消息收发,群组相关操作的通知消息的接收,以及群消息通知模式的设置。
群消息收发
群组中支持收发多种消息类型。
在创建/加入群组后,用户发送和接收消息的接口与单聊消息收发相同,区别在于会话类型(sessionType
)的配置,选择 NIMSessionTypeTeam
即可。
NIMSessionType
参数说明
枚举常量 | 说明 |
---|---|
NIMSessionTypeP2P | 点对点单聊,P2P |
NIMSessionTypeSuperTeam | 超大群 |
NIMSessionTypeTeam | 高级群 |
具体消息收发的流程,请参见消息收发。
群组通知消息
NIM SDK 内置支持的会话消息类型(NIMMessageType
)中的通知消息(NIMMessageTypeNotification
)主要用于群组、聊天室和超大群的事件通知,由服务端下发,客户端无法发送事件通知消息。
群通知消息和其他消息一样,可从 NIMConversationManager
提供的消息查询接口中获取。
目前支持触发群通知消息的事件如下:
NIMTeamOperationType 枚举 |
事件说明 |
---|---|
NIMTeamOperationTypeInvite |
邀请成员入群(无需被邀请人同意的模式) |
NIMTeamOperationTypeAcceptInvitation |
接受邀请后入群(需要被邀请人同意的模式) |
NIMTeamOperationTypeKick |
被踢出群 |
NIMTeamOperationTypeLeave |
主动退出群 |
NIMTeamOperationTypeUpdate |
群信息更新 |
NIMTeamOperationTypeDismiss |
解散群 |
NIMTeamOperationTypeApplyPass |
申请加入群成功 |
NIMTeamOperationTypeTransferOwner |
转让群主 |
NIMTeamOperationTypeAddManager |
添加管理员 |
NIMTeamOperationTypeRemoveManager |
移除管理员 |
NIMTeamOperationTypeMute |
群内禁言/解禁 |
群通知消息解析步骤
- 通过
NIMMessage
的messageType
判断是否为通知消息。 - 将
NIMMessage
中的messageObject
字段,强类型转换为NIMNotificationObject
。 - 解析
NIMNotificationObject
中的content
字段,得到父类NIMNotificationContent
。 - 通过
NIMNotificationContent
中的notificationType
字段,判断是否为NIMNotificationTypeTeam
。 - 将父类
NIMNotificationContent
强类型转化为NIMTeamNotificationContent
。 - 群组通知的具体类型可以通过
NIMTeamNotificationContent
的operationType
解析,具体类型参见上方表格。 - SDK 在收到群通知之后,会对本地缓存的群组相关信息做出对应的修改,然后触发与修改相对应的委托事件回调。
群通知消息解析过程示例如下:
//通过回调收到 NIMMessage,变量名为 message
NIMNotificationObject *object = message.messageObject;
if (message.messageType == NIMMessageTypeNotification && object.notificationType == NIMNotificationTypeTeam)
{
//群通知消息解析
NIMTeamNotificationContent *content = (NIMTeamNotificationContent*)object.content;
//对群通知的具体内容 NIMTeamNotificationContent 进行业务操作
...
}
群组通知内容 NIMTeamNotificationContent 的字段说明:
operationType
: 群组通知事件类型,表示具体属于哪一种群组通知,通知种类由NIMTeamOperationType
枚举定义。sourceID
: 事件的操作者 ID ,表示是谁主动执行了该操作。targetIDs
: 事件的被操作者 ID 列表,表示该操作的承受者。notifyExt
: 通知的扩展字段,由每个触发通知的操作接口定义。目前只能由服务器的操作接口定义该字段。例如:群组踢出用户,可以调用服务器 HTTP 接口,并传入通知扩展参数。调用后会触发用户被踢出群组的事件消息通知,此时,收到消息的其他群成员就可以通过读取NIMTeamNotificationContent
的notifyExt
字段来获取踢出时定义的扩展字段。attachment
: 有些通知比较复杂,需要一些额外信息来辅助上层显示,目前有额外信息的群通知类型为:- 群更新通知
NIMTeamOperationTypeUpdate
:额外信息被封装为NIMUpdateTeamInfoAttachment
类型。群整体禁言属于此类型。 - 群禁言通知
NIMTeamOperationTypeMute
:额外信息被封装为NIMMuteTeamMemberAttachment
类型。
- 群更新通知
针对群更新通知 NIMTeamOperationTypeUpdate
,需要判断 NIMUpdateTeamInfoAttachment
内的具体内容,来判断具体更新的是哪个群信息,可参见如下示例代码:
case NIMTeamOperationTypeUpdate:
{
id attachment = [content attachment];
if ([attachment isKindOfClass:[NIMUpdateTeamInfoAttachment class]]) {
NIMUpdateTeamInfoAttachment *teamAttachment = (NIMUpdateTeamInfoAttachment *)attachment;
formatedMessage = [NSString stringWithFormat:@"%@更新了%@信息".nim_localized,source,teamName];
//如果只是单个项目项被修改则显示具体的修改项
if ([teamAttachment.values count] == 1) {
NIMTeamUpdateTag tag = [[[teamAttachment.values allKeys] firstObject] integerValue];
switch (tag) {
case NIMTeamUpdateTagName:
formatedMessage = [NSString stringWithFormat:@"%@更新了%@名称".nim_localized,source,teamName];
break;
case NIMTeamUpdateTagIntro:
formatedMessage = [NSString stringWithFormat:@"%@更新了%@介绍".nim_localized,source,teamName];
break;
case NIMTeamUpdateTagAnouncement:
formatedMessage = [NSString stringWithFormat:@"%@更新了%@公告".nim_localized,source,teamName];
break;
case NIMTeamUpdateTagJoinMode:
formatedMessage = [NSString stringWithFormat:@"%@更新了%@验证方式".nim_localized,source,teamName];
break;
case NIMTeamUpdateTagAvatar:
formatedMessage = [NSString stringWithFormat:@"%@更新了%@头像".nim_localized,source,teamName];
break;
case NIMTeamUpdateTagInviteMode:
formatedMessage = [NSString stringWithFormat:@"%@更新了邀请他人权限".nim_localized,source];
break;
case NIMTeamUpdateTagBeInviteMode:
formatedMessage = [NSString stringWithFormat:@"%@更新了被邀请人身份验证权限".nim_localized,source];
break;
case NIMTeamUpdateTagUpdateInfoMode:
formatedMessage = [NSString stringWithFormat:@"%@更新了群资料修改权限".nim_localized,source];
break;
case NIMTeamUpdateTagMuteMode:{
NSString *muteState = teamAttachment.values.allValues.firstObject;
BOOL muted = [muteState isEqualToString:@"0"] ? NO : YES;
formatedMessage = muted? [NSString stringWithFormat:@"%@设置了群全体禁言".nim_localized,source]: [NSString stringWithFormat:@"%@取消了全体禁言".nim_localized,source];
break;
}
default:
break;
}
}
}
if (formatedMessage == nil){
formatedMessage = [NSString stringWithFormat:@"%@更新了%@信息".nim_localized,source,teamName];
}
}
break;
群消息免打扰
SDK 支持对群消息通知提醒模式的配置,上层可以通过设置该选项以影响群消息的提醒行为。
群消息通知提醒模式(NIMTeamNotifyState
)分为:
- NIMTeamNotifyStateAll:全部提醒(默认)
- NIMTeamNotifyStateOnlyManager:仅群主/管理员消息提醒
- NIMTeamNotifyStateNone:全部不提醒
以上通知提醒指的是云信体系内的推送与消息提醒。
群消息的提醒模式不影响群消息的接收和未读数的变化。若将提醒模式设置为全部不提醒,仍然能接收到群消息接收,未读数仍会变化。
设置免打扰
通过调用 updateNotifyState:inTeam:completion:
来修改群通知状态。
参数说明:
参数 | 说明 |
---|---|
teamId | 群ID |
state | 群通知状态 NIMTeamNotifyStateAll :全部提醒(默认) NIMTeamNotifyStateOnlyManager:仅群主/管理员消息提醒 NIMTeamNotifyStateNone:全部不提醒 |
completion | 完成后的回调 |
示例代码:
/// 群消息接受状态
NIMTeamNotifyState notifyState = NIMTeamNotifyStateNone;
/// teamId 群组ID
NSString *teamId = @"6271272396";
/// completion 完成后的回调
NIMTeamHandler completion = ^(NSError * __nullable error)
{
if (error == nil) {
/// 修改群通知状态 成功
NSLog(@"[Update notify state to %ld succeed.]", notifyState);
/// your code ...
} else {
/// 修改群通知状态 失败
NSLog(@"[NSError message: %@]", error);
}
};
/// 修改群通知状态
[[[NIMSDK sharedSDK] teamManager] updateNotifyState:notifyState
inTeam:teamId
completion:completion];
查询免打扰状态
可通过调用 notifyStateForNewMsg:
方法获取对应群的消息通知提醒模式。
示例代码
/// teamId 群组ID
NSString *teamId = @"6271272396";
/// 获取当前群通知状态
NIMTeamNotifyState notifyState = [[[NIMSDK sharedSDK] teamManager] notifyStateForNewMsg:teamId];
群消息已读回执
群聊消息已读回执相关接口以及已读/未读数查询相关操作,请参见群聊消息已读回执。
API 参考
API |
说明 |
---|---|
updateNotifyState |
修改群通知状态 |
notifyStateForNewMsg |
查询群消息通知提醒模式 |
refreshTeamMessageReceipts |
刷新群组消息已读、未读的数量信息 |
sendTeamMessageReceipts |
(群消息接收方)标记群组消息已读 |