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
聚焦模式
字号
最后更新时间: 2025-09-04 16:53:44

功能描述

社群是一个由于共同主题而让大家聚集在一起的超大群组,可以在社群下根据不同兴趣创建多个话题。 社群用来管理群成员。社群下的所有话题不仅可以共享社群成员,还可以独立收发消息而不相互干扰。
社群和话题的管理接口在核心类 V2TIMGroupManager(Java) / V2TIMManager+Group(Objective-C) 中。
话题中的消息相关接口在核心类 V2TIMMessageManager(Java) / V2TIMManager+Message(Objective-C、Swift) 中。
说明:
6.2.2363 及以上版本支持,从 7.7.5282 版本开始推荐使用 V2TIMCommunityManager 和 V2TIMCommunityListener 类。
需要 专业版、专业版Plus或企业版, 登录 控制台 并开启社群开关后方可使用,开关路径:Applications > Your App > Chat > Configuration > Group Configuration > Community。

效果展示

您可以使用本功能实现如下图所示的社群效果:




社群管理

创建社群

调用 createCommunity (Java / Swift / Objective-C / C++) 创建支持话题的社群。
说明:
自定义的社群 ID 前缀必须是@TGS#_。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMGroupInfo v2TIMGroupInfo = new V2TIMGroupInfo();
v2TIMGroupInfo.setGroupName("This is a Community");
v2TIMGroupInfo.setGroupType(V2TIMManager.GROUP_TYPE_COMMUNITY);
V2TIMManager.getCommunityManager().createCommunity(v2TIMGroupInfo, null, new V2TIMValueCallback<String>() {
@Override
public void onSuccess(String groupID) {
// 创建社群成功
}

@Override
public void onError(int code, String desc) {
// 创建社群失败
}
});
let groupInfo = V2TIMGroupInfo()
groupInfo.groupType = "Community"
groupInfo.groupName = "CommunityForTestPermissionGroupSwift"
groupInfo.defaultPermissions = 13;
groupInfo.enablePermissionGroup = true;

V2TIMManager.shared.createGroup(info: groupInfo, memberList: nil) { groupID in
print( "createPermissionGroupInCommunity succ, \\(groupID)")
} fail: { code, desc in
print( "createPermissionGroupInCommunity fail, \\(code), \\(desc)")
}
V2TIMGroupInfo *groupInfo = [[V2TIMGroupInfo alloc] init];;
groupInfo.groupName = @"This is a Community";
groupInfo.groupType = GroupType_Community;
[[V2TIMManager sharedInstance] createCommunity:groupInfo memberList:nil succ:^(NSString *groupID) {
// 创建社群成功
} 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_;
};

V2TIMGroupInfo info;
info.groupType = "Community";
info.groupName = "This is a Community";

auto callback = new ValueCallback<V2TIMString>{};
callback->SetCallback(
[=](const V2TIMString& groupID) {
// 创建社群成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 创建社群失败
delete callback;
});

V2TIMManager::GetInstance()->GetCommunityManager()->CreateCommunity(info, {}, callback);

获取加入的社群列表

调用 getJoinedCommunityList(Java / Swift / Objective-C / C++) 获取已经加入的支持话题的社群列表。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMManager.getCommunityManager().getJoinedCommunityList(new V2TIMValueCallback<List<V2TIMGroupInfo>>() {
@Override
public void onSuccess(List<V2TIMGroupInfo> v2TIMGroupInfos) {
// 获取社群列表成功
}
@Override
public void onError(int code, String desc) {
// 获取社群列表失败
}
});

V2TIMManager.shared.getJoinedCommunityList { groupList in
groupList.forEach { item in
print( item.description)
}
} fail: { code, desc in
print( "getJoinedCommunityList fail, \\(code), \\(desc)")
}
[[V2TIMManager sharedInstance] getJoinedCommunityList:^(NSArray<V2TIMGroupInfo *> *groupList) {
// 获取社群列表成功
} 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_;
};

auto callback = new ValueCallback<V2TIMGroupInfoVector>{};
callback->SetCallback(
[=](const V2TIMGroupInfoVector& groupInfoList) {
// 获取社群列表成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 获取社群列表失败
delete callback;
});

