功能描述
用户的会话列表中一般会有多个会话,如果某个会话收到了新消息,通常需要在列表的 cell 中以小红点或者数字角标的方式,向用户展示该会话的未读消息数,提醒用户阅读。
用户点击进入该会话,再退回到会话列表,未读消息数被清空,小红点消失。
IM SDK 支持获取所有会话的未读消息总数和根据过滤条件获取部分会话的未读消息总数,将其展示在会话列表的底部 tab 上。
本文将向您介绍如何实现会话未读消息提醒功能。
获取所有会话的未读消息总数
通常情况下,如果您想得到所有会话的未读消息总数,可以遍历会话列表得到每个会话的信息 V2TIMConversation
,然后再把所有的 V2TIMConversation
的 unreadCount
相加起来,展示在 UI 上。
但 IM SDK 为您提供了直接查询所有会话未读消息总数的接口 getTotalUnreadMessageCount
。
当会话的未读总数发生变更时,SDK 还会主动通过回调 onTotalUnreadMessageCountChanged
,将最新的未读总数通知出来。
说明:
- 仅增强版 5.3.425 及以上版本,支持获取所有会话未读消息总数。
- 仅适用于好友工作群(Work)、陌生人社交群(Public)和社群(Community),但直播群(AVChatRoom)和临时会议群(Meeting)暂不适用。群组类型详见 群组介绍。
具体的操作步骤如下文所示:
获取所有会话的未读总数
您可以调用 getTotalUnreadMessageCount
(Android / iOS & Mac / Windows) 获取所有会话的未读消息总数,获取成功后可以使用其更新 UI。
示例代码如下:
V2TIMManager.getConversationManager().getTotalUnreadMessageCount(new V2TIMValueCallback<Long>() {
@Override
public void onSuccess(Long aLong) {
Log.i("imsdk", "success");
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
Log.i(<span class="hljs-string">"imsdk"</span>, <span class="hljs-string">"failure, code:"</span> + code + <span class="hljs-string">", desc:"</span> + desc);
}
});
[[V2TIMManager sharedInstance] getTotalUnreadMessageCount:^(UInt64 totalCount) {
} 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&)>;
<span class="hljs-built_in">ValueCallback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">ValueCallback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">(<span class="hljs-keyword">const</span> T& value)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>(value);
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(error_code, error_message);
}
}
private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};
auto callback = new ValueCallback<uint64_t>{};
callback->SetCallback(
[=](const uint64_t& count) {
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
delete callback;
});
V2TIMManager::GetInstance()->GetConversationManager()->GetTotalUnreadMessageCount(callback);
所有会话的未读总数变更通知
您可以调用 addConversationListener
(Android / iOS & Mac / Windows) 添加会话监听器。添加监听器后,只需要调用过一次 getTotalUnreadMessageCount
接口,才能接收到所有会话的未读总数变更通知。
您可以在 V2TIMConversationListener
中的 onTotalUnreadMessageCountChanged
(Android / iOS & Mac / Windows) 中,获取到变更后的未读总数。
示例代码如下:
public void onTotalUnreadMessageCountChanged(long totalUnreadCount) {
Log.i("imsdk", "onTotalUnreadMessageCountChanged");
}
[[V2TIMManager sharedInstance] addConversationListener:self];
- (void)onTotalUnreadMessageCountChanged:(UInt64)totalUnreadCount {
}
class ConversationListener final : public V2TIMConversationListener {
public:
void OnTotalUnreadMessageCountChanged(uint64_t totalUnreadCount) override {
}
};
ConversationListener conversationListener;
V2TIMManager::GetInstance()->GetConversationManager()->AddConversationListener(&conversationListener);
根据过滤条件获取部分会话的未读消息总数
IM SDK 为您提供了根据过滤条件查询部分会话未读消息总数的接口 getUnreadMessageCountByFilter
。
如果您需要监听指定过滤条件下的会话未读消息总数变更,可以调用 subscribeUnreadMessageCountByFilter
注册监听,当该过滤条件下的会话未读消息总数发生变更时,SDK 还会主动通过回调 onUnreadMessageCountChangedByFilter
,将最新的未读总数通知出来。
说明:
- 仅增强版 7.0.3754 及以上版本,支持根据过滤条件获取部分会话的未读消息总数。
- 仅适用于好友工作群(Work)、陌生人社交群(Public)和社群(Community),但直播群(AVChatRoom)和临时会议群(Meeting)暂不适用。群组类型详见 群组介绍。
具体的操作步骤如下文所示:
获取部分会话的未读消息总数
您可以调用 getUnreadMessageCountByFilter
(Android / iOS & Mac / Windows) 获取部分会话的未读消息总数,获取成功后可以使用其更新 UI。其中过滤条件 V2TIMConversationListFilter
详解如下:
属性 |
含义 |
说明 |
type |
会话类型(填 0 代表不过滤此项) |
C2C 或者群组会话 |
conversationGroup |
会话分组名称(不填写代表不过滤此项) |
不是群组名称,是会话分组的名称,参考文档 会话分组 |
markType |
会话标记类型(填 0 代表不过滤此项) |
参考文档 会话标记 |
示例代码如下:
V2TIMConversationListFilter filter = new V2TIMConversationListFilter();
filter.setConversationType(V2TIMConversation.V2TIM_GROUP);
filter.setConversationGroup("conversation_group");
filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR);
V2TIMManager.getConversationManager().getUnreadMessageCountByFilter(filter, new V2TIMValueCallback<Long>() {
@Override
public void onSuccess(Long totalUnreadCount) {
tvLog.setText("getUnreadMessageCountByFilter success, totalUnreadCount:" + totalUnreadCount);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
tvLog.setText(<span class="hljs-string">"getUnreadMessageCountByFilter failed"</span>);
}
});
V2TIMConversationListFilter *filter = [[V2TIMConversationListFilter alloc] init];
filter.type = V2TIM_GROUP;
filter.conversationGroup = @"conversation_group";
filter.markType = V2TIM_CONVERSATION_MARK_TYPE_STAR;
[[V2TIMManager sharedInstance] getUnreadMessageCountByFilter:filter succ:^(UInt64 totalUnreadCount) {
[self appendString:[NSString stringWithFormat:@"getUnreadMessageCountByFilter success totalUnreadCount:%llu", totalUnreadCount]];
} fail:^(int code, NSString *desc) {
[self appendString:[NSString stringWithFormat:@"getUnreadMessageCountByFilter failed"]];
}];
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&)>;
<span class="hljs-built_in">ValueCallback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">ValueCallback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">(<span class="hljs-keyword">const</span> T& value)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>(value);
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(error_code, error_message);
}
}
private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};
auto callback = new ValueCallback<uint64_t>{};
callback->SetCallback(
[=](const uint64_t& count) {
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
delete callback;
});
V2TIMConversationListFilter filter;
filter.type = V2TIM_GROUP;
filter.conversationGroup = "conversation_group";
filter.markType = V2TIM_CONVERSATION_MARK_TYPE_STAR;
V2TIMManager::GetInstance()->GetConversationManager()->GetUnreadMessageCountByFilter(filter, callback);
注册监听部分会话的未读消息总数变更
您可以调用 addConversationListener
(Android / iOS & Mac / Windows) 添加会话监听器。添加监听器后,需要您调用 subscribeUnreadMessageCountByFilter
(Android / iOS & Mac / Windows) 接口,注册监听指定过滤条件下的未读消息总数变更。
您可以在 V2TIMConversationListener
中的 onUnreadMessageCountChangedByFilter
(Android / iOS & Mac / Windows) 中,获取到变更后的未读总数。
您可以注册监听多个不同过滤条件下的未读总数变更,onUnreadMessageCountChangedByFilter
回调的 filter 参数就是调用 subscribeUnreadMessageCountByFilter
时指定的 filter,该 filter 携带了 conversationType、conversationGroup 和 markType 三个字段,通过判断这三字段是不是都相同,来区分出不同的过滤条件。
示例代码如下:
V2TIMManager.getConversationManager().addConversationListener(conversationListener);
V2TIMConversationListFilter filter = new V2TIMConversationListFilter();
filter.setConversationType(V2TIMConversation.V2TIM_GROUP);
filter.setConversationGroup("conversation_group");
filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR);
V2TIMManager.getConversationManager().subscribeUnreadMessageCountByFilter(filter);
public void onUnreadMessageCountChangedByFilter(V2TIMConversationListFilter filter, long totalUnreadCount) {
Log.i(TAG, "onUnreadMessageCountChangedByFilter:" + totalUnreadCount + "\n");
}
[[V2TIMManager sharedInstance] addConversationListener:self];
V2TIMConversationListFilter *filter = [[V2TIMConversationListFilter alloc] init];
filter.type = V2TIM_GROUP;
filter.conversationGroup = @"conversation_group";
filter.markType = V2TIM_CONVERSATION_MARK_TYPE_STAR;
[[V2TIMManager sharedInstance] subscribeUnreadMessageCountByFilter:filter];
- (void)onUnreadMessageCountChangedByFilter:(V2TIMConversationListFilter *)filter totalUnreadCount:(UInt64)totalUnreadCount {
}
class ConversationListener final : public V2TIMConversationListener {
public:
void OnUnreadMessageCountChangedByFilter(const V2TIMConversationListFilter &filter, uint64_t totalUnreadCount) override {
}
};
ConversationListener conversationListener;
V2TIMManager::GetInstance()->GetConversationManager()->AddConversationListener(&conversationListener);
V2TIMConversationListFilter filter;
filter.type = V2TIM_GROUP;
filter.conversationGroup = "conversation_group";
filter.markType = V2TIM_CONVERSATION_MARK_TYPE_STAR;
V2TIMManager::GetInstance()->GetConversationManager()->SubscribeUnreadMessageCountByFilter(filter);
取消监听部分会话的未读消息总数变更
您可以调用 unsubscribeUnreadMessageCountByFilter
(Android / iOS & Mac / Windows) 接口,取消监听指定过滤条件下的未读消息总数变更。
示例代码如下:
V2TIMConversationListFilter filter = new V2TIMConversationListFilter();
filter.setConversationType(V2TIMConversation.V2TIM_GROUP);
filter.setConversationGroup("conversation_group");
filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_STAR);
V2TIMManager.getConversationManager().unsubscribeUnreadMessageCountByFilter(filter);
V2TIMConversationListFilter *filter = [[V2TIMConversationListFilter alloc] init];
filter.type = V2TIM_GROUP;
filter.conversationGroup = @"conversation_group";
filter.markType = V2TIM_CONVERSATION_MARK_TYPE_STAR;
[[V2TIMManager sharedInstance] unsubscribeUnreadMessageCountByFilter:filter];
V2TIMConversationListFilter filter;
filter.type = V2TIM_GROUP;
filter.conversationGroup = "conversation_group";
filter.markType = V2TIM_CONVERSATION_MARK_TYPE_STAR;
V2TIMManager::GetInstance()->GetConversationManager()->UnsubscribeUnreadMessageCountByFilter(filter);
[](id:markMessageAsRead)
## 清空会话未读消息数
用户点击进入会话后,再退回到会话列表,需要清除未读消息数。清除后,会话列表的小红点或数字角标需要随之消失。
IM SDK 针对待清空会话未读数的不同会话类型,提供了 3 个 API:
* 清空**单聊**会话未读消息数 `markC2CMessageAsRead`。
* 清空**群聊**会话未读消息数 `markGroupMessageAsRead`。
* 清空**全部**会话未读消息数 `markAllMessageAsRead`。
具体的操作步骤如下文所示。
说明:
清空会话未读消息数功能仅增强版 5.8.1668 及以上版本支持。
单聊
您可以调用 markC2CMessageAsRead
(Android / iOS & Mac / Windows) 清空指定单聊会话的未读消息数。
示例代码如下:
String userID = "userID";
V2TIMManager.getMessageManager().markC2CMessageAsRead(userID, new V2TIMCallback() {
@Override
public void onSuccess() {
Log.i("imsdk", "success");
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
Log.i(<span class="hljs-string">"imsdk"</span>, <span class="hljs-string">"failure, code:"</span> + code + <span class="hljs-string">", desc:"</span> + desc);
}
});
[[V2TIMManager sharedInstance] markC2CMessageAsRead:@"conversationID"
succ:^{
} fail:^(int code, NSString *msg) {
}];
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;
<span class="hljs-built_in">Callback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">Callback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">()</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>();
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(error_code, error_message);
}
}
private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};
V2TIMString userID = u8"userID";
auto callback = new Callback;
callback->SetCallback(
= {
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
delete callback;
});
V2TIMManager::GetInstance()->GetMessageManager()->MarkC2CMessageAsRead(userID, callback);
当本端调用 markC2CMessageAsRead
成功后:
- 如果调用者事先调用
addConversationListener
添加了会话监听器,会收到 onConversationChanged
回调,可以在此回调中更新 UI。
- 对端会收到
onRecvC2CReadReceipt
回调,回调里面会携带清空会话未读数的时间戳。
示例代码如下:
public void onConversationChanged(List<V2TIMConversation> conversationList) {
Log.i("imsdk", "onConversationChanged");
}
public void onRecvC2CReadReceipt(List<V2TIMMessageReceipt> receiptList) {
Log.i("imsdk", "onRecvC2CReadReceipt");
}
[[V2TIMManager sharedInstance] addConversationListener:self];
- (void)onConversationChanged:(NSArray<V2TIMConversation*> *)conversationList {
}
- (void)onRecvC2CReadReceipt:(NSArray<V2TIMMessageReceipt *> *)receiptList {}
class ConversationListener final : public V2TIMConversationListener {
public:
void OnConversationChanged(const V2TIMConversationVector& conversationList) override {}
};
ConversationListener conversationListener;
V2TIMManager::GetInstance()->GetConversationManager()->AddConversationListener(&conversationListener);
class AdvancedMsgListener final : public V2TIMAdvancedMsgListener {
public:
void OnRecvC2CReadReceipt(const V2TIMMessageReceiptVector& receiptList) override {}
};
AdvancedMsgListener advancedMsgListener;
V2TIMManager::GetInstance()->GetMessageManager()->AddAdvancedMsgListener(&advancedMsgListener);
群聊
您可以调用 markGroupMessageAsRead
(Android / iOS & Mac / Windows) 清空指定群聊会话的未读消息数。
示例代码如下:
String groupID = "groupID";
V2TIMManager.getMessageManager().markGroupMessageAsRead(groupID, new V2TIMCallback() {
@Override
public void onSuccess() {
Log.i("imsdk", "success");
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
Log.i(<span class="hljs-string">"imsdk"</span>, <span class="hljs-string">"failure, code:"</span> + code + <span class="hljs-string">", desc:"</span> + desc);
}
});
[[V2TIMManager sharedInstance] markGroupMessageAsRead:@"conversationID"
succ:^{
} fail:^(int code, NSString *msg) {
}];
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;
<span class="hljs-built_in">Callback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">Callback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">()</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>();
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(error_code, error_message);
}
}
private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};
V2TIMString groupID = u8"groupID";
auto callback = new Callback;
callback->SetCallback(
= {
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
delete callback;
});
V2TIMManager::GetInstance()->GetMessageManager()->MarkGroupMessageAsRead(groupID, callback);
当 markGroupMessageAsRead
调用成功后,如果调用者事先调用 addConversationListener
添加了会话监听器,会收到 onConversationChanged
回调,可以在此回调中更新 UI。
示例代码如下:
public void onConversationChanged(List<V2TIMConversation> conversationList) {
Log.i("imsdk", "onConversationChanged");
}
[[V2TIMManager sharedInstance] addConversationListener:self];
- (void)onConversationChanged:(NSArray<V2TIMConversation*> *)conversationList {
}
class ConversationListener final : public V2TIMConversationListener {
public:
void OnConversationChanged(const V2TIMConversationVector& conversationList) override {}
};
ConversationListener conversationListener;
V2TIMManager::GetInstance()->GetConversationManager()->AddConversationListener(&conversationListener);
所有会话
您可以调用 markAllMessageAsRead
(Android / iOS & Mac / Windows) 清空所有会话的未读消息数。
示例代码如下:
V2TIMManager.getMessageManager().markAllMessageAsRead(new V2TIMCallback() {
@Override
public void onSuccess() {
Log.i("imsdk", "success");
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
Log.i(<span class="hljs-string">"imsdk"</span>, <span class="hljs-string">"failure, code:"</span> + code + <span class="hljs-string">", desc:"</span> + desc);
}
});
[[V2TIMManager sharedInstance] markAllMessageAsRead:^{
} fail:^(int code, NSString *desc) {
}];
class Callback final : public V2TIMCallback {
public:
using SuccessCallback = std::function<void()>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;
<span class="hljs-built_in">Callback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">Callback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">()</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>();
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(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;
});
V2TIMManager::GetInstance()->GetMessageManager()->MarkAllMessageAsRead(callback);
当 markAllMessageAsRead
调用成功后,如果调用者事先调用 addConversationListener
添加了会话监听器,会收到 onConversationChanged
回调,可以在此回调中更新 UI。
示例代码如下:
public void onConversationChanged(List<V2TIMConversation> conversationList) {
Log.i("imsdk", "onConversationChanged");
}
[[V2TIMManager sharedInstance] addConversationListener:self];
- (void)onConversationChanged:(NSArray<V2TIMConversation*> *)conversationList {
}
class ConversationListener final : public V2TIMConversationListener {
public:
void OnConversationChanged(const V2TIMConversationVector& conversationList) override {}
};
ConversationListener conversationListener;
V2TIMManager::GetInstance()->GetConversationManager()->AddConversationListener(&conversationListener);
发送不计入会话未读数的消息
正常情况下,无论是发送单聊消息还是群聊消息,都会计入未读消息数(通过会话对象 V2TIMConversation
的 unreadCount
接口,可以拿到一个会话的未读消息数)。
当您希望发送一些不计入未读计数的消息,例如提示类或者控制类的消息,可以在调用 sendMessage
时:
- 对于 Android 而言,调用
setExcludedFromUnreadCount
方法,设置为 true
。
- 对于 iOS/Windows 而言,设置消息对象的
isExcludedFromUnreadCount
为 YES
/true
。
发送消息 sendMessage
的使用参考:发送消息。
说明:
setExcludedFromUnreadCount
或 isExcludedFromUnreadCount
参数仅增强版 5.3.425 及以上版本支持。
示例代码如下:
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createTextMessage(content);
v2TIMMessage.setExcludedFromUnreadCount(true);
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "userID", null, V2TIMMessage.V2TIM_PRIORITY_DEFAULT, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onSuccess(V2TIMMessage v2TIMMessage) {
Log.i("imsdk", "success");
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onProgress</span><span class="hljs-params">(<span class="hljs-keyword">int</span> progress)</span> </span>{
Log.i(<span class="hljs-string">"imsdk"</span>, <span class="hljs-string">"progress:"</span> + progress);
}
<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> code, String desc)</span> </span>{
Log.i(<span class="hljs-string">"imsdk"</span>, <span class="hljs-string">"failure, code:"</span> + code + <span class="hljs-string">", desc:"</span> + desc);
}
});
V2TIMMessage *message = [[V2TIMManager sharedInstance] createTextMessage:@"这是一个信令消息"];
message.isExcludedFromUnreadCount = YES;
[[V2TIMManager sharedInstance] sendMessage:msg receiver:@"userA" groupID:nil
priority:V2TIM_PRIORITY_DEFAULT onlineUserOnly:YES offlinePushInfo:nil progress:^(uint32_t progress) {
} succ:^{
} fail:^(int code, NSString *msg) {
}];
class SendCallback final : public V2TIMSendCallback {
public:
using SuccessCallback = std::function<void(const V2TIMMessage&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;
using ProgressCallback = std::function<void(uint32_t)>;
<span class="hljs-built_in">SendCallback</span>() = <span class="hljs-keyword">default</span>;
~<span class="hljs-built_in">SendCallback</span>() <span class="hljs-keyword">override</span> = <span class="hljs-keyword">default</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">SetCallback</span><span class="hljs-params">(SuccessCallback success_callback, ErrorCallback error_callback,
ProgressCallback progress_callback)</span> </span>{
success_callback_ = std::<span class="hljs-built_in">move</span>(success_callback);
error_callback_ = std::<span class="hljs-built_in">move</span>(error_callback);
progress_callback_ = std::<span class="hljs-built_in">move</span>(progress_callback);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnSuccess</span><span class="hljs-params">(<span class="hljs-keyword">const</span> V2TIMMessage& message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (success_callback_) {
<span class="hljs-built_in">success_callback_</span>(message);
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnError</span><span class="hljs-params">(<span class="hljs-keyword">int</span> error_code, <span class="hljs-keyword">const</span> V2TIMString& error_message)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (error_callback_) {
<span class="hljs-built_in">error_callback_</span>(error_code, error_message);
}
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">OnProgress</span><span class="hljs-params">(<span class="hljs-keyword">uint32_t</span> progress)</span> <span class="hljs-keyword">override</span> </span>{
<span class="hljs-keyword">if</span> (progress_callback_) {
<span class="hljs-built_in">progress_callback_</span>(progress);
}
}
private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
ProgressCallback progress_callback_;
};
V2TIMMessage message = V2TIMManager::GetInstance()->GetMessageManager()->CreateTextMessage(u8"content");
message.isExcludedFromUnreadCount = true;
auto callback = new SendCallback{};
callback->SetCallback([=](const V2TIMMessage& message) { delete callback; },
[=](int error_code, const V2TIMString& error_message) { delete callback; },
[=](uint32_t progress) {});
V2TIMManager::GetInstance()->GetMessageManager()->SendMessage(
message, u8"userID", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);
本页内容是否解决了您的问题?