专栏首页青玉伏案iOS开发之集成iOS9中的Core Spotlight Framework搜索App的内容

iOS开发之集成iOS9中的Core Spotlight Framework搜索App的内容

Spotlight在iOS9上做了一些新的改进, 也就是开放了一些新的API, 通过Core Spotlight Framework你可以在你的app中集成Spotlight。集成Spotlight的App可以在Spotlight中搜索App的内容,并且通过内容打开相关页面。因为接到开发任务,老大说让在App中支持Spotlight, 于是又搞了搞苹果的官方文档。可以说,集成Spotlight不算复杂,官网上讲的也挺明白的,今天博客就通过一个Demo来集成一下Spotlight。

  苹果官方有关Core Spotlight Framework的链接如下:

https://developer.apple.com/library/prerelease/ios/documentation/CoreSpotlight/Reference/CoreSpotlight_Framework/index.html#//apple_ref/doc/uid/TP40016250

  一.Demo运行效果

  还是通过一个Demo来进行介绍,Demo运行效果如下。我们App中有关于宫崎骏的的内容,然后在Spotlight中搜索宫崎骏,就可以搜索到相关内容,并且可以点击打开展示相关内容。具体运行效果如下:

  二.集成Core Spotlight Framework

    1.想在App中使用Spotlight,首先得引入Core Spotlight Framework,Targets ->General -> linked Frameworks and Libraries 点击加号添加CoreSpotlight.framework。如下截图所示。

    2.在相应的视图控制器中引入<CoreSpotlight/CoreSpotlight.h>头文件,然后就开始写代码使自己的App内容支持Spotlight搜索了。下面是为Demo添加Spotlight的相关代码。Spotlight搜索出来的东西,每一项就是一个条目即CSSearchableItem的对象,而改对象又关联一个属性集合(CSSearchableItemAttributeSet )该集合中存储了CSSearchableItem对象的相关属性,如果title(标题), contentDescription(内容简介),

thumbnailData(图片)等所需内容。具体请看下方代码描述和代码注释。

    代码描述:

      (1).首先定义了一个temp数组,用来存储在Spotlight中搜索的关键字,也就是Spotlight可以搜索到的App内容。数组中的内容通过循环遍历经过一系列的步骤给Spotlight进行关联。

      (2)在每次遍历内容数组的过程中,需要创建一个CSSearchableItemAttributeSet(属性集合),并给属性集合中的一些属性赋上值。然后再创建一个CSSearchableItem,创建CSSearchableItem时,把其对应的属性集合进行关联。把每次创建好的条目暂存到可变数组中,因为创建好所有的条目后还要和Spotlight的索引(CSSearchableIndex)进行关联。

      (3)通过单例获取CSSearchableIndex的对象,并与我们创建好的CSSearchableItem数组进行关联。具体代码和步骤如下。

 1 - (void)supportSpotlightSearch {
 2     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 3     dispatch_async(queue, ^{
 4         @try {
 5             NSArray *temp = @[@"宫崎骏-龙猫", @"宫崎骏-千与千寻", @"宫崎骏-天空之城"];
 6             
 7             //创建SearchableItems的数组
 8             NSMutableArray *searchableItems = [[NSMutableArray alloc] initWithCapacity:temp.count];
 9             
10             for (int i = 0; i < temp.count; i ++) {
11                 
12                 //1.创建条目的属性集合
13                 CSSearchableItemAttributeSet * attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString*) kUTTypeImage];
14                 
15                 //2.给属性集合添加属性
16                 attributeSet.title = temp[i];
17                 attributeSet.contentDescription = [NSString stringWithFormat:@"宫崎骏与%@", temp[i]];
18                 attributeSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:[NSString stringWithFormat:@"%d.png", i+1]]);
19                 
20                 //3.属性集合与条目进行关联
21                 CSSearchableItem *searchableItem = [[CSSearchableItem alloc] initWithUniqueIdentifier:[NSString stringWithFormat:@"%d", i+1] domainIdentifier:@"ZeluLi.SpotlightSearchDemo" attributeSet:attributeSet];
22                 
23                 //把该条目进行暂存
24                 [searchableItems addObject:searchableItem];
25             }
26             
27             //4.吧条目数组与索引进行关联
28             [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchableItems completionHandler:^(NSError * _Nullable error) {
29                 if (!error) {
30                     NSLog(@"%s, %@", __FUNCTION__, [error localizedDescription]);
31                 }
32             }];
33         }
34         @catch (NSException *exception) {
35             NSLog(@"%s, %@", __FUNCTION__, exception);
36         }
37         @finally {
38             
39         }
40     });
41 }

    3.处理搜索后条目点击的事件,该事件的处理要在AppDelegate中下面的委托代理方法中进行处理。下面的idetifier就是属性集合与条目进行关联时指定的唯一标示。

 1 - (BOOL)application:(nonnull UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * __nullable))restorationHandler{
 2     
 3     NSString *idetifier = userActivity.userInfo[@"kCSSearchableItemActivityIdentifier"];
 4     
 5     UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
 6     
 7     ViewController *vc = [navigationController viewControllers][0];
 8     [vc.myImage setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@.png",idetifier]]];
 9     
10     
11     return YES;
12 }

    DEMO分享地址--github:https://github.com/lizelu/SpotlightSearchDemo

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ReactNative之从HelloWorld中看环境搭建、组件封装、Props及State

    开篇呢,先给大家问个好,今天是中秋节,祝大家中秋节快乐!!虽然是中秋节,但是木有回家还是总结一下知识点写写博客吧,想着昨天总结一下的,但是昨天和几个同学小聚了一...

    lizelu
  • ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁

    本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景。然后再聊一下Atomic的...

    lizelu
  • ReactiveSwift源码解析(二) Bag容器的代码实现

     今天博客我接着上篇博客的内容来,上篇博客我们详细的看了ReactiveSwift中的Observer已经Event的代码实现。接下来我们来看一下Reactiv...

    lizelu
  • 缤果盒子为域名意识打call 六位数秒下bingobox.com

    无人便利店企业“缤果盒子”称已在2017年 5 月完成 A 轮融资,金额超 1 亿元,由纪源资本领投,启明创投、源码资本、Ventech China...

    躲在树上的域小名
  • 解决.htaccess: Invalid command ‘RewriteEngine’,问题

    今天首先是网站打不开,显示的是服务器apache内部错误.500.说让检查一下服务器错误日志.

    十四君
  • Python进阶之Matplotlib入门(三)

    Matplotlib是Python的画图领域使用最广泛的绘图库,它能让使用者很轻松地将数据图形化以及利用它可以画出许多高质量的图像,是用Python画图的必备技...

    HuangWeiAI
  • 验证码的故事 (1)

    老网民们大概都记得,刚开始上网的时候,是不存在验证码(captcha)这么一种东西的。这造成的结果是,垃圾评论和垃圾邮件可以轻松通过任何一个网站的注册程序,通过...

    Crossin先生
  • opencv 4 -- 图像平滑与滤波

    这是由一个归一化卷积框完成的。 他只是用卷积框覆盖区域所有像素的平 均值来代替中心元素

    wust小吴
  • 微信小程序 页面与自定义组件数据通信

    说明:页面通过my-property讲example字符串传递给自定义组件,同样也可以使用数据绑定的方法

    天天_哥
  • 局部加权线性回归(LWLR)

    线性回归的一个问题是很可能出现欠拟合现象。局部加权线性回归可以解决线性回归中的欠拟合现象。在该算法中,我们对更靠近待预测点的点赋予更高的权重。权重类型可以自由选...

    用户6021899

扫码关注云+社区

领取腾讯云代金券