V2TIMManager::GetInstance()->GetCommunityManager()->GetJoinedCommunityList(callback);

其他管理接口

其他功能跟普通群组使用方法一样,涉及的接口有:
分类
功能
接口
社群管理
joinGroup (Java /Swift / Objective-C / C++)
quitGroup (Java / Swift / Objective-C / C++)
dismissGroup (Java / Swift / Objective-C / C++)
getGroupsInfo (Java / Swift / Objective-C / C++)
setGroupInfo (Java / Swift / Objective-C / C++)
社群成员管理
getGroupMemberList (Java / Swift / Objective-C / C++)
getGroupMembersInfo (Java / Swift / Objective-C / C++)
setGroupMemberInfo (Java / Swift / Objective-C / C++)
kickGroupMember (Java / Swift / Objective-C / C++)

话题管理

同一社群下可创建多个话题,多个话题共享一套社群成员关系,但不同话题内独立收发消息、互不干扰。
说明:
登录 控制台 并开启社群开关后方可使用,开关路径:Applications > Your App > Chat > Configuration > Group Configuration > Community。

创建话题

创建话题分两步:
1. 创建 V2TIMTopicInfo (Java / Swift / Objective-C / C++) 对象。
2. 调用 createTopicInCommunity (Java / Swift / Objective-C / C++) 接口创建话题。
说明:
自定义的话题 ID 组成为:GroupId+@TOPIC#_+自定义部分。例如社群 ID 为 @TGS#_123,自定义部分为 TestTopic,那么话题 ID 为 @TGS#_123@TOPIC#_TestTopic。
从 8.4 版本开始,接口支持创建 “私密话题”(设置 V2TIMTopicInfotopicType 为 “Private”),“私密话题” 有自己的成员列表(成员上限 10000 人),社群成员需要加入私密话题才能发言(私密话题需要购买企业版套餐包)。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMTopicInfo topicInfo = new V2TIMTopicInfo();
// 话题类型,"Public" :公开话题;"Private" :私密话题
topicInfo.setTopicType(topicType);
topicInfo.setTopicName(topicName);
topicInfo.setTopicFaceUrl(topicFaceUrl);
topicInfo.setIntroduction(topicIntroduction);
topicInfo.setNotification(topicNotification);
topicInfo.setCustomString(topicCustomString);
// 以下字段只针对私密话题有效
topicInfo.setTopicAddOpt(V2TIMTopicInfo.V2TIM_TOPIC_ADD_AUTH);
topicInfo.setTopicApproveOpt(V2TIMTopicInfo.V2TIM_TOPIC_ADD_AUTH);
topicInfo.setMemberMaxCount(10000);
List<V2TIMCreateGroupMemberInfo> memberList = new ArrayList<>();
V2TIMCreateGroupMemberInfo memberInfo = new V2TIMCreateGroupMemberInfo();
memberInfo.setUserID("xixi");
memberInfo.setRole(1);
memberList.add(memberInfo);
topicInfo.setMemberList(memberList);

// groupID 填支持话题的社群 ID
V2TIMManager.getCommunityManager().createTopicInCommunity(groupID, topicInfo, new V2TIMValueCallback<String>() {
@Override
public void onSuccess(String topicID) {
// 创建话题成功
}

@Override
public void onError(int code, String desc) {
// 创建话题失败
}
});
let topicInfo = V2TIMTopicInfo()
// 话题类型,"Public" :公开话题;"Private" :私密话题
topicInfo.topicType = "Public"
topicInfo.topicName = "swift topic name"
topicInfo.topicFaceURL = "topicFaceUrl"
topicInfo.introduction = "topicIntroduction"
topicInfo.notification = "topicNotification"
topicInfo.customString = "topicCustomString"
// 以下字段只针对私密话题有效
topicInfo.topicAddOpt = .V2TIM_GROUP_ADD_AUTH
topicInfo.topicApproveOpt = .V2TIM_GROUP_ADD_AUTH
topicInfo.memberMaxCount = 10000
let memberInfo = V2TIMCreateGroupMemberInfo()
memberInfo.userID = "xixi"
memberInfo.role = 1
topicInfo.memberList.append(memberInfo)

