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

群消息已读回执

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

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