• UIKit
  • SDK
  • 服务端 API
Chat/
SDK/
Android/
会话/
SDK
  • 集成 SDK
  • 初始化
  • 登录登出
  • 消息
    • 介绍
    • 发送消息
    • 接收消息
    • 历史消息
    • 转发消息
    • 消息变更
    • 插入消息
    • 删除消息
    • 清空消息
    • 撤回消息
    • 在线消息
    • 已读回执
    • 查询消息
    • 群 @ 消息
    • 群定向消息
    • 消息免打套
    • 消息扩展
    • 消息回应
    • 消息翻译
    • 消息置顶
  • 会话
    • 介绍
    • 会话列表
    • 获取会话
    • 会话未读数
    • 置顶会话
    • 删除会话
    • 会话草稿
    • 会话标记
    • 会话分组
  • 群组
    • 介绍
    • 管理群组
    • 群资料
    • 管理群成员
    • 群成员资料
    • 自定义属性
    • 群计数器
  • 社群话题
    • 管理社群
    • 权限组
  • 用户
    • 用户资料
    • 用户状态
    • 管理好友
    • 好友分组
    • 黑名单
    • 关注与粉丝
  • 本地搜索
    • 搜索消息
    • 搜索好友
    • 搜索群组
    • 搜索群成员
  • 信令
  • 客户端 API
    • Java
  • 开发指引
  • 控制台指南
    • 创建和升级应用
    • 基本配置
    • 功能配置
    • 账号管理
    • 群组管理
    • 回调配置
  • 产品介绍
    • 消息管理
      • 单聊消息
      • 消息存储
      • 离线推送
      • 群消息
      • 消息格式
    • 账号系统
      • 登陆验证
      • 在线状态管理
    • 群相关
      • 群组系统
      • 群组管理
    • 用户资料和关系链
      • 资料管理
      • 关系链管理
  • 购买指南
    • 计费概述
    • 价格中心
  • 错误码

会话标记

功能描述

在某些场景下,您可能需要对会话进行标记,例如 "会话标星"、"会话折叠"、"会话隐藏"、“会话标记未读”等,您可以调用以下接口实现。
说明:
该功能仅对进阶版客户开放,购买进阶版后可使用。
该功能仅增强版 SDK 6.5.2803 及以上版本支持。

效果展示

使用本功能,您可以在您的 App 中实现如下的会话标记效果:




接口说明

标记会话