V2TIMManager.shared.createTopicInCommunity(groupID: "groupID", topicInfo: topicInfo) { topicID in
print( "createTopicInCommunity succ, \\(topicID)")
} fail: { code, desc in
print( "createTopicInCommunity fail, \\(code), \\(desc)")
}
V2TIMTopicInfo *topicInfo = [[V2TIMTopicInfo alloc] init];
// 话题类型,"Public" :公开话题;"Private" :私密话题
topicInfo.topicType = @"Public";
topicInfo.topicName = @"topicName";
topicInfo.topicFaceURL = @"topicFaceUrl";
topicInfo.introduction = @"topicIntroduction";
topicInfo.notification = @"topicNotification";
topicInfo.customString = @"topicCustomString";
// 以下字段只针对私密话题有效
topicInfo.topicAddOpt = V2TIM_GROUP_ADD_AUTH;
topicInfo.topicApproveOpt = V2TIM_GROUP_ADD_AUTH;
topicInfo.memberMaxCount = 10000;
V2TIMCreateGroupMemberInfo *memberInfo = [[V2TIMCreateGroupMemberInfo alloc] init];
memberInfo.userID = @"xixi";
memberInfo.role = V2TIM_GROUP_MEMBER_ROLE_MEMBER;
topicInfo.memberList = @[memberInfo];

// groupID 填支持话题的社群 ID
[[V2TIMManager sharedInstance] createTopicInCommunity:@"groupID" topicInfo:topicInfo succ:^(NSString *topicID) {
// 创建话题成功
} 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_;
};

V2TIMTopicInfo topicInfo;
// 话题类型,"Public" :公开话题;"Private" :私密话题
topicInfo.topicType = "Public";
topicInfo.topicID = "topicID";
topicInfo.topicName = "topicName";
topicInfo.topicFaceURL = "topicFaceURL";
topicInfo.introduction = "introduction";
topicInfo.notification = "notification";
// 以下字段只针对私密话题有效
topicInfo.topicAddOpt = V2TIM_GROUP_ADD_AUTH;
topicInfo.topicApproveOpt = V2TIM_GROUP_ADD_AUTH;
topicInfo.memberMaxCount = 20;
V2TIMCreateGroupMemberInfo member;
member.userID = "xixi";
member.role = V2TIM_GROUP_MEMBER_ROLE_MEMBER;
V2TIMCreateGroupMemberInfoVector member_list;
member_list.PushBack(member);
topicInfo.memberlist = member_list;

auto callback = new ValueCallback<V2TIMString>{};
callback->SetCallback(
[=](const V2TIMString& string) {
// 创建话题成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 创建话题失败
delete callback;
});

// groupID 填支持话题的社群 ID
V2TIMManager::GetInstance()->GetCommunityManager()->CreateTopicInCommunity("groupID", topicInfo, callback);

删除话题

调用 deleteTopicFromCommunity(Java/ Swift / Objective-C / C++) 接口删除话题。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMManager.getCommunityManager().deleteTopicFromCommunity(groupID, topicIDList, new V2TIMValueCallback<List<V2TIMTopicOperationResult>>() {
@Override
public void onSuccess(List<V2TIMTopicOperationResult> v2TIMTopicOperationResults) {
// 删除话题成功
}

@Override
public void onError(int code, String desc) {
// 删除话题失败
}
});

V2TIMManager.shared.deleteTopicFromCommunity(groupID: "groupID", topicIDList: ["topic1","topic2"]) { resultList in
resultList.forEach { item in
// V2TIMTopicOperationResult
print( item.description)
}
} fail: { code, desc in
print( "deleteTopicFromCommunity fail, \\(code), \\(desc)")
}
[[V2TIMManager sharedInstance] deleteTopicFromCommunity:@"groupID" topicIDList:@[@"topic1", @"topic2"] succ:^(NSMutableArray<V2TIMTopicOperationResult *> *resultList) {
// 删除话题成功
} 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_;
};

