搜索云端消息
功能描述
消息云端搜索,提升 App 使用体验必备功能,可以帮助用户从纷繁复杂的信息中直接找到预期内容,快捷方便;也可以作为运营工具,增加相关内容的引导,简洁高效。
说明:
消息云端搜索功能仅 7.3.4358 及以上版本支持,最大支持搜索近360天内的消息数据,与历史消息存储时间保持一致。
该功能为增值功能,详细参见价格说明。
如果您没有开通该服务,调用接口会返回 60020 错误码。
消息搜索类介绍
消息搜索参数类
V2TIMMessageSearchParam
的参数说明如下:参数 | 含义 | 说明 |
keywordList | 关键字列表 | 最多支持 5 个。当消息发送者以及消息类型均未指定时,必须设置关键字列表;否则,关键字列表可以为空。 |
keywordListMatchType | 指定关键字列表匹配类型 | 可设置为 “或” 关系搜索,或 “与” 关系搜索。取值分别为 V2TIM_KEYWORD_LIST_MATCH_TYPE_OR 和 V2TIM_KEYWORD_LIST_MATCH_TYPE_AND 。默认为 “或” 关系搜索。 |
senderUserIDList | 指定 userID 发送的消息 | 最多支持 5 个。 |
messageTypeList | 指定搜索的消息类型集合 | |
conversationID | 搜索 “全部会话” 还是搜索 “指定的会话” | conversationID 为空,搜索全部会话;conversationID 不为空,搜索指定会话。 |
searchTimePosition | 搜索的起始时间点 | 默认为 0(从现在开始搜索)。UTC 时间戳,单位:秒。 |
searchTimePeriod | 从起始时间点开始的过去时间范围 | 默认为 0(不限制时间范围)。24 x 60 x 60 代表过去一天,单位:秒。 |
searchCount | 搜索的数量 | 搜索的数量,最大支持100。 |
searchCursor | 搜索的游标 | 搜索的起始位置,第一次填写空字符串,续拉时填写上一次返回的 V2TIMMessageSearchResult 中的 searchCursor 。 |
消息搜索结果类
参数 | 含义 | 说明 |
totalCount | 搜索结果总数 | 如果搜索指定会话,返回满足搜索条件的消息总数; 如果搜索全部会话,返回满足搜索条件的消息所在的所有会话总数量。 |
messageSearchResultItems | 搜索结果列表 | 如果搜索指定会话,返回结果列表只包含该会话结果; 如果搜索全部会话,会对满足搜索条件的消息根据会话 ID 分组,分页返回分组结果。 |
searchCursor | 续拉的游标 | 调用搜索接口续拉时需要填的游标 |
其中
messageSearchResultItems
是个列表,内含 V2TIMMessageSearchResultItem
(Android / iOS & Mac / Windows)对象,参数说明如下:参数 | 含义 | 说明 |
conversationID | 会话 ID | - |
messageCount | 消息数量 | 当前会话一共搜索到了多少条符合要求的消息。 |
messageList | 满足搜索条件的消息列表 | 如果搜索指定会话, messageList 中装载的是本会话中所有满足搜索条件的消息列表。如果搜索全部会话, messageList 中装载的消息条数会有如下两种可能:如果某个会话中匹配到的消息条数 > 1,则 messageList 为空,您可以在 UI 上显示 “{messageCount } 条相关记录”。如果某个会话中匹配到的消息条数 = 1,则 messageList 为匹配到的那条消息,您可以在 UI 上显示之,并高亮匹配关键词。 |
搜索全部会话的消息
如果您希望在全部会话范围内搜索,只需要将
V2TIMMessageSearchParam
中的 conversationID
设置为空或者不设置即可。示例代码如下:
List<String> keywordList = new ArrayList<>();keywordList.add("abc");keywordList.add("123");V2TIMMessageSearchParam searchParam = new V2TIMMessageSearchParam();// 设置搜索关键字searchParam.setKeywordList(keywordList);// 搜索20条数据searchParam.setSearchCount(20);// 从最新的会话开始搜索searchParam.setSearchCursor("");// 从当前时间开始搜索searchParam.setSearchTimePosition(0);// 搜索10分钟之内的消息searchParam.setSearchTimePeriod(600);V2TIMManager.getMessageManager().searchCloudMessages(searchParam, newV2TIMValueCallback<V2TIMMessageSearchResult>() {@Overridepublic void onSuccess(V2TIMMessageSearchResult v2TIMMessageSearchResult) {// 搜索成功}@Overridepublic void onError(int code, String desc) {// 搜索失败}});
V2TIMMessageSearchParam *param = [[V2TIMMessageSearchParam alloc] init];// 设置搜索关键字param.keywordList = @[@"abc", @"123"];param.messageTypeList = nil;param.conversationID = nil;param.searchTimePosition = 0;param.searchTimePeriod = 0;// 搜索20条数据param.searchCount = 20;// 从最新的会话开始搜索param.searchCursor = @"";[V2TIMManager.sharedInstance searchCloudMessages:paramsucc:^(V2TIMMessageSearchResult *searchResult) {// 搜索成功,searchResult 中返回搜索结果} 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_;};V2TIMMessageSearchParam searchParam;// 设置搜索关键字searchParam.keywordList.PushBack("abc");searchParam.keywordList.PushBack("123");// 搜索20条数据searchParam.searchCount = 20;// 从最新的会话开始搜索searchParam.searchCursor = "";auto callback = new ValueCallback<V2TIMMessageSearchResult>{};callback->SetCallback([=](const V2TIMMessageSearchResult& messageSearchResult) {// 搜索成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索失败delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->SearchCloudMessages(searchParam, callback);
搜索指定会话的消息
示例代码如下:
List<String> keywordList = new ArrayList<>();keywordList.add("abc");keywordList.add("123");V2TIMMessageSearchParam searchParam = new V2TIMMessageSearchParam();// 搜索与用户 user1 的单聊消息searchParam.setConversationID("c2c_user1");// 设置搜索关键字searchParam.setKeywordList(keywordList);// 搜索20条数据searchParam.setSearchCount(20);// 从最新的会话开始搜索searchParam.setSearchCursor("");// 从当前时间开始搜索searchParam.setSearchTimePosition(0);// 搜索10分钟之内的消息searchParam.setSearchTimePeriod(600);V2TIMManager.getMessageManager().searchCloudMessages(searchParam, newV2TIMValueCallback<V2TIMMessageSearchResult>() {@Overridepublic void onSuccess(V2TIMMessageSearchResult v2TIMMessageSearchResult) {// 搜索成功}@Overridepublic void onError(int code, String desc) {// 搜索失败}});
V2TIMMessageSearchParam *param = [[V2TIMMessageSearchParam alloc] init];// 设置搜索关键字param.keywordList = @[@"abc", @"123"];param.messageTypeList = nil;// 搜索与用户 user1 的单聊消息param.conversationID = @"c2c_user1";param.searchTimePosition = 0;param.searchTimePeriod = 0;// 搜索20条数据param.searchCount = 20;// 从最新的会话开始搜索param.searchCursor = @"";[V2TIMManager.sharedInstance searchCloudMessages:paramsucc:^(V2TIMMessageSearchResult *searchResult) {// 搜索成功,searchResult 中返回搜索结果} 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_;};V2TIMMessageSearchParam searchParam;// 搜索与用户 user1 的单聊消息searchParam.conversationID = "c2c_user1";// 设置搜索关键字searchParam.keywordList.PushBack("abc");searchParam.keywordList.PushBack("123");// 搜索20条数据searchParam.searchCount = 20;// 从最新的会话开始搜索searchParam.searchCursor = "";auto callback = new ValueCallback<V2TIMMessageSearchResult>{};callback->SetCallback([=](const V2TIMMessageSearchResult& messageSearchResult) {// 搜索成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索失败delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->SearchCloudMessages(searchParam, callback);
搜索典型场景示例
普通的 IM 聊天软件,搜索界面的展示通常分这几种场景:
图 1:搜索聊天记录 | 图 2:搜索更多聊天记录 | 图 3:搜索指定会话的消息 |
| | |
下文我们将依次向您展示如何利用 IM SDK 的搜索 API 实现上图的典型场景。
展示最近几个活跃的会话
如图 1 所示,最下方是搜索到的消息所属的最近 3 个会话列表,实现方式如下:
1. 设置搜索参数
V2TIMMessageSearchParam
conversationID
设置为 null
,表示搜索所有会话的消息。searchCursor
设置为 "",表示搜索最新的数据。searchCount
设置为 3,表示返回最近的会话数量,UI 上一般显示 3 条。2. 处理搜索回调结果
V2TIMMessageSearchResult
totalCount
表示匹配到的消息所属的所有会话数量。messageSearchResultItems
列表为最近 3(即入参 searchCount
)个会话信息。其中元素 V2TIMMessageSearchResultItem
的 messageCount
表示当前会话搜索到的消息总数量;搜索到的消息条数 > 1,则
messageList
为空,您可以在 UI 上显示 “4 条相关聊天记录”,其中的 4 为 messageCount
。搜索到的消息条数 = 1,则
messageList
为匹配到的那条消息,您可以在 UI 上显示消息内容并高亮搜索关键词,例如搜索典型场景示例图中的 “test”。示例代码如下:
List<String> keywordList = new ArrayList<>();keywordList.add("test");V2TIMMessageSearchParam v2TIMMessageSearchParam = new V2TIMMessageSearchParam();// conversationID 设置为 null 表示搜索所有会话中的消息,结果会按照会话分类v2TIMMessageSearchParam.setConversationID(null);v2TIMMessageSearchParam.setKeywordList(keywordList);v2TIMMessageSearchParam.setSearchCursor("");v2TIMMessageSearchParam.setSearchCount(3);V2TIMManager.getMessageManager().searchCloudMessages(v2TIMMessageSearchParam, new V2TIMValueCallback<V2TIMMessageSearchResult>() {@Overridepublic void onSuccess(V2TIMMessageSearchResult v2TIMMessageSearchResult) {// 匹配到的消息所属的所有会话数量int totalCount = v2TIMMessageSearchResult.getTotalCount();// 最近3个根据消息会话分类的信息List<V2TIMMessageSearchResultItem> resultItemList = v2TIMMessageSearchResult.getMessageSearchResultItems();for (V2TIMMessageSearchResultItem resultItem : resultItemList) {// 会话 IDString conversationID = resultItem.getConversationID();// 该会话匹配到的所有消息数量int totalMessageCount = resultItem.getMessageCount();// 消息列表:如果 totalMessageCount > 1,该列表为空;如果 totalMessageCount = 1,该列表元素为此消息List<V2TIMMessage> v2TIMMessageList = resultItem.getMessageList();}}@Overridepublic void onError(int code, String desc) {}});
V2TIMMessageSearchParam *param = [[V2TIMMessageSearchParam alloc] init];param.keywordList = @[@"test"];// conversationID 设置为 nil 表示搜索所有会话中的消息,结果会按照会话分类param.conversationID = nil;param.searchCursor = @"";param.searchCount = 3;[V2TIMManager.sharedInstance searchCloudMessages:param succ:^(V2TIMMessageSearchResult *searchResult) {// 匹配到的消息所属的所有会话数量NSInteger totalCount = searchResult.totalCount;// 最近3个根据消息会话分类的信息NSArray<V2TIMMessageSearchResultItem *> *messageSearchResultItems = searchResult.messageSearchResultItems;for (V2TIMMessageSearchResultItem *searchItem in messageSearchResultItems) {// 会话 IDNSString *conversationID = searchItem.conversationID;// 该会话匹配到的所有消息数量NSUInteger messageCount = searchItem.messageCount;// 消息列表NSArray<V2TIMMessage *> *messageList = searchItem.messageList ?: @[];}} fail:^(int code, NSString *desc) {// fail}];
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_;};V2TIMMessageSearchParam searchParam;// conversationID 设置为空表示搜索所有会话中的消息,结果会按照会话分类searchParam.conversationID = "";searchParam.keywordList.PushBack("test");searchParam.searchCursor = "";searchParam.searchCount = 3;auto callback = new ValueCallback<V2TIMMessageSearchResult>{};callback->SetCallback([=](const V2TIMMessageSearchResult& messageSearchResult) {// 匹配到的消息所属的所有会话数量uint32_t totalCount = messageSearchResult.totalCount;// 最近3个根据消息会话分类的信息V2TIMMessageSearchResultItemVector messageSearchResultItems =messageSearchResult.messageSearchResultItems;for (size_t i = 0; i < messageSearchResultItems.Size(); ++i) {// 会话 IDV2TIMString conversationID = messageSearchResultItems[i].conversationID;// 该会话匹配到的所有消息数量uint32_t messageCount = messageSearchResultItems[i].messageCount;// 消息列表:如果 messageCount > 1,该列表为空;如果 messageCount = 1,该列表元素为此消息V2TIMMessageVector messageList = messageSearchResultItems[i].messageList;}delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索失败delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->SearchCloudMessages(searchParam, callback);
展示所有搜索到的消息所属会话列表
为了防止内存膨胀,我们强烈建议您分页加载会话列表。
举个例子,分页加载,每页展示 10 条会话结果,搜索参数
V2TIMMessageSearchParam
可以参考如下设置:1. 首次调用:设置参数
searchCount
= 10,searchCursor
= ""。调用 searchCloudMessages
获取消息搜索结果,解析并展示到首页,并且从结果回调中获取会话总数量 totalCount
以及下次请求的游标 searchCursor
。2. 当界面滑动快到底部后根据上一次请求结果中的游标
searchCursor
继续拉取下一页的数据 。示例代码如下:
......// 记录搜索游标String searchCursor = "";......private void searchConversation(String cursor) {List<String> keywordList = new ArrayList<>();keywordList.add("test");V2TIMMessageSearchParam v2TIMMessageSearchParam = new V2TIMMessageSearchParam();v2TIMMessageSearchParam.setConversationID(null);v2TIMMessageSearchParam.setKeywordList(keywordList);v2TIMMessageSearchParam.setSearchCount(10);v2TIMMessageSearchParam.setSearchCursor(cursor);V2TIMManager.getMessageManager().searchCloudMessages(v2TIMMessageSearchParam, newV2TIMValueCallback<V2TIMMessageSearchResult>() {@Overridepublic void onSuccess(V2TIMMessageSearchResult v2TIMMessageSearchResult) {// 匹配到的消息所属的所有会话数量int totalCount = v2TIMMessageSearchResult.getTotalCount();// 下一页的游标searchCursor = v2TIMMessageSearchResult.getSearchCursor();// 该页的根据消息会话分类的信息List<V2TIMMessageSearchResultItem> resultItemList = v2TIMMessageSearchResult.getMessageSearchResultItems();for (V2TIMMessageSearchResultItem resultItem : resultItemList) {// 会话 IDString conversationID = resultItem.getConversationID();// 该会话匹配到的所有消息数量int totalMessageCount = resultItem.getMessageCount();// 消息列表:如果 totalMessageCount > 1,该列表为空;如果 totalMessageCount = 1,该列表元素为此消息List<V2TIMMessage> v2TIMMessageList = resultItem.getMessageList();}}@Overridepublic void onError(int code, String desc) {}});}// 当需要加载下一页时public void loadMore() {searchConversation(searchCursor);}
......// 记录搜索游标NSString *searchCursor = @"";......- (void)searchConversation:(NSString *)cursor {V2TIMMessageSearchParam *param = [[V2TIMMessageSearchParam alloc] init];param.keywordList = @[@"test"];param.conversationID = nil;param.searchCursor = cursor;param.searchCount = 10;[V2TIMManager.sharedInstance searchCloudMessages:param succ:^(V2TIMMessageSearchResult *searchResult) {// 匹配到的消息所属的所有会话数量NSUInteger totalCount = searchResult.totalCount;// 下一页的游标searchCursor = searchResult.searchCursor;// 该页的根据消息会话分类的信息NSArray<V2TIMMessageSearchResultItem *> *messageSearchResultItems = searchResult.messageSearchResultItems;for (V2TIMMessageSearchResultItem *searchItem in messageSearchResultItems) {// 会话 IDNSString *conversationID = searchItem.conversationID;// 该会话匹配到的所有消息数量NSUInteger totalMessageCount = searchItem.messageCount;// 消息列表:如果 totalMessageCount > 1,该列表为空;如果 totalMessageCount = 1,该列表元素为此消息NSArray<V2TIMMessage *> *messageList = searchItem.messageList ?: @[];}} fail:^(int code, NSString *desc) {// fail}];}// 当需要加载下一页时- (void)loadMore {[self searchConversation:searchCursor];}
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 searchCursor = "";void SearchConversation(V2TIMString cursor) {V2TIMMessageSearchParam searchParam;searchParam.keywordList.PushBack("test");searchParam.searchCursor = cursor;searchParam.searchCount = 10;auto callback = new ValueCallback<V2TIMMessageSearchResult>{};callback->SetCallback([=](const V2TIMMessageSearchResult& messageSearchResult) {// 匹配到的消息所属的所有会话数量uint32_t totalCount = messageSearchResult.totalCount;// 下一页的游标searchCursor = messageSearchResult.searchCursor;// 该页的根据消息会话分类的信息V2TIMMessageSearchResultItemVector messageSearchResultItems =messageSearchResult.messageSearchResultItems;for (size_t i = 0; i < messageSearchResultItems.Size(); ++i) {// 会话 IDV2TIMString conversationID = messageSearchResultItems[i].conversationID;// 该会话匹配到的所有消息数量uint32_t messageCount = messageSearchResultItems[i].messageCount;// 消息列表:如果 messageCount > 1,该列表为空;如果 messageCount = 1,该列表元素为此消息V2TIMMessageVector messageList = messageSearchResultItems[i].messageList;}delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索失败delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->SearchLocalMessages(searchParam, callback);}// 当需要加载下一页时void LoadMore() { SearchConversation(searchCursor); }
展示搜索指定会话的消息
1. 搜索参数
V2TIMMessageSearchParam
可以参考如下设置:设置搜索参数
V2TIMMessageSearchParam
的 conversationID
为搜索的会话 ID。首次调用:设置参数
searchCount
= 10,searchCursor
= ""。调用 searchCloudMessages
获取消息搜索结果,解析并展示到首页,并且从结果回调中获取会话总数量 totalCount
以及下一页的游标 searchCursor
。再次调用:更新参数
searchCursor
的值为上一步调用结果中的返回值。2. 处理搜索结果
V2TIMMessageSearchResult
:totalCount
表示该会话匹配到的所有消息数量。messageSearchResultItems
列表只有该会话的结果。列表中的元素 V2TIMMessageSearchResultItem
的 messageCount
为该分页的消息数量,messageList
为该分页的消息列表。searchCursor
表示下一页搜索的起始游标。示例代码如下:
......// 记录搜索游标String searchCursor = "";......private void searchMessage(String cursor) {List<String> keywordList = new ArrayList<>();keywordList.add("test");V2TIMMessageSearchParam v2TIMMessageSearchParam = new V2TIMMessageSearchParam();v2TIMMessageSearchParam.setConversationID(conversationID);v2TIMMessageSearchParam.setKeywordList(keywordList);v2TIMMessageSearchParam.setSearchCount(10);v2TIMMessageSearchParam.setSearcuCursor(cursor);V2TIMManager.getMessageManager().searchCloudMessages(v2TIMMessageSearchParam, newV2TIMValueCallback<V2TIMMessageSearchResult>() {@Overridepublic void onSuccess(V2TIMMessageSearchResult v2TIMMessageSearchResult) {// 该会话匹配到的所有消息数量int totalMessageCount = v2TIMMessageSearchResult.getTotalCount();// 下一页的游标searchCursor = v2TIMMessageSearchResult.getSearchCursor();// 该页消息信息List<V2TIMMessageSearchResultItem> resultItemList = v2TIMMessageSearchResult.getMessageSearchResultItems();for (V2TIMMessageSearchResultItem resultItem : resultItemList) {// 会话 IDString conversationID = resultItem.getConversationID();// 该页的消息数量int totalMessageCount = resultItem.getMessageCount();// 该页的消息数据列表List<V2TIMMessage> v2TIMMessageList = resultItem.getMessageList();}}@Overridepublic void onError(int code, String desc) {}});}// 当需要加载下一页时public void loadMore() {searchMessage(searchCursor);}
......// 记录搜索游标NSString *searchCursor = @"";......- (void)searchMessage:(NSString *)cursor {V2TIMMessageSearchParam *param = [[V2TIMMessageSearchParam alloc] init];param.keywordList = @[@"test"];// conversationID 是要搜索的会话 IDparam.conversationID = conversationID;param.searchCursor = cursor;param.searchCount = 10;[V2TIMManager.sharedInstance searchCloudMessages:param succ:^(V2TIMMessageSearchResult *searchResult) {// 该会话匹配到的所有消息数量NSUInteger totalMessageCount = searchResult.totalCount;// 下一页的游标searchCursor = searchResult.searchCursor;// 该页消息信息NSArray<V2TIMMessageSearchResultItem *> *messageSearchResultItems = searchResult.messageSearchResultItems;for (V2TIMMessageSearchResultItem *searchItem in messageSearchResultItems) {// 会话 IDNSString *conversationID = searchItem.conversationID;// 该页的消息数量NSUInteger totalMessageCount = searchItem.messageCount;// 该页的消息数据列表NSArray<V2TIMMessage *> *messageList = searchItem.messageList ?: @[];}} fail:^(int code, NSString *desc) {// fail}];}// 当需要加载下一页时- (void)loadMore {[self searchMessage:searchCursor];}
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 searchCursor = "";void SearchConversation(V2TIMString cursor) {V2TIMMessageSearchParam searchParam;searchParam.conversationID = conversationID;searchParam.keywordList.PushBack("test");searchParam.searchCursor = cursor;searchParam.searchCount = 10;auto callback = new ValueCallback<V2TIMMessageSearchResult>{};callback->SetCallback([=](const V2TIMMessageSearchResult& messageSearchResult) {// 该会话匹配到的所有消息数量uint32_t totalCount = messageSearchResult.totalCount;// 下一页的游标searchCursor = messageSearchResult.searchCursor;// 该页消息信息V2TIMMessageSearchResultItemVector messageSearchResultItems =messageSearchResult.messageSearchResultItems;for (size_t i = 0; i < messageSearchResultItems.Size(); ++i) {// 会话 IDV2TIMString conversationID = messageSearchResultItems[i].conversationID;// 该页的消息数量uint32_t messageCount = messageSearchResultItems[i].messageCount;// 该页的消息数据列表V2TIMMessageVector messageList = messageSearchResultItems[i].messageList;}delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索失败delete callback;});V2TIMManager::GetInstance()->GetMessageManager()->SearchCloudMessages(searchParam, callback);}// 当需要加载下一页时void LoadMore() { SearchConversation(SearchCursor); }
搜索自定义消息
通常情况下,如果您使用接口
createCustomMessage(data)
(Android / iOS & Mac / Windows)创建自定义消息,该消息无法被搜到,因为 SDK 将该自定义消息保存为二进制数据流。如果您希望自定义消息可以被搜到,需要使用接口
createCustomMessage(data, description, extension)
(Android / iOS & Mac / Windows)来创建并发送自定义消息,把需要搜索的文本放到 description
参数中。如果您配置了离线推送功能,设置参数
description
后,自定义消息也会有离线推送且通知栏展示该参数内容。
如果不需要离线推送可以用发消息接口 sendMessage
(Android / iOS & Mac / Windows)的参数 V2TIMOfflinePushInfo
中的 disablePush
来控制。如果推送的通知栏内容不想展示为被搜索的文本,可以用参数
V2TIMOfflinePushInfo
中的 desc
来另外设置推送内容。搜索富媒体消息
富媒体消息包含文件、图片、语音、视频消息。
对于文件消息,界面通常显示文件名。如果调用
createFileMessage
创建文件消息时传入 fileName
参数,fileName
会作为文件消息被搜索的内容,与搜索关键词进行匹配。如果未设置 fileName
,SDK 则会自动从 filePath
提取文件名作为搜索内容。
fileName
和 filePath
信息会保存到本地和服务器,换设备拉取相关信息后均可搜索。对于图片、语音、视频消息,并没有类似
fileName
这种名称,界面通常显示缩略图或时长,此时指定 keywordList
搜索无效。
如果您希望搜索出此类消息,可以指定 messageTypeList
为 V2TIM_ELEM_TYPE_IMAGE
/V2TIM_ELEM_TYPE_SOUND
/V2TIM_ELEM_TYPE_VIDEO
做分类搜索,此时会搜索出所有指定类型的消息。搜索云端用户
功能描述
您可以通过用户 ID、昵称、性别等信息来搜索云端用户,以便快速找到所需的用户资料。此功能适用于需要查找特定用户信息的场合,例如在熟人社交场景中查找用户以加好友,或者在陌生人社交场景中查找用户以关注。
搜索云端用户接口
调用接口
searchUsers
(Java / Swift / Objective-C / C++) 可以搜索云端用户资料,该接口返回的是云端存储的用户资料,包括好友和非好友资料,您可以调用 checkFriend
(Java / Swift / Objective-C / C++) 接口来判断是否为好友。V2TIMUserSearchParam
的参数说明如下:参数 | 含义 | 说明 |
keywordList | 关键字列表 | 关键字列表最多支持 5 个,keyword 会自动匹配用户 ID、昵称。 |
keywordListMatchType | 指定关键字列表匹配类型 | 可设置为 “或” 关系搜索,或 “与” 关系搜索。取值分别为 V2TIM_KEYWORD_LIST_MATCH_TYPE_OR 和 V2TIM_KEYWORD_LIST_MATCH_TYPE_AND 。默认为 “或” 关系搜索。 |
gender | 用户性别 | 如果不设置,默认男性和女性都会返回。 |
minBirthday | 用户最小生日 | 如果不设置,默认值为 0。 |
maxBirthday | 用户最大生日 | 如果不设置,默认 birthday >= minBirthday 的用户都会返回。 |
searchCount | 搜索的数量 | 必须大于 0,最大支持 100,默认 20。 |
searchCursor | 搜索的游标 | 搜索的起始位置,第一次填写空字符串,续拉时填写上一次返回的 V2TIMUserSearchResult 中的 searchCursor 。 |
用户搜索结果类
参数 | 含义 | 说明 |
isFinished | 搜索是否已完成 | 是否已经返回全部满足搜索条件的用户列表。 |
totalCount | 搜索结果总数 | 满足搜索条件的用户总数量。 |
nextCursor | 续拉的游标 | 调用搜索接口续拉时需要填的游标。 |
userList | 用户列表 | 当前一次云端搜索返回的用户列表。 |
示例代码如下:
V2TIMUserSearchParam searchParam = new V2TIMUserSearchParam();searchParam.setKeywordList(keywordList);searchParam.setKeywordListMatchType(param.V2TIM_KEYWORD_LIST_MATCH_TYPE_OR);searchParam.setSearchCount(20);searchParam.setSearchCursor("");V2TIMManager.getInstance().searchUsers(searchParam, new V2TIMValueCallback<V2TIMUserSearchResult>() {@Overridepublic void onSuccess(V2TIMUserSearchResult userSearchResult) {// 搜索云端用户资料成功}@Overridepublic void onError(int code, String desc) {// 搜索云端用户资料失败}});
let param = V2TIMUserSearchParam()param.gender = .V2TIM_GENDER_UNKNOWN;param.keywordList = ["keyword1", "keyword2"];param.keywordListMatchType = .V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.searchCount = 20;param.searchCursor = "";V2TIMManager.shared.searchUsers(param: param) { searchResult in// 搜索云端用户资料成功} fail: { code, desc in// 搜索云端用户资料失败}
V2TIMUserSearchParam *param = [[V2TIMUserSearchParam alloc] init];param.gender = V2TIM_GENDER_UNKNOWN;param.keywordList = @[@"keyword1", @"keyword2"];param.keywordListMatchType = V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.searchCount = 20;param.searchCursor = @"";[[V2TIMManager sharedInstance] searchUsers:param succ:^(V2TIMUserSearchResult *searchResult) {// 搜索云端用户资料成功} 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_;};V2TIMUserSearchParam searchParam;searchParam.keywordList = keywordList;param.keywordListMatchType = V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.searchCount = 20;param.searchCursor = "";auto callback = new ValueCallback<V2TIMUserSearchResult>{};callback->SetCallback([=](const V2TIMUserSearchResult& userSearchResult) {// 搜索云端用户资料成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索云端用户资料失败delete callback;});V2TIMManager::GetInstance()->SearchUsers(searchParam, callback);
搜索云端群组
功能描述
您可以通过群 ID、群名称等信息搜索云端群组,以便快速找到所需的群组资料。这一功能特别适用于需要查找特定群组的场景,例如在社交场景中寻找兴趣群以加入。
搜索云端群组接口
V2TIMGroupSearchParam
的参数说明如下:参数 | 含义 | 说明 |
keywordList | 关键字列表 | 关键字列表最多支持 5 个,keyword 会自动匹配群 ID、群名称。 |
keywordListMatchType | 指定关键字列表匹配类型 | 可设置为 “或” 关系搜索,或 “与” 关系搜索。取值分别为 V2TIM_KEYWORD_LIST_MATCH_TYPE_OR 和 V2TIM_KEYWORD_LIST_MATCH_TYPE_AND 。默认为 “或” 关系搜索。 |
searchCount | 搜索的数量 | 必须大于 0,最大支持 100,默认 20。 |
searchCursor | 搜索的游标 | 搜索的起始位置,第一次填写空字符串,续拉时填写上一次返回的 V2TIMGroupSearchResult 中的 searchCursor 。 |
群组搜索结果类
参数 | 含义 | 说明 |
isFinished | 搜索是否已完成 | 满足搜索条件的群列表是否已经全部返回。 |
totalCount | 搜索结果总数 | 满足搜索条件的群总数量。 |
nextCursor | 续拉的游标 | 调用搜索接口续拉时需要填的游标。 |
groupList | 群列表 | 当前一次云端搜索返回的群列表。 |
示例代码如下:
V2TIMGroupSearchParam searchParam = new V2TIMGroupSearchParam();searchParam.setKeywordList(keywordList);searchParam.setKeywordListMatchType(param.V2TIM_KEYWORD_LIST_MATCH_TYPE_OR);searchParam.setSearchCount(20);searchParam.setSearchCursor("");V2TIMManager.getGroupManager().searchCloudGroups(searchParam, new V2TIMValueCallback<V2TIMGroupSearchResult>() {@Overridepublic void onSuccess(V2TIMGroupSearchResult groupSearchResult) {// 搜索云端群组成功}@Overridepublic void onError(int code, String desc) {// 搜索云端群组失败}});
let param = V2TIMGroupSearchParam()param.keywordList = ["keyword1", "keyword2"];param.keywordListMatchType = .V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.searchCount = 20;param.searchCursor = "";V2TIMManager.shared.searchCloudGroups(searchParam: param) { searchResult in// 搜索云端群组成功} fail: { code, desc in// 搜索云端群组失败}
V2TIMGroupSearchParam *param = [[V2TIMGroupSearchParam alloc] init];param.keywordList = @[@"keyword1", @"keyword2"];param.keywordListMatchType = V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.searchCount = 20;param.searchCursor = @"";[[V2TIMManager sharedInstance] searchCloudGroups:param succ:^(V2TIMGroupSearchResult *searchResult) {// 搜索云端群组成功} 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_;};V2TIMGroupSearchParam searchParam;searchParam.keywordList = keywordList;searchParam.keywordListMatchType = V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;searchParam.searchCount = 20;searchParam.searchCursor = "";auto callback = new ValueCallback<V2TIMGroupSearchResult>{};callback->SetCallback([=](const V2TIMGroupSearchResult& groupSearchResult) {// 搜索云端群组成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索云端群组失败delete callback;});V2TIMManager::GetInstance()->GetGroupManager()->SearchCloudGroups(searchParam, callback);
搜索云端群成员
功能描述
您可以通过群成员 ID、昵称、名片等信息搜索云端群成员。这一功能特别适用于需要快速查找特定群成员的场景,例如在大型群组中快速查找某个群成员信息。
搜索云端群成员接口
V2TIMGroupMemberSearchParam
的参数说明如下:参数 | 含义 | 说明 |
keywordList | 关键字列表 | 关键字列表最多支持 5 个,keyword 会自动匹配群成员 ID、昵称、群名片。 |
keywordListMatchType | 指定关键字列表匹配类型 | 可设置为 “或” 关系搜索,或 “与” 关系搜索。取值分别为 V2TIM_KEYWORD_LIST_MATCH_TYPE_OR 和 V2TIM_KEYWORD_LIST_MATCH_TYPE_AND 。默认为 “或” 关系搜索。 |
groupIDList | 指定群 ID 列表 | 如果设置 groupIDList 为空,代表搜索全部群中的群成员,返回的结果会按照 groupID 进行分类;如果设置 groupIDList 不为空,代表搜索指定群中的群成员。 |
searchCount | 搜索的数量 | 必须大于 0,最大支持 100,默认 20。 |
searchCursor | 搜索的游标 | 搜索的起始位置,第一次填写空字符串,续拉时填写上一次返回的 V2TIMGroupMemberSearchResult 中的 searchCursor 。 |
群成员搜索结果类
参数 | 含义 | 说明 |
isFinished | 搜索是否已完成 | 满足搜索条件的群成员列表是否已经全部返回。 |
totalCount | 搜索结果总数 | 满足搜索条件的群成员总数量。 |
nextCursor | 续拉的游标 | 调用搜索接口续拉时需要填的游标。 |
memberList | 群成员列表 | 当前一次云端搜索返回的群成员列表。 |
示例代码如下:
V2TIMGroupMemberSearchParam searchParam = new V2TIMGroupMemberSearchParam();searchParam.setKeywordList(keywordList);searchParam.setKeywordListMatchType(param.V2TIM_KEYWORD_LIST_MATCH_TYPE_OR);searchParam.setGroupIDList(groupIDList);searchParam.setSearchCount(20);searchParam.setSearchCursor("");V2TIMManager.getGroupManager().searchCloudGroupMembers(searchParam, new V2TIMValueCallback<V2TIMGroupMemberSearchResult>() {@Overridepublic void onSuccess(V2TIMGroupMemberSearchResult groupMemberSearchResult) {// 搜索云端群成员成功}@Overridepublic void onError(int code, String desc) {// 搜索云端群成员失败}});
let param = V2TIMGroupMemberSearchParam()param.keywordList = ["keyword1", "keyword2"];param.keywordListMatchType = .V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.groupIDList= ["指定群 ID"];param.searchCount = 20;param.searchCursor = "";V2TIMManager.shared.searchCloudGroupMembers(searchParam: param) { searchResult in// 搜索云端群成员成功} fail: { code, desc in// 搜索云端群成员失败}
V2TIMGroupMemberSearchParam *param = [[V2TIMGroupMemberSearchParam alloc] init];param.keywordList = @[@"keyword1", @"keyword2"];param.keywordListMatchType = V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.groupIDList= @[@"指定群 ID"];param.searchCount = 20;param.searchCursor = "";[[V2TIMManager sharedInstance] searchCloudGroupMembers:param succ:^(V2TIMGroupMemberSearchResult *searchResult) {// 搜索云端群成员成功} 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_;};V2TIMGroupMemberSearchParam param;param.keywordList = keywordList;param.keywordListMatchType = V2TIM_KEYWORD_LIST_MATCH_TYPE_OR;param.groupIDList = groupIDList;param.searchCount = 20;param.searchCursor = "";auto callback = new ValueCallback<V2TIMGroupMemberSearchResult>{};callback->SetCallback([=](const V2TIMGroupMemberSearchResult& groupMemberSearchResult) {// 搜索云端群成员成功delete callback;},[=](int error_code, const V2TIMString& error_message) {// 搜索云端群成员失败delete callback;});V2TIMManager::GetInstance()->GetGroupManager()->SearchCloudGroupMembers(param, callback);