美文网首页
融云 SDK 如何实现群组操作

融云 SDK 如何实现群组操作

作者: _一叶孤帆 | 来源:发表于2020-10-26 19:04 被阅读0次

    融云 SDK 如何实现群组操作

    背景

    在集成融云 SDK 后,需要实现群组操作的消息通知。包括:

    • 群创建、销毁通知
    • 群公告通知
    • 群人员加入、退出通知
    • 群昵称修改通知
    • ...

    融云现有的 SDK 仅提供了 RCGroupNotificationMessage,内部封装了几种简单的类型操作,且扩展性不强,无法完成现有的操作。

    解决方案:

    使用自定义消息重新来构建群组通知消息。

    参考 sealtlak 中的 RCDGroupNotificationMessage,也是单独对群组操作内容,重新进行了封装处理。

    /*!
     群组通知消息
     */
    @interface RCDGroupNotificationMessage : RCMessageContent
    
    //操作名
    @property (nonatomic, copy) NSString *operation;
    
    //操作人
    @property (nonatomic, copy) NSString *operatorUserId;
    
    //操作对象
    @property (nonatomic, strong) NSArray<NSString *> *targetUserIds;
    
    //内容
    @property (nonatomic, copy) NSString *message;
    
    //获取摘要
    - (NSString *)getDigest:(NSString *)groupId;
    @end
    

    这个类预定义了下面几种操作类型消息,具体内容可参考名字定义

    extern NSString *const RCDGroupCreate;
    extern NSString *const RCDGroupMemberAdd;
    extern NSString *const RCDGroupMemberQuit;
    extern NSString *const RCDGroupMemberKicked;
    extern NSString *const RCDGroupRename;
    extern NSString *const RCDGroupBulletin;
    extern NSString *const RCDGroupOwnerTransfer;
    extern NSString *const RCDGroupDismiss;
    extern NSString *const RCDGroupMemberJoin;
    extern NSString *const RCDGroupMemberManagerSet;
    extern NSString *const RCDGroupMemberManagerRemove;
    extern NSString *const RCDGroupMemberProtectionOpen;
    extern NSString *const RCDGroupMemberProtectionClose;
    

    .m 的实现还是按照自定义消息的实现进行处理。唯一有区别的是在获取摘要的方法,在这个方法中对消息内容进行了处理,根据操作名的不同,来对显示的内容进行各种适配。此处根据根据自己的业务进行修改。

    - (NSString *)getDigest:(NSString *)groupId {
    
        NSString *content;
    
        //获取用户信息
        NSString *operationName = [self getDisplayNames:@[ self.operatorUserId?self.operatorUserId:@""] groupId:groupId];
        NSString *targetNames = [self getDisplayNames:self.targetUserIds groupId:groupId];
    
        //是否当前用户操作
        BOOL isMeOperate = NO;
        if ([self.operatorUserId isEqualToString:[RCIMClient sharedRCIMClient].currentUserInfo.userId]) {
            isMeOperate = YES;
        }
    
        //判断操作类型
        if ([self.operation isEqualToString:RCDGroupCreate]) {
            content =
                [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveCreated" : @"GroupCreated",
                                                                      @"RongCloudKit", nil),
                                           operationName];
        } else if ([self.operation isEqualToString:RCDGroupMemberAdd]) {
            if (self.targetUserIds.count == 1 && [self.targetUserIds containsObject:self.operatorUserId]) {
                content = [NSString
                    stringWithFormat:NSLocalizedStringFromTable(@"GroupJoin", @"RongCloudKit", nil), operationName];
            } else {
                content = [NSString
                    stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveInvited" : @"GroupInvited",
                                                                @"RongCloudKit", nil),
                                     operationName, targetNames];
            }
        } else if ([self.operation isEqualToString:RCDGroupMemberJoin]) {
            content =
                [NSString stringWithFormat:NSLocalizedStringFromTable(@"GroupJoin", @"RongCloudKit", nil), operationName];
        } else if ([self.operation isEqualToString:RCDGroupMemberQuit]) {
            content = [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveQuit" : @"GroupQuit",
                                                                            @"RongCloudKit", nil),
                                                 operationName];
        } else if ([self.operation isEqualToString:RCDGroupMemberKicked]) {
            content =
                [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveRemoved" : @"GroupRemoved",
                                                                      @"RongCloudKit", nil),
                                           operationName, targetNames];
        } else if ([self.operation isEqualToString:RCDGroupRename]) {
            content = [NSString stringWithFormat:NSLocalizedStringFromTable(@"GroupChanged", @"RongCloudKit", nil),
                                                 operationName, self.targetGroupName];
        } else if ([self.operation isEqualToString:RCDGroupDismiss]) {
            content =
                [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveDismiss" : @"GroupDismiss",
                                                                      @"RongCloudKit", nil),
                                           operationName];
        } else if ([self.operation isEqualToString:RCDGroupOwnerTransfer]) {
            content = [NSString stringWithFormat:RCDLocalizedString(@"GroupHasNewOwner"), targetNames];
        } else if ([self.operation isEqualToString:RCDGroupMemberManagerSet]) {
            content = [NSString stringWithFormat:RCDLocalizedString(@"GroupSetManagerMessage"), targetNames];
        } else if ([self.operation isEqualToString:RCDGroupMemberProtectionOpen]) {
            content = RCDLocalizedString(@"openMemberProtection");
        } else if ([self.operation isEqualToString:RCDGroupMemberProtectionClose]) {
            content = [NSString stringWithFormat:RCDLocalizedString(@"closeMemberProtection"), operationName];
        } else {
            content = NSLocalizedStringFromTable(@"unknown_message_cell_tip", @"RongCloudKit", nil);
        }
        return content;
    }
    

    此外,还有一个获取名称的方法,用来维护用户信息。

    - (NSString *)getDisplayNames:(NSArray<NSString *> *)userIds groupId:(NSString *)groupId 
    

    相关文章

      网友评论

          本文标题:融云 SDK 如何实现群组操作

          本文链接:https://www.haomeiwen.com/subject/jgkzmktx.html