V2TIMStringVector topicIDList;
topicIDList.PushBack("topic1");
topicIDList.PushBack("topic2");

auto callback = new ValueCallback<V2TIMTopicOperationResultVector>{};
callback->SetCallback(
[=](const V2TIMTopicOperationResultVector& topicOperationResultList) {
// 删除话题成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 删除话题失败
delete callback;
});

V2TIMManager::GetInstance()->GetCommunityManager()->DeleteTopicFromCommunity("groupID", topicIDList, callback);

修改话题信息

修改话题信息分两步:
1. 创建 V2TIMTopicInfo (Java / Swift / Objective-C / C++) 对象,并设置需要修改的字段。
2. 调用 setTopicInfo (Java / Swift / Objective-C / C++) 接口修改话题信息。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMTopicInfo topicInfo = new V2TIMTopicInfo();
topicInfo.setTopicID(topicID);
topicInfo.setTopicName(topicName);
topicInfo.setTopicFaceUrl(topicFaceUrl);
topicInfo.setIntroduction(topicIntroduction);
topicInfo.setNotification(topicNotification);
topicInfo.setCustomString(topicCustomString);
topicInfo.setDraft(topicDraft);
topicInfo.setAllMute(false);
V2TIMManager.getCommunityManager().setTopicInfo(topicInfo, new V2TIMCallback() {
@Override
public void onSuccess() {
// 修改话题信息成功
}

@Override
public void onError(int code, String desc) {
// 修改话题信息失败
}
});

let topicInfo = V2TIMTopicInfo()
topicInfo.topicID = "topicID"
topicInfo.topicName = "swift topic name"
topicInfo.topicFaceURL = "topicFaceUrl"
topicInfo.introduction = "topicIntroduction"
topicInfo.notification = "topicNotification"
topicInfo.customString = "topicCustomString"
topicInfo.draftText = "topicDraft"

V2TIMManager.shared.setTopicInfo(topicInfo: topicInfo) {
print( "setTopicInfo succ, \\(topicInfo.description)")
} fail: { code, desc in
print( "setTopicInfo fail, \\(code), \\(desc)")
}
V2TIMTopicInfo *topicInfo = [[V2TIMTopicInfo alloc] init];
topicInfo.topicID = @"topicID";
topicInfo.topicName = @"topicName";
topicInfo.topicFaceURL = @"topicFaceUrl";
topicInfo.introduction = @"topicIntroduction";
topicInfo.notification = @"topicNotification";
topicInfo.customString = @"topicCustomString";
topicInfo.draftText = @"topicDraft";
topicInfo.isAllMuted = NO;
[[V2TIMManager sharedInstance] setTopicInfo:topicInfo 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_;
};

V2TIMTopicInfo topicInfo;
topicInfo.topicID = "topicID";
topicInfo.topicName = "topicName";
topicInfo.notification = "topicFaceURL";
topicInfo.introduction = "introduction";
topicInfo.topicFaceURL = "notification";
topicInfo.customString = "customString";
topicInfo.modifyFlag = V2TIMTopicInfoModifyFlag::V2TIM_COMMUNITY_MODIFY_FLAG_TOPIC_NAME |
V2TIMTopicInfoModifyFlag::V2TIM_COMMUNITY_MODIFY_FLAG_TOPIC_NOTIFICATION |
V2TIMTopicInfoModifyFlag::V2TIM_COMMUNITY_MODIFY_FLAG_TOPIC_INTRODUCTION |
V2TIMTopicInfoModifyFlag::V2TIM_COMMUNITY_MODIFY_FLAG_TOPIC_FACE_URL |
V2TIMTopicInfoModifyFlag::V2TIM_COMMUNITY_MODIFY_FLAG_TOPIC_CUSTOM_STRING;

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 修改话题信息成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 修改话题信息失败
delete callback;
});

