即时通信 IM Android&iOS&Windows&Mac(群成员管理)

这篇说说腾讯云IM SDK的群成员管理功能,包括拉取成员列表、禁言、踢人、设置管理员及转让群主等操作,并说明各接口的适用版本、权限要求及旗舰版限制。 拉取成员列表:支持分页拉取,直播群仅限旗舰版拉取最近1000人,后台数据更新间隔40秒。 禁言:支持禁言指定成员或全员,群主可禁言管理员,管理员可禁言普通成员。 踢人:基础接口支持所有群类型,高级接口(7.2+)可设置禁入时长,直播群踢人需旗舰版。

相关产品
即时通信 IM 产品页,含版本规格、价格与购买入口。

一、功能描述

群成员管理指的是对成员进行列表拉取、禁言、踢人、授权、转让群主等操作。

二、拉取群成员列表

你可以调用 getGroupMemberList (Java / Swift / Objective-C / C++) 拉取指定群的群成员列表。

该列表中包含了各个群成员的资料信息,例如用户 ID(userID)、群名片(nameCard)、头像(faceUrl)、昵称(nickName)、进群时间(joinTime)、在线状态(isOnline)等信息。

注意:说明:

注意:在线状态(isOnline)信息需要开通旗舰版支持。

直播群由于人数众多,不提供拉取全量成员列表的功能。旗舰版客户可拉取最近进群的 1000 位群成员。群成员列表后台数据更新间隔是 40s。

此功能需要在 IM 控制台开启开关,登录 即时通信 IM 控制台 修改相关配置,配置页面如下:

getGroupMemberList 接口参数详细说明如下。

三、过滤参数 filter

类型为 V2TIMGroupMemberFilter,表示拉取特定角色列表:

过滤器 过滤类型
V2TIM_GROUP_MEMBER_FILTER_ALL 拉取所有群成员的信息列表。
V2TIM_GROUP_MEMBER_FILTER_OWNER 仅拉取群主的信息列表。
V2TIM_GROUP_MEMBER_FILTER_ADMIN 仅拉取群管理员的信息列表。
V2TIM_GROUP_MEMBER_FILTER_COMMON 仅拉取普通群成员的信息列表。

对于直播群而言,除了将 filter 设置为 V2TIMGroupMemberFilter 以外,还可以设置为自定义群成员标记,从而筛选出指定标记的群成员。详情参考下文的 标记群成员。

四、分页参数 nextSeq

很多情况下,用户界面上并不需要展示全部的群成员信息,只需展示群成员列表的第一页即可。等用户单击“下一页”或在列表页上拉刷新时,才需要拉取更多的群成员。分页拉取步骤为:

1. 首次调用 getGroupMemberList 时,指定参数 nextSeq 为 0(表示从头开始拉取群成员列表),一次拉取 500 个群成员对象。

2. 首次拉取群成员列表成功后,getGroupMemberList 的回调结果 V2TIMGroupMemberInfoResult 中会包含 nextSeq(下次分页拉取的字段):

·如果 nextSeq 等于 0,表示已经拉取了全部的群成员。

·如果 nextSeq 大于 0,表示还有更多的群成员可以拉取。

3. 当用户继续上拉刷新群成员时,如果还有更多的群成员可以拉取,可以继续调用 getGroupMemberList 接口,并传入新一轮的 nextSeq 参数(nextSeq 数值来自上一次拉取返回的 V2TIMGroupMemberInfoResult 对象)。

4. 重复执行【步骤 3】直至 nextSeq 等于 0,拉取结束。

示例代码如下:

