群消息管理
更新时间: 2024/08/08 11:10:16
网易云信 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];
群消息强制推送
云信 NIM SDK 支持对于群消息的强制推送功能。
当发送方设置了某条群消息的强制推送,群消息接收者即使设置了该群的群消息免打扰或全局的免打扰(具体参考 全局推送免打扰),仍能接收到该条群消息的推送。
发送方在发送消息时,通过消息体的指定成员推送选项字段 NIMMessage - apnsMemberOption
来实现,具体参数说明如下:
参数 | 类型 | 说明 |
---|---|---|
forcePush | BOOL | 是否强制推送(仅针对 userIds 中的账户),默认为 NO,不强制推送。若设置为 YES,表示即使设置了该群的群消息免打扰或全局的免打扰,仍能够推送当前推送内容给相应用户 |
userIds | NSArray< NSString * > * | 需要强制推送的用户列表,如果设置为 nil,则推送给当前会话内的所有用户;不为 nil 时,最多可传入 100 个用户账号 |
apnsContent | NSString * | 强制推送文案,最大长度 500 字符,推送给指定用户的特定推送文案,如果设置为 nil,则使用消息本身的推送文案(NIMMessage#apnsContent ) |
- 对于
userIds
中的用户,推送文案使用NIMMessage#apnsMemberOption.apnsContent
;对于不在userIds
中的用户,推送文案使用NIMMessage#apnsContent
。 userIds
中的账户的推送文案显示形式又分两种情况:- 当
forcePush
为 YES 时,推送文案中不会包含发送者前缀(nick),直接为NIMMessage#apnsMemberOption.apnsContent
。 - 当
forcePush
为 NO 时,推送文案中目前包含了发送者的前缀(nick),即为fromNick:apnsContent
。
- 当
示例代码如下:
NIMMessageApnsMemberOption * messageApnsMemberoption = [[NIMMessageApnsMemberOption alloc] init];
messageApnsMemberoption.forcePush = YES;
messageApnsMemberoption.userIds = @[@"userId_1", @"userId_2"];
messageApnsMemberoption.apnsContent = @"Your APNs content here.";
textMessage.apnsMemberOption = messageApnsMemberoption;
群消息已读回执
群聊消息已读回执相关接口以及已读/未读数查询相关操作,请参见群聊消息已读回执。