V2TIMManager::GetInstance()->GetCommunityManager()->SetTopicInfo(topicInfo, callback);
修改话题其他信息可参考禁言成员修改话题消息接收选项
话题的消息接收选项可以选择是否继承自社群,接口为 setInheritMessageReceiveOptionFromCommunityJava / Swift / Objective-C / C++)。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMTopicInfo topicInfo = new V2TIMTopicInfo();
topicInfo.setTopicID(topicID);
topicInfo.setInheritMessageReceiveOptionFromCommunity(true, new V2TIMCallback() {
@Override
public void onSuccess() {
// 继承成功
}

@Override
public void onError(int code, String desc) {
// 继承失败
}
});

let topicInfo = V2TIMTopicInfo()
topicInfo.topicID = "@TGS#_@TGS#cIIYRJIM62C6@TOPIC#_@TOPIC#cKIYRJIM62CD"
topicInfo.setInheritMessageReceiveOptionFromCommunity(isInherit: true) {
print( "enableTopitInheritMsgFlagFromCommunity success")
} fail: { code, desc in
print( "enableTopitInheritMsgFlagFromCommunity fail, \\(code), \\(desc)")
}
V2TIMTopicInfo *topicInfo = [[V2TIMTopicInfo alloc] init];
topicInfo.topicID = @"topicID";
[topicInfo setInheritMessageReceiveOptionFromCommunity:YES 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_;
};

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 继承成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 继承失败
delete callback;
});

V2TIMTopicInfo topicInfo;
topicInfo.topicID = "topicID";
topicInfo.SetInheritMessageReceiveOptionFromCommunity(true, callback);

获取话题列表

调用 getTopicInfoList (Java / Swift / Objective-C / C++) 接口获取话题列表。
当 topicIDList 列表为空时,为获取该社群下的所有话题列表。
当 topicIDList 填入指定的话题 ID 时,为获取填入的话题列表。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMManager.getCommunityManager().getTopicInfoList(groupID, topicIDList, new V2TIMValueCallback<List<V2TIMTopicInfoResult>>() {
@Override
public void onSuccess(List<V2TIMTopicInfoResult> v2TIMTopicInfoResults) {
// 获取话题列表成功
}

@Override
public void onError(int code, String desc) {
// 获取话题列表失败
}
});
V2TIMManager.shared.getTopicInfoList(groupID: "groupID", topicIDList: ["topic1","topic2"]) { resultList in
resultList.forEach { item in
// V2TIMTopicInfoResult
print( "\\(item.description)")
}
} fail: { code, desc in
print( "getTopicInfoList fail, \\(code), \\(desc)")
}
[[V2TIMManager sharedInstance] getTopicInfoList:@"groupID" topicIDList:@[@"topic1", @"topic2"] succ:^(NSMutableArray<V2TIMTopicInfoResult *> *resultList) {
// 获取话题列表成功
} 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_;
};

V2TIMStringVector topicIDList;
topicIDList.PushBack("topic1");
topicIDList.PushBack("topic2");

auto callback = new ValueCallback<V2TIMTopicInfoResultVector>{};
callback->SetCallback(
[=](const V2TIMTopicInfoResultVector& topicInfoResultList) {
// 获取话题列表成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 获取话题列表失败
delete callback;
});

V2TIMManager::GetInstance()->GetCommunityManager()->GetTopicInfoList("groupID", topicIDList, callback);

实现话题分组

社群-分组-话题三级结构中的分组实现原理为: 社群资料的 customInfo (Java / Swift / Objective-C / C++) 中定义一个字段保存该社群的话题分组列表;每个话题所属的分组,存储于话题资料的 customString (Java / Swift / Objective-C / C++) 字段中。
加载社群时,根据社群(群组)资料中的 customInfo 的话题分组列表字段,展示分组列表。
加载社群下的 Topic 列表时,通过话题资料中的 customString 获取分组名分配到所属分组中。
说明:
社群(群组)中 customInfo 的话题分组列表字段名,key 值,可由您自行定义。以下示例代码中,将其命名为 topic_category

配置社群的分组列表

此处直接修改群组 groupInfocustomInfo 即可。此处为一个 Map,key 值是您定义的话题分组列表字段名。
示例代码如下:
Java
Swift
Objective-C
C++
List<String> categoryList = new ArrayList<>();
categoryList.add("分组1");
categoryList.add("分组2");
byte[] categoriesByteArray = gson.toJson(categoryList).getBytes();

