tencent cloud

即时通信 IM

动态与公告
产品动态
公告
产品简介
产品概述
基本概念
应用场景
功能介绍
账号系统
用户资料与关系链
消息管理
群组相关
公众号系统
音视频通话 Call
使用限制
购买指南
计费概述
价格说明
购买指引
续费指引
停服说明
退费说明
开发指引
Demo 专区
开通服务
体验 Demo
快速跑通
下载中心
SDK & Demo 源码
更新日志
聊天互动(含 UI)
TUIKit 组件介绍
快速开始
全功能接入
单功能接入
AI 集成
构建基础界面
更多特性
定义外观
国际化界面语言
推送服务(Push)
服务概述
名词解释
开通服务
快速跑通
厂商通道
数据统计
排查工具
客户端 API
服务端 API
推送回调
高级功能
更新日志
错误码
常见问题
智能客服
功能概述
快速入门
集成指引
管理员操作手册
客服操作手册
更多实践
直播间搭建
AI 聊天机器人方案
超大娱乐协作社群
Discord 实现指南
游戏内集成 Chat 指南
类 WhatsApp Channel 搭建方案
发送红包
Chat 应对防火墙限制相关
无 UI 集成
快速开始
集成 SDK
初始化
登录登出
消息相关
会话相关
群组相关
社群话题
用户管理
离线推送
云端搜索
本地搜索
公众号
客户端 API
JavaScript
Android
iOS & macOS
Swift
Flutter
Electron
Unity
React Native
C 接口
C++
服务端 API
生成 UserSig
REST API
第三方回调
控制台指南
新版控制台介绍
创建并升级应用
基本配置
功能配置
账号管理
群组管理
公众号管理
回调配置
用量统计
资源包查看指南
实时监控
开发辅助工具
访问管理
高级功能
常见问题
uni-app 常见问题
购买相关问题
SDK 相关问题
账号鉴权相关问题
用户资料与关系链相关问题
消息相关问题
群组相关问题
直播群相关问题
昵称头像相关问题
协议与认证
服务等级协议
安全合规认证
IM 政策
隐私政策
数据隐私和安全协议
平滑迁移方案
平滑迁移完整版
平滑迁移简化版
错误码
联系我们

Android&iOS&Windows&Mac

PDF
聚焦模式
字号
最后更新时间: 2026-02-06 20:40:41

功能描述

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

拉取群成员列表

您可以调用 getGroupMemberList (Java / Swift / Objective-C / C++) 获取指定群的群成员列表。 该列表中包含了各个群成员的资料信息,例如用户 ID(userID)、群名片(nameCard)、头像(faceUrl)、昵称(nickName)、进群时间(joinTime)、在线状态(isOnline)等信息。
直播群由于人数众多,不提供拉取全量成员列表的功能。专业版、专业版 Plus、企业版客户可拉取最近进群的 1000 位群成员。群成员列表后台数据更新间隔是 40s。
此功能需要在控制台开启开关,开关路径:Applications > Your App > Chat > Configuration > Group Configuration > Group feature configuration > List of online audio-video group members。
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 个群成员对象。
注意:
对于 7.2 及以下版本,普通群默认一次拉取 50 个群成员。
对于 7.3 及以上版本,普通群默认一次拉取 500 个群成员。
2. 首次拉取群成员列表成功后,getGroupMemberList 的回调结果 V2TIMGroupMemberInfoResult 中会包含 nextSeq(下次分页拉取的字段):
如果 nextSeq 等于 0,表示已经拉取了全部的群成员。
如果 nextSeq 大于 0,表示还有更多的群成员可以拉取。
3. 当用户继续上拉刷新群成员时,如果还有更多的群成员可以拉取,可以继续调用 getGroupMemberList 接口,并传入新一轮的 nextSeq 参数(nextSeq 数值来自上一次拉取返回的 V2TIMGroupMemberInfoResult 对象)。
4. 重复执行【步骤 3】直至 nextSeq 等于 0,拉取结束。
示例代码如下:
Java
Swift
Objective-C
C++
{
...
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++) 标记、取消标记直播群成员。规则如下:
1. 只有直播群和社群支持此功能,只有群主有权限操作。
2. 每个直播群最多只能添加 10 个自定义标记。
3. 通过 SDK 设置自定义标记类型为 uint32_t,必须大于等于 1000。
4. 每次最多标记 100 名群成员。
5. 被标记的群成员需要在线。当成员退群、掉线时标记信息会被清除。可以通过第三方回调在该成员进群、上线时重新设置标记。
群成员被标记后,可以调用 getGroupMemberList,设置 filter 为所设置的自定义标记值,过滤出指定的群成员列表。
说明:
1. 仅增强版 SDK 6.6 及以上版本支持。
2. 标记直播群成员仅对专业版、专业版 Plus、企业版客户开放,购买专业版、专业版 Plus、企业版后可使用。

