跳到主要内容

搜索消息

提示
  • 搜索消息功能仅支持搜索本地数据库中存储的消息。
  • 从 5.3.0 版本开始,建议使用示例代码中异步返回结果的接口,原同步接口同时废弃。

您可以通过 IMLib SDK 的相关搜索接口通过关键词、消息类型等条件搜索会话中的符合条件的消息列表,同时支持按时间段搜索。您也可以通过用户 userId 搜索指定会话中符合条件的消息列表。

支持关键字搜索的消息需要实现 RCMessageCoding 协议的 getSearchableWords 方法:

  • 内置的消息类型中文本消息(RCTextMessage),文件消息(RCFileMessage),和图文消息RCRichContentMessage 类型默认实现了 RCMessageCoding 协议的 getSearchableWords 方法。
  • 自定义消息类型也可以支持关键字搜索,需要您参考文档自行实现 getSearchableWords 方法。详见自定义消息类型

如何实现基于关键字的全局搜索:

  1. 根据关键字搜索本地存储的全部会话,获取包含关键字的会话列表。
  2. 根据搜索会话返回的会话列表数据,调用搜索单个会话的方法,搜索符合条件的消息。

搜索符合条件的会话

您可以通过 searchConversations: 按关键字、消息类型搜索本地存储的符合查找条件的所有会话列表([RCSearchConversationResult])。

接口原型

Objective C
- (void)searchConversations:(NSArray<NSNumber *> *)conversationTypeList
messageType:(NSArray<NSString *> *)objectNameList
keyword:(NSString *)keyword
completion:(nullable void(^)(NSArray<RCSearchConversationResult *> *_Nullable results))completion;

参数说明

参数类型说明
conversationTypeListNSArray会话类型列表,包含 RCConversationType
objectNameListNSArray消息类型列表,IMLib SDK 内置消息类型仅支持 RC:TxtMsg(文本消息)、RC:FileMsg(文件消息)、RC:ImgTextMsg(图文消息 )。
keywordNSString关键字。不可为空。 自定义的消息必须要实现 RCMessageContent 的 getSearchableWords 接口才能进行搜索。
completionBlock异步回调。results 中返回 [RCSearchConversationResult] 列表。

示例代码

Objective C
NSArray *conversationTypeList = @[@(ConversationType_PRIVATE)];
NSArray *objectNameList = @[@"RC:TxtMsg"];

[[RCCoreClient sharedCoreClient] searchConversations:conversationTypeList
messageType:objectNameList
keyword:@"搜索的关键字"
completion:^(NSArray<RCSearchConversationResult *> * _Nullable results) {
//异步回调
}];

在指定单个会话中搜索

您可以通过不同的方法策略来搜索指定单个会话中符合条件的消息。

根据关键字搜索消息

您可以在本地数据库中根据关键字搜索指定会话中的消息,支持搜索指定时间点之前的历史消息记录,回调中返回符合搜索条件的消息列表。

接口原型

Objective C
- (void)searchMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
keyword:(NSString *)keyword
count:(int)count
startTime:(long long)startTime
completion:(nullable void(^)(NSArray<RCMessage *> *_Nullable messages))completion;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型,单聊传入 ConversationType_PRIVATE
targetIdNSString会话 targetId
keywordNSString关键字。传空默认为是查全部符合条件的消息。
countint最大的查询数量
startTimelong long查询记录的起始时间。传 0 时从最新消息开始搜索,非 0 时从该时间往前搜索。
completionBlock异步回调。messages 中返回匹配的 RCMessage 列表。

示例代码

Objective C
[[RCCoreClient sharedCoreClient] searchMessages:ConversationType_PRIVATE
targetId:@"会话 ID"
keyword:searchText
count:50
startTime:0
completion:^(NSArray<RCMessage *> * _Nullable messages) {
//异步回调
}];

根据关键字搜索指定时间段的消息

您可以在指定会话中搜索指定的时间范围内,符合关键字的本地消息,回调中返回符合搜索条件的消息列表。

接口原型

Objective C
- (void)searchMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
keyword:(NSString *)keyword
startTime:(long long)startTime
endTime:(long long)endTime
offset:(int)offset
limit:(int)limit
completion:(nullable void(^)(NSArray<RCMessage *> *_Nullable messages))completion;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型,单聊传入 ConversationType_PRIVATE
targetIdNSString会话 ID
keywordNSString关键字。传空默认为是查全部符合条件的消息。
startTimelong long查询记录的起始时间。传 0 时从最新消息开始搜索,非 0 时从该时间往前搜索。
endTimelong long结束时间
offsetint偏移量。要求 ≧ 0。
limitint返回的搜索结果数量,limit 需大于 0。最大值为 100。超过 100 时默认返回 100 条。
completionBlock异步回调。messages 中返回符合搜索条件的 RCMessage 列表。