Map<String, byte[]> customMap = new HashMap<>();
// 需要先在控制台配置群自定义字段 topic_category
customMap.put("topic_category", categoriesByteArray);

V2TIMGroupInfo modifyInfo = new V2TIMGroupInfo();
modifyInfo.setGroupID(groupID);
modifyInfo.setCustomInfo(customMap);
V2TIMManager.getGroupManager().setGroupInfo(modifyInfo, new V2TIMCallback() {
@Override
public void onSuccess() {
// 修改群资料成功
}

@Override
public void onError(int code, String desc) {
// 修改群资料失败
}
});

let info = V2TIMGroupMemberFullInfo()
info.userID = "userA"
info.nameCard = "userA_namecard"
info.customInfo = ["topic_category": "value1".data(using: .utf8) ?? Data()]
V2TIMManager.shared.setGroupMemberInfo(groupID: "groupID", info: info) {
print( info.description)
} fail: { code, desc in
print( "setGroupMemberInfo fail, \\(code), \\(desc)")
}
NSArray *categoryList = @[@"分组 1", @"分组 2"];
NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:categoryList
options:NSJSONWritingPrettyPrinted
error:&error];
if ([data length] > 0 && error == nil) {
// 需要先在控制台配置群自定义字段 topic_category
NSDictionary *customInfo = @{@"topic_category": data};

V2TIMGroupInfo *info = [[V2TIMGroupInfo alloc] init];
info.groupID = @"需要修改的群 ID";
info.customInfo = customInfo;
[[V2TIMManager sharedInstance] setGroupInfo:info
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_;
};

V2TIMGroupInfo info;
info.groupID = "groupA";

V2TIMCustomInfo customInfo;
std::string str{u8"[\\"分组1\\", \\"分组2\\"]"};
// 需要先在控制台配置群自定义字段 topic_category
customInfo.Insert("topic_category", {reinterpret_cast<const uint8_t*>(str.data()), str.size()});
info.modifyFlag = V2TIMGroupInfoModifyFlag::V2TIM_GROUP_INFO_MODIFY_FLAG_CUSTOM_INFO;

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 修改群资料成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 修改群资料失败
delete callback;
});

V2TIMManager::GetInstance()->GetGroupManager()->SetGroupInfo(info, callback);

获取社群的分组列表

示例代码如下:
Java
Swift
Objective-C
C++
String groupID = "group1";
List<String> groupIDList = new ArrayList<>();
groupIDList.add(groupID);
V2TIMManager.getGroupManager().getGroupsInfo(groupIDList, new V2TIMValueCallback<List<V2TIMGroupInfoResult>>() {
@Override
public void onSuccess(List<V2TIMGroupInfoResult> v2TIMGroupInfos) {
if (v2TIMGroupInfos.size() == 0) {
return;
}
V2TIMGroupInfoResult v2TIMGroupInfoResult = v2TIMGroupInfos.get(0);
if (v2TIMGroupInfoResult.getResultCode() == BaseConstants.ERR_SUCC) {
byte[] topicCategoryBytes = v2TIMGroupInfoResult.getGroupInfo().getCustomInfo().get("topic_category");
List<String> topicCategories = null;
if (topicCategoryBytes != null) {
Gson gson = new Gson();
try {
// 解析出分组列表
topicCategories = gson.fromJson(new String(topicCategoryBytes), List.class);
} catch (JsonParseException e) {
}
}
}
}

@Override
public void onError(int code, String desc) {

}
});
let groupIDList = ["group1"]

