iOS

群消息管理

更新时间: 2024/03/14 17:08:36

网易云信 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];

群消息已读回执

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

API 参考

API
说明
updateNotifyState 修改群通知状态
notifyStateForNewMsg 查询群消息通知提醒模式
refreshTeamMessageReceipts 刷新群组消息已读、未读的数量信息
sendTeamMessageReceipts (群消息接收方)标记群组消息已读
此文档是否对你有帮助?
有帮助
去反馈
  • 群消息收发
  • 群组通知消息
  • 群通知消息解析步骤
  • 群消息免打扰
  • 设置免打扰
  • 查询免打扰状态
  • 群消息已读回执
  • API 参考