您可以调用 markConversation (Android / iOS & Mac / Windows) 接口标记或者取消标记会话。
注意:
当用户标记了会话,SDK 只是简单记录了会话的标记值,并不会改变会话的底层逻辑,比如标记会话为 V2TIM_CONVERSATION_MARK_TYPE_UNREAD,会话的底层的未读数并不会发生改变。
标记会话接口入参详解如下:
属性
含义
说明
conversationIDList
会话 ID 列表
一次标记最大支持 100 个会话
markType
标记类型
会话标星、会话标记未读、会话折叠、会话隐藏等
enableMark
标记/取消标记
标记或取消标记
SDK 提供了四个默认标记("会话标星"、"会话折叠"、"会话隐藏"、“会话标记未读”),如果已有标记不能满足您的需求,您可以自定义扩展标记,扩展标记需要满足以下两个条件:
1. 扩展标记值不能和已有的标记值冲突。
2. 扩展标记值必须是 0x1LL << n 的位移值(32 <= n < 64,即 n 必须大于等于 32 并且小于 64),比如扩展标记值 0x1LL << 32 表示 "iPhone 在线"。
示例代码如下:
Android
iOS & Mac
Windows
List<String> conversationIDList = new ArrayList<>();
conversationIDList.add("c2c_user1");
// 标记类型
long markType = V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR;
// 扩展标记类型
// long markType = 0x1L << 32;
V2TIMManager.getConversationManager().markConversation(conversationIDList, markType, true, new V2TIMValueCallback<List<V2TIMConversationOperationResult>>() {
@Override
public void onSuccess(List<V2TIMConversationOperationResult> v2TIMConversationOperationResults) {
// 标记会话成功
}

@Override
public void onError(int code, String desc) {
// 标记会话失败
}
});
// 标记类型
NSNumber *markType = @(V2TIM_CONVERSATION_MARK_TYPE_STAR);
// 扩展标记类型
// NSNumber *markType = @(0x1LL << 32);
// 标记会话
BOOL enableMark = YES;
// 取消标记会话
// BOOL enableMark = NO;
[[V2TIMManager sharedInstance] markConversation:@[@"c2c_yahaha"] markType:markType enableMark:enableMark succ:^(NSArray<V2TIMConversationOperationResult *> *result){
// 标记会话成功
} 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 conversationIDList;
conversationIDList.PushBack(u8"c2c_user1");
// 标记类型
uint64_t markType = V2TIMConversationMarkType::V2TIM_CONVERSATION_MARK_TYPE_STAR;
// 扩展标记类型
uint64_t markType = static_cast<uint64_t>(0x1) << 32;

auto callback = new ValueCallback<V2TIMConversationOperationResultVector>{};
callback->SetCallback(
[=](const V2TIMConversationOperationResultVector& conversationOperationResultList) {
// 标记会话成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 标记会话失败
delete callback;
});

V2TIMManager::GetInstance()->GetConversationManager()->MarkConversation(conversationIDList, markType, true,
callback);

监听会话标记变更通知

会话被标记或者取消标记后,会话 V2TIMConversationmarkList (Android / iOS & Mac / Windows) 字段会发生变更,您可以调用 addConversationListener (Android / iOS & Mac / Windows) 接口监听会话变更通知。
示例代码如下:
Android
iOS & Mac
Windows
V2TIMConversationListener listener = new V2TIMConversationListener() {
@Override
public void onConversationChanged(List<V2TIMConversation> conversationList) {
for (V2TIMConversation conversation : conversationList) {
// 获取会话新的标记信息
List<Long> markList = conversation.getMarkList();
}
}
};
V2TIMManager.getConversationManager().addConversationListener(listener);
// 删除会话分组
[[V2TIMManager sharedInstance] addConversationListener:self];
- (void)onConversationChanged:(NSArray<V2TIMConversation*> *) conversationList
{
for (V2TIMConversation *conv in conversationList) {
// 获取会话新的标记信息
NSArray *mark_list = conv.markList;
}
}
class ConversationListener final : public V2TIMConversationListener {
public:
void OnConversationChanged(const V2TIMConversationVector& conversationList) override {
for (size_t i = 0; i < conversationList.Size(); ++i) {
const V2TIMConversation& conversation = conversationList[i];
// 获取会话新的标记信息
const UInt64Vector& markList = conversation.markList;
}
}
// 其他成员 ...
};

// 添加会话事件监听器,注意在移除监听器之前需要保持 conversationListener 的生命期,以免接收不到事件回调
ConversationListener conversationListener;
V2TIMManager::GetInstance()->GetConversationManager()->AddConversationListener(&conversationListener);

拉取指定标记会话

您可以调用 getConversationListByFilter (Android / iOS & Mac / Windows) 接口拉取指定标记会话。
示例代码如下:
Android
iOS & Mac
Windows
V2TIMConversationListFilter filter = new V2TIMConversationListFilter();
filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR);
filter.setCount(50);
filter.setNextSeq(0);
V2TIMManager.getConversationManager().getConversationListByFilter(filter, new V2TIMValueCallback<V2TIMConversationResult>() {
@Override
public void onSuccess(V2TIMConversationResult v2TIMConversationResult) {
// 获取会话列表成功
}

@Override
public void onError(int code, String desc) {
// 获取会话列表失败
}
});
// 拉取指定标记会话
V2TIMConversationListFilter *filter = [[V2TIMConversationListFilter alloc] init];
filter.markType = V2TIM_CONVERSATION_MARK_TYPE_STAR;
filter.count = 50;
filter.nextSeq = 0;
[[V2TIMManager sharedInstance] getConversationListByFilter:filter succ:^(NSArray<V2TIMConversation *> *list, uint64_t nextSeq, BOOL isFinished) {
// 获取会话列表成功,list 为会话列表
} 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_;
};

V2TIMConversationListFilter filter;
filter.nextSeq = 0;
filter.count = 50;
filter.markType = V2TIMConversationMarkType::V2TIM_CONVERSATION_MARK_TYPE_STAR;

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

V2TIMManager::GetInstance()->GetConversationManager()->GetConversationListByFilter(filter, callback);