V2TIMManager.shared.getGroupsInfo(groupIDList: groupIDList, succ: { groupResultList in
// 获取成功
if groupResultList.isEmpty {
return
}
let result = groupResultList.first!
if result.resultCode != 0 {
return
}
guard let categoryData = result.info?.customInfo?["topic_category"] as? Data else {
return
}
var categoryList: [Any]?
do {
let jsonObject = try JSONSerialization.jsonObject(with: categoryData, options: .allowFragments)
// 解析出分组列表
if let jsonArray = jsonObject as? [Any] {
categoryList = jsonArray
}
} catch {
// 处理 JSON 解析错误
}
}, fail: { code, desc in
// 获取失败
})
NSArray *groupIDList = @[@"group1"];
[[V2TIMManager sharedInstance] getGroupsInfo:groupIDList
succ:^(NSArray<V2TIMGroupInfoResult *> *groupResultList) {
// 获取成功
if (groupResultList.count == 0) {
return;
}
V2TIMGroupInfoResult *result = groupResultList.firstObject;
if (result.resultCode != 0) {
return;
}
NSData *categoryData = result.info.customInfo[@"topic_category"];
if (categoryData == nil) {
return;
}
NSArray *categoryList;
NSError *error = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:categoryData
options:NSJSONReadingAllowFragments
error:nil];
if (jsonObject != nil && error == nil) {
// 解析出分组列表
categoryList = (NSArray *)jsonObject;
}
} 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_;
};

V2TIMStringVector groupIDList;
groupIDList.PushBack("group1");

auto callback = new ValueCallback<V2TIMGroupInfoResultVector>{};
callback->SetCallback(
[=](const V2TIMGroupInfoResultVector& groupInfoResultList) {
if (groupInfoResultList.Size() == 1) {
const V2TIMGroupInfoResult& groupInfoResult = groupInfoResultList[0];
if (groupInfoResult.resultCode == 0) {
V2TIMGroupInfo info = groupInfoResult.info;
V2TIMCustomInfo customInfo = info.customInfo;
if (customInfo.Count("topic_category")) {
const V2TIMBuffer& topicCategory = customInfo.Get("topic_category");
// 解析出分组列表 ...
}
}
}

delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 获取社群的分组列表失败
delete callback;
});
V2TIMManager::GetInstance()->GetGroupManager()->GetGroupsInfo(groupIDList, callback);

为话题添加分组

话题所属的分组可以使用话题的 customString 字段来保存。
示例代码如下:
Java
Swift
Objective-C
C++
Map<String, Object> map = new HashMap<>();
map.put("category", "分组1");
Gson gson = new Gson();
V2TIMTopicInfo topicInfo = new V2TIMTopicInfo();
topicInfo.setTopicID(topicID);
topicInfo.setCustomString(gson.toJson(map));
V2TIMManager.getCommunityManager().setTopicInfo(topicInfo, new V2TIMCallback() {
@Override
public void onSuccess() {
// 修改话题信息成功
}

@Override
public void onError(int code, String desc) {
// 修改话题信息失败
}
});