示例代码

Objective C
[[RCCoreClient sharedCoreClient] searchMessages:ConversationType_PRIVATE
targetId:@"会话 ID"
keyword:searchText
startTime:startTime
endTime:endTime
offset:0
limit:100
completion:^(NSArray<RCMessage *> * _Nullable messages) {
//异步回调
}];

根据用户 userId 搜索消息

您可以在指定会话中搜索指定用户 userId 发送的消息,支持搜索指定时间点之前的本地的历史消息记录,回调中返回符合搜索条件的消息列表。

接口原型

Objective C
- (void)searchMessages:(RCConversationType)conversationType
targetId:(NSString *)targetId
userId:(NSString *)userId
count:(int)count
startTime:(long long)startTime
completion:(nullable void(^)(NSArray<RCMessage *> *_Nullable messages))completion;

参数说明

参数类型说明
conversationTypeRCConversationType会话类型,单聊传入 ConversationType_PRIVATE
userIdNSString消息发送方的用户 userId
countint最大的查询数量
startTimelong long查询记录的起始时间。传 0 时从最新消息开始搜索,非 0 时从该时间往前搜索。
completionBlock异步回调。messages 中返回匹配的 RCMessage 列表。

示例代码

Objective C
[[RCCoreClient sharedCoreClient] searchMessages:ConversationType_PRIVATE
targetId:@"接收方 id"
userId:@"userId"
count:50
startTime:0
completion:^(NSArray<RCMessage *> * _Nullable messages) {
//异步回调
}];

根据消息类型搜索消息

您可以在指定会话中搜索匹配关键字的指定消息类型的消息,支持搜索指定时间点之前的本地的历史消息记录,回调中返回符合搜索条件的消息列表。

接口原型

Objective C
- (void)searchMessages:(RCConversationIdentifier *)conversationIdentifier
keyword:(NSString *)keyword
objectNameList:(NSArray<NSString *> *)objectNameList
limit:(int)limit
startTime:(long long)startTime
success:(nullable void (^)(NSArray<RCMessage *> *messages))successBlock
error:(nullable void (^)(RCErrorCode status))errorBlock;

参数说明

参数类型说明
conversationType[RCConversationIdentifier]会话标识,通过会话类型与 targetId 标识一个会话,超级群会话需要对应的 channelId
keywordNSString关键字。传空默认为是查全部符合条件的消息。
objectNameListNSArray消息类型数组
limitint返回的搜索结果数量,limit 需大于 0。最大值为 100。超过 100 时默认返回 100 条。
startTimelong long查询记录的起始时间。传 0 时从最新消息开始搜索,非 0 时从该时间往前搜索。
success:Block异步成功回调。messages 中返回匹配的 RCMessage 列表。
error:Block异步失败回调。返回对应失败错误码。

示例代码

Objective C
RCConversationIdentifier *conversationIdentifier = [[RCConversationIdentifier alloc] initWithConversationIdentifier:ConversationType_PRIVATE targetId:@"targetId"];
[[RCCoreClient sharedCoreClient] searchMessages:conversationIdentifier
keyword:@"关键字"
objectNameList:@[@"RC:TxtMsg"]
limit:50
startTime:0
success:^(NSArray<RCMessage *> * _Nonnull messages) {

} error:^(RCErrorCode status) {

}];

自定义搜索

提示

从 5.22.0 版本 RCCoreClient 开始支持。

开发者可以使用 RCSearchMessageParams 对象,自定义搜索条件,将对象传入接口 searchMessagesWithParams:completionHandler: 进行搜索。

参数说明

参数类型说明
paramsRCSearchMessageParams参数对象。
completionHandlerRCSearchMessageListCompletion结果回调。
  • RCSearchMessageListCompletion 参数说明:
    • messages 为返回的搜索消息列表。
    • matchCount 为搜索条件匹配到的总个数。
    • code 为错误码。

参数对象

参数对象支持自由组合搜索添加,条件包括关键字、个数、排序、偏移、时间范围、会话过滤、消息过滤等。

