iOS

群消息管理

更新时间: 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 群内禁言/解禁

群通知消息解析步骤

  1. 通过 NIMMessagemessageType 判断是否为通知消息。
  2. NIMMessage 中的 messageObject 字段,强类型转换为 NIMNotificationObject
  3. 解析 NIMNotificationObject 中的 content 字段,得到父类 NIMNotificationContent
  4. 通过 NIMNotificationContent 中的 notificationType 字段,判断是否为 NIMNotificationTypeTeam
  5. 将父类 NIMNotificationContent 强类型转化为 NIMTeamNotificationContent
  6. 群组通知的具体类型可以通过 NIMTeamNotificationContentoperationType 解析,具体类型参见上方表格。
  7. 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 接口,并传入通知扩展参数。调用后会触发用户被踢出群组的事件消息通知,此时,收到消息的其他群成员就可以通过读取 NIMTeamNotificationContentnotifyExt 字段来获取踢出时定义的扩展字段。
  • 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;

群消息已读回执

群聊消息已读回执相关接口以及已读/未读数查询相关操作,请参见群聊消息已读回执

此文档是否对你有帮助?
有帮助
去反馈
  • 群消息收发
  • 群组通知消息
  • 群通知消息解析步骤
  • 群消息免打扰
  • 设置免打扰
  • 查询免打扰状态
  • 群消息强制推送
  • 群消息已读回执