let topicInfo = V2TIMTopicInfo()
topicInfo.topicID = "topicID"
topicInfo.topicName = "topicName swift"
topicInfo.customString = "customString"
V2TIMManager.shared.setTopicInfo(topicInfo: topicInfo) {
print( "setTopicInfo succ, \\(topicInfo.description)")
} fail: { code, desc in
print( "setTopicInfo fail, \\(code), \\(desc)")
}
NSDictionary *dict = @{@"category": @"分组 1"};
NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:dict
options:0
error:&error];
if ([data length] > 0 && error == nil) {
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
V2TIMTopicInfo *info = [[V2TIMTopicInfo alloc] init];
info.topicID = @"需要设置的话题 ID";
info.customString = dataStr;
[[V2TIMManager sharedInstance] setTopicInfo:info 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_;
};

V2TIMTopicInfo topicInfo;
topicInfo.topicID = "topicID";
topicInfo.customString = u8"{\\"category\\": \\"分组1\\"}}";
topicInfo.modifyFlag = V2TIMTopicInfoModifyFlag::V2TIM_COMMUNITY_MODIFY_FLAG_TOPIC_CUSTOM_STRING;

auto callback = new Callback;
callback->SetCallback(
[=]() {
// 修改话题信息成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 修改话题信息失败
delete callback;
});

V2TIMManager::GetInstance()->GetCommunityManager()->SetTopicInfo(topicInfo, callback);

获取话题所在分组

直接从 获取话题列表 中,取出 customString 解析 json 即可。

监听话题回调

V2TIMGroupListener (Java / Swift / Objective-C / C++) 中增加了话题相关的回调方法,onTopicCreatedonTopicDeletedonTopicInfoChanged,用来监听话题事件。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMCommunityListener v2TIMCommunityListener = new V2TIMCommunityListener() {
@Override
public void onCreateTopic(String groupID, String topicID) {
// 监听话题创建通知
}

@Override
public void onDeleteTopic(String groupID, List<String> topicIDList) {
// 监听话题删除通知
}

@Override
public void onChangeTopicInfo(String groupID, V2TIMTopicInfo topicInfo) {
// 监听话题信息更新通知
}
@Override
public void onReceiveTopicRESTCustomData(String topicID, byte[] customData) {
// 收到 RESTAPI 下发的话题自定义系统消息
}
};
V2TIMManager.getCommunityManager().addCommunityListener(v2TIMCommunityListener);
V2TIMManager.shared.addCommunityListener(listener: self)

func onCreateTopic(groupID: String, topicID: String) {
print( "groupID:\\(groupID), topicID:\\(topicID)")
}

func onDeleteTopic(groupID: String, topicIDList: Array<String>) {
print( "groupID:\\(groupID), topicIDList:\\(topicIDList)")
}

func onChangeTopicInfo(groupID: String, topicInfo: V2TIMTopicInfo) {
print( "groupID:\\(groupID), topicInfo:\\(topicInfo.description), inheritMsgFlag:\\(topicInfo.isInheritMessageReceiveOptionFromCommunity())")
}

func onReceiveTopicRESTCustomData(topicID: String, data: Data?) {
print( "\\(topicID), data:\\(data?.description ?? "nil")")
}
[[V2TIMManager sharedInstance] addCommunityListener:self];
- (void)onCreateTopic:(NSString *)groupID topicID:(NSString *)topicID {
// 监听话题创建通知
}
- (void)onDeleteTopic:(NSString *)groupID topicIDList:(NSArray<NSString *> *)topicIDList {
// 监听话题删除通知
}
- (void)onChangeTopicInfo:(NSString *)groupID topicInfo:(V2TIMTopicInfo *)topicInfo {
// 监听话题信息更新通知
}

- (void)onReceiveTopicRESTCustomData:(NSString *)topicID data:(NSData *)data {
// 收到 RESTAPI 下发的话题自定义系统消息
}
class CommunityListener final : public V2TIMCommunityListener {
public:
CommunityListener() = default;
~CommunityListener() override = default;

void OnCreateTopic(const V2TIMString& groupID, const V2TIMString& topicID) override {
// 监听话题创建通知
}
void OnDeleteTopic(const V2TIMString& groupID, const V2TIMStringVector& topicIDList) override {
// 监听话题删除通知
}
void OnChangeTopicInfo(const V2TIMString& groupID, const V2TIMTopicInfo& topicInfo) override {
// 监听话题信息更新通知
}
void OnReceiveTopicRESTCustomData(const V2TIMString &topicID, const V2TIMBuffer &customData) {
// 收到 RESTAPI 下发的话题自定义系统消息
}
};

// 添加群事件监听器,注意在移除监听器之前需要保持 groupListener 的生命期,以免接收不到事件回调
CommunityListener communityListener;
V2TIMManager::GetInstance()->GetCommunityManager()->AddCommunityListener(&communityListener);

话题消息

话题消息相关功能跟普通消息使用方法一样,涉及的接口有:
功能
接口
说明
sendMessage (Java / Swift / Objective-C / C++)
参数 groupID 填为话题 topicID
V2TIMAdvancedMsgListener (Java / Swift / Objective-C / C++) 中的 onRecvNewMessage 方法
消息中的 groupID 即为话题 topicID
cleanConversationUnreadMessageCount(Java / Swift / Objective-C /C++
参数 groupID 填为话题 topicID
getGroupHistoryMessageList (Java / Swift / Objective-C / C++)
参数 groupID 填为话题 topicID
revokeMessage (Java / Swift / Objective-C / C++)
参数 groupID 填为话题 topicID


帮助和支持

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

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

文档反馈