浏览 SDKs · iOS
SDKsiOS

搜索消息

在 iOS SDK 已同步的本地消息中搜索关键词。

复制

searchLocalMessages:onSuccess:onFailure: 搜索当前用户在 iOS SDK 本地数据库中可见的消息。群消息搜索的目标是群聊对应的 conversationID,不是发送消息时使用的 groupID

搜索范围取决于 SDK 已同步到本地的消息。跨用户审计、服务端全量检索、复杂权限过滤或跨会话全局排序,应由后端搜索服务处理,再把命中的 conversationIDclientMsgID 交给客户端定位。

创建搜索条件

搜索框通常代表一次用户输入。先移除关键词前后空白并拒绝空字符串,再创建 OIMSearchParam;用户修改关键词、消息类型或时间范围时,应把页码重置为 1 并清除旧结果。

NSString *keyword = [searchText stringByTrimmingCharactersInSet:
    NSCharacterSet.whitespaceAndNewlineCharacterSet];
if (keyword.length == 0) {
    [self renderSearchItems:@[] totalCount:0];
    return;
}

OIMSearchParam *param = [OIMSearchParam new];
param.conversationID = conversationID;
param.keywordList = @[keyword];
param.messageTypeList = @[@(OIMMessageContentTypeText)];
param.searchTimePosition = 0;
param.searchTimePeriod = 0;
param.pageIndex = 1;
param.count = 20;

[[OIMManager manager] searchLocalMessages:param
    onSuccess:^(OIMSearchResultInfo * _Nullable result) {
        if (result == nil) {
            [self showSearchError:0 message:@"搜索回调未返回结果"];
            return;
        }
        [self renderSearchItems:result.searchResultItems
                     totalCount:result.totalCount];
    }
    onFailure:^(NSInteger code, NSString * _Nullable message) {
        [self showSearchError:code message:message ?: @"搜索消息失败"];
    }];

参数说明

字段类型是否可空说明
conversationIDNSString *目标会话;空字符串表示跨本地会话搜索。群聊仍传会话 ID,不传 groupID
keywordListNSArray<NSString *> *关键词数组;固定版本目前只支持一个关键词。
keywordListMatchTypeNSInteger值类型多关键词匹配字段,固定版本标示为当前未使用。
senderUserIDListNSArray * _Nullable发送者筛选字段,固定版本标示为当前未使用。
messageTypeListNSArray * _Nullable可选的消息类型数值数组,例如文本消息。
searchTimePositionNSInteger值类型UTC 秒级时间起点;0 表示从当前时间开始。
searchTimePeriodNSInteger值类型从起点计算的秒级时间范围;0 表示不限。
pageIndexNSInteger值类型会话内分页从 1 开始;跨会话搜索时无效。
countNSInteger值类型会话内每页数量;跨会话搜索时无效。

keywordListMatchTypesenderUserIDList 在固定 Objective-C header 中标示为当前未使用,不应依赖它们实现多关键词或发送者筛选。若产品需要这些条件,应先以实际 SDK 版本验证,或改由后端搜索服务提供。

处理分页结果

成功 callback 参数按固定声明可以为 nil,应先处理空结果。非空的 OIMSearchResultInfo 包含:

属性类型说明
totalCountNSInteger本次条件匹配的消息总数。
searchResultItemsNSArray<OIMSearchResultItemInfo *> *searchLocalMessages: 按会话组织的结果。
findResultItemsNSArray<OIMSearchResultItemInfo *> *findMessageList: 专用结果,不是本操作的主要结果字段。

每个 OIMSearchResultItemInfo 对应一个会话:

属性类型说明
conversationIDNSString *命中消息所属会话 ID。
conversationTypeOIMConversationType会话类型枚举。
showNameNSString *会话展示名称。
faceURLNSString *会话头像地址。
messageCountNSInteger该会话内的命中数量。
messageListNSArray<OIMMessageInfo *> *该会话内本页命中的消息。

分页时持续传入相同的 conversationIDkeywordList、消息类型和时间条件,只递增 pageIndex。搜索页内以结果项的 conversationID 加上消息的 clientMsgID 去重,不要按结果位置保存选中状态。

处理搜索结果变化

搜索查询成功后可以直接使用 callback 结果建立快照;查询本身不触发消息事件。命中的消息可能在页面打开后被撤回、删除,或因后续同步而变化,应复用接收消息批量删除消息撤回消息页面的统一事件处理器,本页不重复注册事件。

跳转到搜索结果时,使用该结果的 conversationIDclientMsgID 定位目标消息。若需要显示上下文,先使用 findMessageList:onSuccess:onFailure: 取得消息,再读取消息上下文

搜索 callback、消息事件增量和重新执行查询是三条独立路径。需要当前结果时,使用相同条件重新搜索,并按相同的会话与消息标识合并。

相关页面