iOS 中很早就推出了 Spotlight 功能,用于搜索已经安装的应用。自从 iOS 9 之后,更可以通过 Core Spotlight Framework 来实现进行应用内容的搜索。官方文档里有详细的说明,这里做个整体的介绍。
使 App 的内容可被搜索需要如下几步:
- 创建一个 CSSearchableItemAttributeSet 对象
myCSSearchableItemAttributeSet
,并且为你想要索引的内容,指定属性描述。 - 创建一个 CSSearchableItem 对象
myCSSearchableItem
,以展示你想搜索的内容。CSSearchableItem 对象具备唯一标识符,以供后续引用。 - 如果需要,指定 Domain 标识符,以便于将多个 Item 收集到一起,作为一个组来管理。
- 将
myCSSearchableItemAttributeSet
和myCSSearchableItem
关联起来。 - 将
myCSSearchableItem
加入索引。
从 Spotlight 搜索结果返回 App
使用 NSUserActivity
来帮助用户在点击搜索结果的时候,调回至 App。
在搜索项被点击时,AppDelegate 的
- application:continueUserActivity:restorationHandler:
方法会被回调。
Core Spotlight
和 NSUserActivity
使用
CSSearchableItemAttributeSet 对象来描述一个可搜索项,并且提供丰富的元数据,用于在搜索结果中显示。
代码实例
引用 Core Spotlight framework
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
#import <CoreSpotlight/CoreSpotlight.h>
#import <MobileCoreServices/MobileCoreServices.h>
#endif
创建相关搜索项
其中,每个 SearchableItem 与一个 SearchableItemSet 对应配对,需要多个搜索项时,创建多个配对,最后把 SearchableItem 数组加入索引。
/*
创建属性
*/
NSString *sUTTypePNG = (__bridge NSString *)kUTTypePNG;
CSSearchableItemAttributeSet *siaSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:sUTTypePNG];
siaSet.keywords = @[@"aa", @"bb", @"cc"];
siaSet.displayName = @"这里显示标题";
//或者使用这个控制标题
siaSet.title = @"这里显示标题";
//这里设置描述
siaSet.contentDescription = @"这里显示描述";
/*
创建搜索项
*/
CSSearchableItem *si = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"Item1"
domainIdentifier:@"com.bahb.test"
attributeSet:siaSet];
/*
将 SearchableItem 加入索引
*/
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[si] completionHandler:nil];
在 Application Delegate 中响应回调
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
if ([[userActivity activityType] isEqualToString:CSSearchableItemActionType]) {
NSString *uniqueIdentifier = [userActivity.userInfo objectForKey:CSSearchableItemActivityIdentifier];
// 接受事先定义好的数值,如果是多个参数可以使用把json转成string传递过来,接受后把string在转换为json
NSLog(@"传递过来的值:[%@]", uniqueIdentifier);
// 做需要的处理
// ....
return YES;
}
(完)
网友评论