JavaSwiftObjective-CC++{ … long nextSeq = 0; getGroupMemberList(nextSeq); …}public void getGroupMemberList(long nextSeq) { // 通过 filter 参数指定拉取全部成员 int filterRole = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_ALL; V2TIMManager.getGroupManager().getGroupMemberList("testGroup", filterRole, nextSeq, new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() { @Override public void onError(int code, String desc) { // 拉取失败 } @Override public void onSuccess(V2TIMGroupMemberInfoResult groupMemberInfoResult) { if (groupMemberInfoResult.getNextSeq() != 0) { // 继续分页拉取 getGroupMemberList(groupMemberInfoResult.getNextSeq()); … } else { // 拉取结束 } } });}func getGroupMemberList(seq: UInt32) { // 通过 filter 参数指定拉取全部成员 V2TIMManager.shared.getGroupMemberList(groupID: "groupA", filter: .V2TIM_GROUP_MEMBER_FILTER_ALL, nextSeq: UInt(seq), succ: { nextSeq, memberList in if nextSeq != 0 { // 继续分页拉取 self.getGroupMemberList(seq: UInt32(nextSeq)) //… } else { // 拉取结束 } }, fail: { code, desc in // 拉取失败 })}- (void)getGroupMemberList:(uint32_t)seq { // 通过 filter 参数指定拉取全部成员 [[V2TIMManager sharedInstance] getGroupMemberList:@"groupA" filter:V2TIM_GROUP_MEMBER_FILTER_ALL nextSeq:seq succ:^(uint64_t nextSeq, NSArray<V2TIMGroupMemberFullInfo *> *memberList) { if (nextSeq != 0) { // 继续分页拉取 [self getGroupMemberList:nextSeq]; //… } else { // 拉取结束 } } fail:^(int code, NSString *desc) { // 拉取失败 }];}template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString groupID = "testGroup";// 通过 filter 参数指定拉取全部成员uint32_t filter = V2TIMGroupMemberFilter::V2TIM_GROUP_MEMBER_FILTER_ALL;uint64_t nextSeq = 0;auto callback = new ValueCallback<V2TIMGroupMemberInfoResult>{};callback->SetCallback( [=](const V2TIMGroupMemberInfoResult& groupMemberInfoResult) { if (groupMemberInfoResult.nextSequence != 0) { // 继续分页拉取 … } delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 拉取失败 delete callback; });V2TIMManager::GetInstance()->GetGroupManager()->GetGroupMemberList(groupID, filter, nextSeq, callback);

五、标记群成员

群主可以调用 markGroupMemberList (Java / Swift / Objective-C/ C++) 标记、取消标记直播群成员。规则如下:

·只有直播群和社群支持此功能,只有群主有权限操作。

·每个直播群最多只能添加 10 个自定义标记。

·通过 IM SDK 设置自定义标记类型为 uint32_t,必须大于等于 1000。

·每次最多标记 100 名群成员。

·被标记的群成员需要在线。当成员退群、掉线时标记信息会被清除。可以通过第三方回调在该成员进群、上线时重新设置标记。

群成员被标记后,可以调用 getGroupMemberList,设置 filter 为所设置的自定义标记值,过滤出指定的群成员列表。

注意:说明:

六、禁言指定群成员

群主或管理员可以调用 muteGroupMember (Java / Swift / Objective-C / C++),设置 muteTime (单位为秒) 禁言某一个群成员。例如设置 muteTime 为 120,表示禁言该成员持续 120 秒。
某群成员被禁言后,发送消息会失败,并接收到相应的错误码。如果想取消该成员的禁言,可以将 muteTime 设置为 0。

禁言时间戳存储于群成员信息的 muteUntil(Java / Swift / Objective-C / C++) 字段中。注意 muteUntil 的含义是禁言该成员直到某个时刻为止。

群成员被禁言后,全员(包括被禁言的群成员)都会收到 onMemberInfoChanged (Java / Swift / Objective-C / C++) 事件回调。

注意:说明:

注意:群主可以禁言/取消禁言管理员和普通群成员。管理员可以禁言/取消禁言普通群成员。

七、禁言整个群

群主或管理员也可以通过 muteAllGroupMembers (Java / Swift / Objective-C / C++) 接口对整个群进行禁言,将 isMute 字段设置为 true/YES 即可,解除禁言则设置为 false/NO。全群禁言没有时间限制。

全员禁言后触发 onAllGroupMembersMuted (Java / Swift / Objective-C / C++) 事件回调。

该通知默认是关闭的,如需开启此通知,你可以登录 即时通信 IM 控制台 修改相关配置,配置页面路径为:

注意:说明:

注意:只有群主能将管理员禁言。

示例代码如下:

JavaSwiftObjective-CC++// 禁言群成员 userB 1分钟V2TIMManager.getGroupManager().muteGroupMember("groupA", "userB", 60, new V2TIMCallback() { @Override public void onSuccess() { // 禁言群成员成功 } @Override public void onError(int code, String desc) { // 禁言群成员失败 }});// 全员禁言V2TIMManager.getGroupManager().muteAllGroupMembers("groupA", true, new V2TIMCallback() { @Override public void onSuccess() { // 全员禁言成功 } @Override public void onError(int code, String desc) { // 全员禁言失败 }});V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() { @Override public void onMemberInfoChanged(String groupID, List<V2TIMGroupMemberChangeInfo> v2TIMGroupMemberChangeInfoList) { // 禁言群成员监听 for (V2TIMGroupMemberChangeInfo memberChangeInfo : v2TIMGroupMemberChangeInfoList) { // 被禁言用户 ID String userID = memberChangeInfo.getUserID(); // 禁言时间 long muteTime = memberChangeInfo.getMuteTime(); } } @Override public void onAllGroupMembersMuted(String groupID, boolean isMute) { // 全员禁言监听 }})// 禁言群成员 user1 1分钟V2TIMManager.shared.muteGroupMember(groupID: "groupA", memberUserID: "user1", muteTimeSeconds: 60) { print( "muteGroupMember succ")} fail: { code, desc in print( "muteGroupMember fail, \\(code), \\(desc)")}// 全员禁言V2TIMManager.shared.muteAllGroupMembers(groupID: "groupA", isMute: true) { print( "muteAllGroupMembers succ")} fail: { code, desc in print( "muteAllGroupMembers fail, \\(code), \\(desc)")}V2TIMManager.shared.addGroupListener(listener: self)func onMemberInfoChanged(groupID: String, changeInfoList: Array<V2TIMGroupMemberChangeInfo>) { print( "groupID:\\(groupID), changeInfoList:\\(changeInfoList)")}func onAllGroupMembersMuted(groupID: String, isMute: Bool) { print( "groupID:\\(groupID), isMute:\\(isMute)")}// 禁言群成员 user1 1分钟[[V2TIMManager sharedInstance] muteGroupMember:@"groupA" member:@"user1" muteTime:60 succ:^{ // 禁言群成员成功} fail:^(int code, NSString *desc) { // 禁言群成员失败}];// 全员禁言[[V2TIMManager sharedInstance] muteAllGroupMembers:@"groupA" isMute:YES succ:^{ // 全员禁言成功} fail:^(int code, NSString *desc) { // 全员禁言失败}];[[V2TIMManager sharedInstance] addGroupListener:self];- (void)onMemberInfoChanged:(NSString *)groupID changeInfoList:(NSArray <V2TIMGroupMemberChangeInfo *> *)changeInfoList { // 禁言群成员监听 for (V2TIMGroupMemberChangeInfo *memberChangeInfo in changeInfoList) { // 被禁言用户 ID NSString *userID = memberChangeInfo.userID; // 禁言时间 uint32_t muteTime = memberChangeInfo.muteTime; }}- (void)onAllGroupMembersMuted:(NSString *)groupID isMute:(BOOL)isMute { // 全员禁言监听}class Callback final : public V2TIMCallback {public: using SuccessCallback = std::function<void()>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; Callback() = default; ~Callback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess() override { if (success_callback_) { success_callback_(); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};// 禁言群成员 userB 1分钟auto callback = new Callback;callback->SetCallback( [=]() { // 禁言群成员成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 禁言群成员失败 delete callback; });V2TIMManager::GetInstance()->GetGroupManager()->MuteGroupMember("groupA", "userB", 60, callback);// 全员禁言auto callback = new Callback;callback->SetCallback( [=]() { // 全员禁言成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 全员禁言失败 delete callback; });V2TIMManager::GetInstance()->GetGroupManager()->muteAllGroupMembers("groupA", true, callback);// 监听禁言群成员/全员禁言通知class GroupListener final : public V2TIMGroupListener {public: GroupListener() = default; ~GroupListener() override = default; void OnMemberInfoChanged(const V2TIMString& groupID, const V2TIMGroupMemberChangeInfoVector& groupMemberChangeInfoList) override { // 禁言群成员监听 for (size_t i = 0; i < groupMemberChangeInfoList.Size(); ++i) { const V2TIMGroupMemberChangeInfo& groupMemberChangeInfo = groupMemberChangeInfoList[i]; // 被禁言用户 ID V2TIMString userID = groupMemberChangeInfo.userID; // 禁言时间 uint32_t muteTime = groupMemberChangeInfo.muteTime; } } void onAllGroupMembersMuted(const V2TIMString& groupID, bool isMute) override { // 全员禁言监听 } // 其他成员 …};// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调GroupListener groupListener;V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

八、踢人

SDK 提供了面向所有群类型的基本踢人接口和高级踢人接口,群主或管理员可以调用 SDK 提供的踢人接口将指定的群成员踢出群组。

九、踢人基本接口

群主或管理员调用 kickGroupMember ① (Java / Swift / Objective-C / C++) 接口可以将指定的群成员踢出群组。群成员被踢后,全员(包括被踢的人)都会收到 onMemberKicked (Java / Swift / Objective-C / C++) 回调。

除了直播群外,其他类型群使用该接口踢人后,被踢用户可以再次申请加群或者被邀请进群,直播群详见 直播群踢人。

示例代码如下:

JavaSwiftObjective-CC++List<String> userIDList = new ArrayList<>();userIDList.add("userB");V2TIMManager.getGroupManager().kickGroupMember("groupA", userIDList, "", newV2TIMValueCallback<List<V2TIMGroupMemberOperationResult>>() { @Override public void onSuccess(List<V2TIMGroupMemberOperationResult> v2TIMGroupMemberOperationResults) { // 踢人成功 } @Override public void onError(int code, String desc) { // 踢人失败 }});V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() { @Override public void onMemberKicked(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) { // 群成员被踢通知 }});V2TIMManager.shared.kickGroupMember(groupID: "groupA", memberList: ["user1", "user2"], reason: "sd") { resultList in resultList.forEach { item in print( item.description) }} fail: { code, desc in print( "kickGroupMember fail, \\(code), \\(desc)")}V2TIMManager.shared.addGroupListener(listener: self)func onMemberKicked(groupID: String, opUser: V2TIMGroupMemberInfo, memberList: Array<V2TIMGroupMemberInfo>) { // 群成员被踢通知 print( "groupID:\\(groupID), opUser:\\(opUser), memberList:\\(memberList)")}[[V2TIMManager sharedInstance] kickGroupMember:@"groupA" memberList:@[@"user1"] reason:@"" succ:^(NSArray<V2TIMGroupMemberOperationResult *> *resultList) { // 踢人成功} fail:^(int code, NSString *desc) { // 踢人失败}];[[V2TIMManager sharedInstance] addGroupListener:self];- (void)onMemberKicked:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray<V2TIMGroupMemberInfo *>*)memberList { // 群成员被踢通知}template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString groupID = "groupA";V2TIMStringVector memberList;memberList.PushBack("userB");auto callback = new ValueCallback<V2TIMGroupMemberOperationResultVector>{};callback->SetCallback([=](const V2TIMGroupMemberOperationResultVector& groupMemberOperationResultList) { // 踢人成功 delete callback;},[=](int error_code, const V2TIMString& error_message) { // 踢人失败 delete callback;});V2TIMManager::GetInstance()->GetGroupManager()->KickGroupMember(groupID, memberList, {}, callback);// 监听群成员被踢通知class GroupListener final : public V2TIMGroupListener {public: GroupListener() = default; ~GroupListener() override = default; void OnMemberKicked(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser, const V2TIMGroupMemberInfoVector& memberList) override { // 群成员被踢通知 }};// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调GroupListener groupListener;V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

十、踢人高级接口

从 7.2 版本开始,SDK 对 kickGroupMember ② (Java / Swift / Objective-C / C++) 接口做了功能升级,新增 duration 参数,用于指定用户被踢出群组开始算起,禁止重新申请加群的时长。

注意:该接口仅对旗舰版客户开放,当调用该接口踢出群成员时,仅集成了 IMSDK 6.6 及其以上版本的全员(包括被踢的人)会收到 onMemberKicked (Java / Swift / Objective-C / C++) 回调。

示例代码如下:

JavaSwiftObjective-CC++List<String> userIDList = new ArrayList<>();userIDList.add("userB");V2TIMManager.getGroupManager().kickGroupMember("groupA", userIDList, "", 100, newV2TIMValueCallback<List<V2TIMGroupMemberOperationResult>>() { @Override public void onSuccess(List<V2TIMGroupMemberOperationResult> v2TIMGroupMemberOperationResults) { // 踢人成功 } @Override public void onError(int code, String desc) { // 踢人失败 }});V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() { @Override public void onMemberKicked(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) { // 群成员被踢通知 }});V2TIMManager.shared.kickGroupMember(groupID: "groupA", memberList: ["user1", "user2", "user3"], reason: "sd", duration: 10) { resultList in resultList.forEach { item in print( item.description) }} fail: { code, desc in print( "kickGroupMember fail, \\(code), \\(desc)")}V2TIMManager.shared.addGroupListener(listener: self)func onMemberKicked(groupID: String, opUser: V2TIMGroupMemberInfo, memberList: Array<V2TIMGroupMemberInfo>) { // 群成员被踢通知 print( "groupID:\\(groupID), opUser:\\(opUser), memberList:\\(memberList)")}[[V2TIMManager sharedInstance] kickGroupMember:@"groupA" memberList:@[@"user1"] reason:@"" duration:100 succ:^(NSArray<V2TIMGroupMemberOperationResult *> *resultList) { // 踢人成功} fail:^(int code, NSString *desc) { // 踢人失败}];[[V2TIMManager sharedInstance] addGroupListener:self];- (void)onMemberKicked:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray<V2TIMGroupMemberInfo *>*)memberList { // 群成员被踢通知}template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString groupID = "groupA";V2TIMStringVector memberList;memberList.PushBack("userB");auto callback = new ValueCallback<V2TIMGroupMemberOperationResultVector>{};callback->SetCallback([=](const V2TIMGroupMemberOperationResultVector& groupMemberOperationResultList) { // 踢人成功 delete callback;},[=](int error_code, const V2TIMString& error_message) { // 踢人失败 delete callback;});V2TIMManager::GetInstance()->GetGroupManager()->KickGroupMember(groupID, memberList, {}, 100, callback);// 监听群成员被踢通知class GroupListener final : public V2TIMGroupListener {public: GroupListener() = default; ~GroupListener() override = default; void OnMemberKicked(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser, const V2TIMGroupMemberInfoVector& memberList) override { // 群成员被踢通知 }};// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调GroupListener groupListener;V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

十一、直播群踢人

对于直播群(AVChatRoom)而言:

1. 增强版 6.6 以前,直播群不支持踢人。你可以使用 muteGroupMember (Java / Swift / Objective-C / C++) 禁言指定成员达到类似的成员管控的目的,禁言操作参考 禁言。

2. 增强版 6.6 开始,直播群支持踢人。你可以使用基础接口踢出群成员,群成员被踢出直播群后,无法再加入该群,也不能再向群里发消息。直播群中仅群主能踢人,管理员和普通成员没有踢人权限。

3. 从 7.2 版本开始,直播群也可以使用高级接口踢出群成员,并设置自定义时间,用以指定被踢用户可再次加群的时间间隔。

4. 6.6 版本及其以后的版本,直播群踢人均需要旗舰版支持,并需要登录控制台配置开启。

注意:1. 直播群踢人仅对旗舰版客户开放,详情请参考 基础服务计费说明。

注意:2. 如需使用此功能,你需要登录 即时通信 IM 控制台 开启开关,配置页面如下:

注意:

十二、设置管理员

群主调用 setGroupMemberRole (Java / Swift / Objective-C / C++) 可以对陌生人社交群(Public)、临时会议群(Meeting)和直播群(AVChatRoom)中的群成员进行管理员授权。

陌生人社交群和临时会议群普通成员被授权后,拥有跟管理员同样的权限,例如支持以下操作:

·修改群组基本资料

·将普通群成员踢出群

·将普通群成员禁言(即禁止其在一段时间内发言)

·审批其他用户的入群申请
更多详情可参考 群成员角色介绍。

直播群普通成员被授权后,拥有跟管理员同样的权限,例如:

·将普通群成员踢出直播群。

普通成员被授权为管理员后,全员(包括被设置的成员)会收到 onGrantAdministrator (Java / Swift / Objective-C / C++) 回调。

普通成员被取消管理员授权后,全员(包括被设置的成员)会收到 onRevokeAdministrator (Java / Swift / Objective-C / C++) 回调。

示例代码如下:

JavaSwiftObjective-CC++V2TIMManager.getGroupManager().setGroupMemberRole("groupA", "userB", V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_ROLE_ADMIN, new V2TIMCallback() { @Override public void onSuccess() { // 更改群成员角色成功 } @Override public void onError(int code, String desc) { // 更改群成员角色失败 }});V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() { @Override public void onGrantAdministrator(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) { // 被设置管理员通知 } @Override public void onRevokeAdministrator(String groupID, V2TIMGroupMemberInfo opUser, List<V2TIMGroupMemberInfo> memberList) { // 被取消管理员通知 }});V2TIMManager.shared.setGroupMemberRole(groupID: "groupA", memberUserID: "user1", newRole: .V2TIM_GROUP_MEMBER_ROLE_ADMIN) { print( "setGroupMemberRole succ")} fail: { code, desc in print( "setGroupMemberRole fail, \\(code), \\(desc)")}V2TIMManager.shared.addGroupListener(listener: self)func onGrantAdministrator(groupID: String, opUser: V2TIMGroupMemberInfo, memberList: Array<V2TIMGroupMemberInfo>) { print( "groupID:\\(groupID), opUser:\\(opUser), memberList:\\(memberList)") } func onRevokeAdministrator(groupID: String, opUser: V2TIMGroupMemberInfo, memberList: Array<V2TIMGroupMemberInfo>) { print( "groupID:\\(groupID), opUser:\\(opUser), memberList:\\(memberList)")}[[V2TIMManager sharedInstance] setGroupMemberRole:@"groupA" member:@"user1" newRole:V2TIM_GROUP_MEMBER_ROLE_ADMIN succ:^{ // 更改群成员角色成功} fail:^(int code, NSString *desc) { // 更改群成员角色失败}];[[V2TIMManager sharedInstance] addGroupListener:self];- (void)onGrantAdministrator:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray <V2TIMGroupMemberInfo *> *)memberList { // 被设置管理员通知}- (void)onRevokeAdministrator:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray <V2TIMGroupMemberInfo *> *)memberList { // 被取消管理员通知}class Callback final : public V2TIMCallback {public: using SuccessCallback = std::function<void()>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; Callback() = default; ~Callback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess() override { if (success_callback_) { success_callback_(); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString groupID = "groupA";V2TIMString userID = "userB";uint32_t role = V2TIMGroupMemberRole::V2TIM_GROUP_MEMBER_ROLE_ADMIN;auto callback = new Callback;callback->SetCallback( [=]() { // 更改群成员角色成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 更改群成员角色失败 delete callback; });V2TIMManager::GetInstance()->GetGroupManager()->SetGroupMemberRole(groupID, userID, role, callback);// 监听被设置管理员通知class GroupListener final : public V2TIMGroupListener {public: GroupListener() = default; ~GroupListener() override = default; void OnGrantAdministrator(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser, const V2TIMGroupMemberInfoVector& memberList) override { // 被设置管理员通知 } void OnRevokeAdministrator(const V2TIMString& groupID, const V2TIMGroupMemberInfo& opUser, const V2TIMGroupMemberInfoVector& memberList) override { // 被取消管理员通知 } // 其他成员 …};// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调GroupListener groupListener;V2TIMManager::GetInstance()->AddGroupListener(&groupListener);

十三、转让群主

群主可以调用 transferGroupOwner(Java / Swift / Objective-C / C++) 把群主转让给其他群成员。

群主转让后,全员会收到 onGroupInfoChanged (Java / Swift / Objective-C / C++) 回调,其中 V2TIMGroupChangeInfo 的 type 为 V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER,值为新群主的 UserID。

示例代码如下:

JavaSwiftObjective-CC++V2TIMManager.getGroupManager().transferGroupOwner("groupA", "userB", new V2TIMCallback() { @Override public void onSuccess() { // 转让群主成功 } @Override public void onError(int code, String desc) { // 转让群主失败 }});V2TIMManager.shared.transferGroupOwner(groupID: "groupA", memberUserID: "user1") { print( "transferGroupOwner succ")} fail: { code, desc in print( "transferGroupOwner fail, \\(code), \\(desc)")}[[V2TIMManager sharedInstance] transferGroupOwner:@"groupA" member:@"user1" succ:^{ // 转让群主成功} fail:^(int code, NSString *desc) { // 转让群主失败}];class Callback final : public V2TIMCallback {public: using SuccessCallback = std::function<void()>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; Callback() = default; ~Callback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess() override { if (success_callback_) { success_callback_(); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString groupID = "groupA";V2TIMString userID = "userB";auto callback = new Callback;callback->SetCallback( [=]() { // 转让群主成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 转让群主失败 delete callback; });V2TIMManager::GetInstance()->GetGroupManager()->TransferGroupOwner(groupID, userID, callback);

十四、获取群在线人数

调用 getGroupOnlineMemberCount (Java / Swift / Objective-C / C++) 可以获取群在线人数。

注意:说明:

代码示例如下:

JavaSwiftObjective-CC++V2TIMManager.getGroupManager().getGroupOnlineMemberCount("group_avchatroom", new V2TIMValueCallback<Integer>() { @Override public void onSuccess(Integer integer) { // 获取直播群在线人数成功 } @Override public void onError(int code, String desc) { // 获取直播群在线人数失败 }});V2TIMManager.shared.getGroupOnlineMemberCount(groupID: "group_avchatroom") { count in print( "getGroupOnlineMemberCount succ, \\(count)")} fail: { code, desc in print( "getGroupOnlineMemberCount fail, \\(code), \\(desc)")}[[V2TIMManager sharedInstance] getGroupOnlineMemberCount:@"group_avchatroom" succ:^(NSInteger count) { // 获取直播群在线人数成功} fail:^(int code, NSString *desc) { // 获取直播群在线人数失败}];template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMString groupID = "group_avchatroom";auto callback = new ValueCallback<uint32_t>{};callback->SetCallback( [=](const uint32_t& count) { // 获取直播群在线人数成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 获取直播群在线人数失败 delete callback; });V2TIMManager::GetInstance()->GetGroupManager()->GetGroupOnlineMemberCount(groupID, callback);

赞 (0)
上一篇 4天前
下一篇 4天前