禁言

禁言指定群成员

群主或管理员可以调用 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++) 事件回调。
该通知默认是关闭的,如需开启此通知,您可以登录控制台修改相关配置,配置路径:Applications > Your App > Chat > Configuration > Group Configuration > Group system notification configuration > Notification of group profile change > Notification of muting all change。
说明:
只有群主能将管理员禁言。
示例代码如下:
Java
Swift
Objective-C
C++
// 禁言群成员 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 / SwiftObjective-C / C++) 接口可以将指定的群成员踢出群组。群成员被踢后,全员(包括被踢的人)都会收到 onMemberKicked (Java / SwiftObjective-C / C++) 回调。
除了直播群外,其他类型群使用该接口踢人后,被踢用户可以再次申请加群或者被邀请进群,直播群详见直播群踢人
示例代码如下:
Java
Swift
Objective-C
C++
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 / SwiftObjective-C / C++) 接口做了功能升级,新增 duration 参数,用于指定用户被踢出群组开始算起,禁止重新申请加群的时长。
注意:
该接口仅对专业版、专业版 Plus、企业版客户开放,当调用该接口踢出群成员时,仅集成了 IMSDK 6.6 及其以上版本的全员(包括被踢的人)会收到 onMemberKicked (Java / Swift /  Objective-C / C++) 回调。
示例代码如下:
Java
Swift
Objective-C
C++
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 版本开始,直播群也可以使用高级接口踢出群成员,并设置自定义时间,用以指定被踢用户可再次加群的时间间隔。
注意:
1. 6.6 及其以后的版本,直播群踢人仅对专业版、专业版 Plus、企业版客户开放,需要购买专业版、专业版 Plus、企业版后使用。
2. 如需使用直播群踢人,您需要登录控制台开启开关,开关路径:Applications > Your App > Chat > Configuration > Group Configuration > Group feature configuration > Audio-video group member banning。

设置管理员

群主调用 setGroupMemberRole (Java / Swift / Objective-C / C++) 可以对陌生人社交群(Public)、临时会议群(Meeting)和直播群(AVChatRoom)中的群成员进行管理员授权。
普通成员被授权后,拥有跟管理员同样的权限,例如支持以下操作:
修改群组基本资料
将普通群成员踢出群
将普通群成员禁言(即禁止其在一段时间内发言)
审批其他用户的入群申请
更多详情可参考 群成员角色介绍
直播群普通成员被授权后,拥有跟管理员同样的权限,例如:
将普通群成员踢出直播群。
普通成员被授权为管理员后,全员(包括被设置的成员)会收到 onGrantAdministrator (Java / Swift / Objective-C / C++) 回调。
普通成员被取消管理员授权后,全员(包括被设置的成员)会收到 onRevokeAdministrator (Java / Swift / Objective-C / C++) 回调。
示例代码如下:
Java
Swift
Objective-C
C++
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++) 回调,其中 V2TIMGroupChangeInfotypeV2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER,值为新群主的 UserID
示例代码如下:
Java
Swift
Objective-C
C++
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++) 可以获取群在线人数。
说明
1. 增强版 SDK 7.3 以前的版本仅支持直播群( AVChatRoom)。
2. 增强版 SDK 7.3 及以后的版本支持所有群类型。
3. 如需为 Work、Public、Meeting、Community(社群)类型群组调用该接口,需购买 专业版/专业版 Plus/企业版套餐,并且已开通群成员在线状态功能(开关默认关闭,您可以进入即时通信 IM 控制台,左侧导航栏单击 Chat > 功能配置选择群组配置 > 群功能配置 > 群成员在线状态,单击开启按钮进行开通)。
代码示例如下:
Java
Swift
Objective-C
C++
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);

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