iOS 中 Spotlight 的使用

iOS 中 Spotlight 的使用_第1张图片

iOS 中很早就推出了 Spotlight 功能,用于搜索已经安装的应用。自从 iOS 9 之后,更可以通过 Core Spotlight Framework 来实现进行应用内容的搜索。官方文档里有详细的说明,这里做个整体的介绍。

使 App 的内容可被搜索需要如下几步:

  • 创建一个 CSSearchableItemAttributeSet 对象 myCSSearchableItemAttributeSet,并且为你想要索引的内容,指定属性描述。
  • 创建一个 CSSearchableItem 对象 myCSSearchableItem,以展示你想搜索的内容。CSSearchableItem 对象具备唯一标识符,以供后续引用。
  • 如果需要,指定 Domain 标识符,以便于将多个 Item 收集到一起,作为一个组来管理。
  • myCSSearchableItemAttributeSetmyCSSearchableItem 关联起来。
  • myCSSearchableItem 加入索引。

从 Spotlight 搜索结果返回 App

使用 NSUserActivity
来帮助用户在点击搜索结果的时候,调回至 App。
在搜索项被点击时,AppDelegate 的

- application:continueUserActivity:restorationHandler:

方法会被回调。

Core SpotlightNSUserActivity 使用
CSSearchableItemAttributeSet 对象来描述一个可搜索项,并且提供丰富的元数据,用于在搜索结果中显示。

代码实例

引用 Core Spotlight framework
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
#import 
#import 
#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;
}

参考资料:
https://developer.apple.com/library/content/documentation/General/Conceptual/AppSearch/AppContent.html

(完)

你可能感兴趣的:(iOS 中 Spotlight 的使用)