参数类型说明
keywordNSString关键字。
limitNSInteger搜索个数。
offsetNSInteger搜索偏移量。
orderRCOrder排序方式。
timeRangeRCTimeRange搜索时间范围(可选)。
conversationFilterRCConversationFilter搜索会话过滤(可选)。
messageFilterRCMessageFilter搜索消息过滤(可选)。
  • timeRange 时间范围详细说明:
Objective C
/// 查询时间轴:
/// 0--------startTime--------------------endTime---------Now()
/// 正序(order == RCOrderAscending)查询:
/// 0--------startTime|---->--------------endTime---------Now()
/// 倒序(order == RCOrderDescending)查询个数:
/// 0--------startTime--------------<----|endTime---------Now()
/// 倒序有位移 (offset) 查询:
/// 0--------startTime----------<----|----endTime---------Now()

示例代码

Objective C
RCSearchMessageParams *params = [[RCSearchMessageParams alloc] init];
params.keyword = @"keyword";
params.limit = 20;

// RCTimeRange *timeRange = [[RCTimeRange alloc] initWithStartTime:0 endTime:lastMessage.sentTime];
// params.timeRange = timeRange;

RCConversationFilter *conversationFilter = [[RCConversationFilter alloc] init];
conversationFilter.conversationTypes = @[@(1), @(3)];
conversationFilter.targetIds = @[@"tId1", @"tId2"];
conversationFilter.channelIds = @[@"cId1", @"cId2"];
params.conversationFilter = conversationFilter;

RCMessageFilter *messageFilter = [[RCMessageFilter alloc] init];
messageFilter.senderIds = @[@"sId1", @"sId2"];
messageFilter.objectNames = @[@"obj1", @"obj2"];
params.messageFilter = messageFilter;

[[RCCoreClient sharedCoreClient] searchMessagesWithParams:params
completionHandler:^(NSArray<RCMessage *> *messages, NSUInteger matchCount, RCErrorCode code) {
// TODO 业务处理
}];

自定义搜索

提示

从 5.22.0 版本 RCCoreClient 开始支持。

开发者可以使用 RCSearchMessageParams 对象,自定义搜索条件,将对象传入接口 searchMessagesWithParams:completionHandler: 进行搜索。

参数说明

参数类型说明
paramsRCSearchMessageParams参数对象。
completionHandlerRCSearchMessageListCompletion结果回调。
  • RCSearchMessageListCompletion 参数说明:
    • messages 为返回的搜索消息列表。
    • matchCount 为搜索条件匹配到的总个数。
    • code 为错误码。

参数对象

参数对象支持自由组合搜索添加,条件包括关键字、个数、排序、偏移、时间范围、会话过滤、消息过滤等。

参数类型说明
keywordNSString关键字。
limitNSInteger搜索个数。
offsetNSInteger搜索偏移量。
orderRCOrder排序方式。
timeRangeRCTimeRange搜索时间范围(可选)。
conversationFilterRCConversationFilter搜索会话过滤(可选)。
messageFilterRCMessageFilter搜索消息过滤(可选)。
  • timeRange 时间范围详细说明:
Objective C
/// 查询时间轴:
/// 0--------startTime--------------------endTime---------Now()
/// 正序(order == RCOrderAscending)查询:
/// 0--------startTime|---->--------------endTime---------Now()
/// 倒序(order == RCOrderDescending)查询个数:
/// 0--------startTime--------------<----|endTime---------Now()
/// 倒序有位移 (offset) 查询:
/// 0--------startTime----------<----|----endTime---------Now()

示例代码

Objective C
RCSearchMessageParams *params = [[RCSearchMessageParams alloc] init];
params.keyword = @"keyword";
params.limit = 20;

// RCTimeRange *timeRange = [[RCTimeRange alloc] initWithStartTime:0 endTime:lastMessage.sentTime];
// params.timeRange = timeRange;

RCConversationFilter *conversationFilter = [[RCConversationFilter alloc] init];
conversationFilter.conversationTypes = @[@(1), @(3)];
conversationFilter.targetIds = @[@"tId1", @"tId2"];
conversationFilter.channelIds = @[@"cId1", @"cId2"];
params.conversationFilter = conversationFilter;

RCMessageFilter *messageFilter = [[RCMessageFilter alloc] init];
messageFilter.senderIds = @[@"sId1", @"sId2"];
messageFilter.objectNames = @[@"obj1", @"obj2"];
params.messageFilter = messageFilter;

[[RCCoreClient sharedCoreClient] searchMessagesWithParams:params
completionHandler:^(NSArray<RCMessage *> *messages, NSUInteger matchCount, RCErrorCode code) {
// TODO 业务处理
}];