iOS9系列专题二——全新的搜索功能api

更加智能的搜索方案——iOS9搜索功能新api

一、引言

        iOS9中为我们提供了许多新的api,搜索功能的加强无疑是其中比较显眼的一个。首先,我们先设想一下:如果在你的app中定义一种标识符,在siri和搜索中,可以用过这个标识符搜索到你的app,是不是很棒?不,这还差得远,你可以定义任意的数据,使其在搜索和siri中可以快速检索到,这样的搜索功能是不是非常酷?不,还有更cool的,你甚至可以在你的网站中添加一些标志,使apple的爬虫可以检索到,那样,即使用户没有安装你的app,也可以在搜索中获取到相应的信息,这太强大了,对吧。

二、3种全新的搜索模式

1、NSUserActivity

        我们可以在项目中使用相应的函数来添加一些用户的活跃元素,使我们可以在搜索中通过搜索这样的活跃元素展现我们的app。例如:

?


1

2

3

4

5

6

7

8

9

10

    //创建一个对象,这里的type用于区分搜索的类型

    NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType: @"myapp"];

    //显示的标题

    userActivity.title = @"我的app";

    // 搜索的关键字

    userActivity.keywords = [NSSet setWithArray: @[@"sea",@"rch"]];

    // 支持Search

    userActivity.eligibleForSearch = YES;

    //提交设置

    [userActivity becomeCurrent];

在下面的函数中,我们可以处理用户点击搜索后的回调:

?


1

2

3

4

5

6

7

8

9

10

11

12

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:

{

 NSString *activityType = userActivity.activityType;

    if ([activityType isEqual: @"myapp"]){

        // Handle restoration for values provided in userInfo

        // do something

 

        return YES;

    }

    return NO;

    //处理回调

}

TIP:这种方式添加的关键字搜索,必须创建全局变量,否则无法进行搜索:

2、CoreSpotlight

        CoreSpotlight是一种更加自由的搜索方式,可以通过添加类似item的模型,将app中的数据展示在搜索栏中,CoreSpotlight框架类似提供了一些增、删、改、查的操作,可是使我们自由的进行搜索属性的设置。

(1)认识3个类

在iOS9中,新增加了3个类,通过对这三个类的操作与配合,我们可以轻易的在app中添加CoreSpotlight搜索的功能。

 CSSearchableItemAttributeSet:设置类,这个类用于设置搜索标签里的icon,内容,图片等。主要用法如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

//这个类的核心方法只有一个init方法,通过一个类型字符串进行创建,字符串用于在回调中区分

@interface CSSearchableItemAttributeSet : NSObject <NSCopying,NSSecureCoding>

- (instancetype)initWithItemContentType:(nonnull NSString *)itemContentType;

@end

//更多的属性设置在其扩展类中,例如:

@interface CSSearchableItemAttributeSet (CSGeneral)

 

//展示的名称

@property(nullable, copy) NSString *displayName;

 

//名称数组

@property(nullable, copy) NSArray<NSString*> *alternateNames;

 

//完整的路径

@property(nullable, copy) NSString *path;

 

//链接url

@property(nullable, strong) NSURL *contentURL;

 

//图片链接的url

@property(nullable, strong) NSURL *thumbnailURL;

 

//设置图片数据

@property(nullable, copy) NSData *thumbnailData;

 

//设置一个标识符

@property(nullable, copy) NSString *relatedUniqueIdentifier;

 

@property(nullable, strong) NSDate *metadataModificationDate;

 

//内容类型

@property(nullable, copy) NSString *contentType;

 

@property(nullable, copy) NSArray<NSString*> *contentTypeTree;

 

//搜索的关键字数组

@property(nullable, copy) NSArray<NSString*> *keywords;

 

//标题信息

@property(nullable, copy) NSString *title;

 

@end

 CSSearchableItem:搜索标签类,通过这个类,来创建响应的搜索标签。主要内容如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//这个类主要用于创建搜索的标签

@interface CSSearchableItem : NSObject <NSSecureCoding, NSCopying>

//init方法

- (instancetype)initWithUniqueIdentifier:(nullable NSString *)uniqueIdentifier //Can be null, one will be generated

                        domainIdentifier:(nullable NSString *)domainIdentifier

                            attributeSet:(CSSearchableItemAttributeSet *)attributeSet;

//相应 的属性

@property (copy) NSString *uniqueIdentifier;

 

@property (copy, nullable) NSString *domainIdentifier;

 

@property (copy, null_resettable) NSDate * expirationDate;

 

@property (strong) CSSearchableItemAttributeSet *attributeSet;

 

@end

CSSearchableIndex:这个类,我个人理解,类似一个manager的作用,通过它对标签进行增、删、改、查等操作:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

@interface CSSearchableIndex : NSObject

 

@property (weak,nullable) id<CSSearchableIndexDelegate> indexDelegate;

 

//判断设备是否支持

+ (BOOL)isIndexingAvailable;

//取系统的searchIndex管理者

+ (instancetype)defaultSearchableIndex;

//一般情况下,我们不需要重新创建对象

- (instancetype)initWithName:(NSString *)name;

- (instancetype)initWithName:(NSString *)name protectionClass:(nullable NSString *)protectionClass;

 

//设置索引标签

- (void)indexSearchableItems:(NSArray<CSSearchableItem *> *)items completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;

 

//删除指定id索引标签

- (void)deleteSearchableItemsWithIdentifiers:(NSArray<NSString *> *)identifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;

 

- (void)deleteSearchableItemsWithDomainIdentifiers:(NSArray<NSString *> *)domainIdentifiers completionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;

 

//删除所有索引标签

- (void)deleteAllSearchableItemsWithCompletionHandler:(void (^ __nullable)(NSError * __nullable error))completionHandler;

 

@end

(2)一个小例子

        下面,我们通过一个小例子来应用下CoreSpotlight的搜索功能。

首先,需要在项目中导入如下库:

实现如下代码:

?


1

2

3

4

5

6

7

8

9

10

 //进行标签设置

 CSSearchableItemAttributeSet * itemSet = [[CSSearchableItemAttributeSet alloc]initWithItemContentType:@"myApp"];

    itemSet.title = @"我的APP";

    itemSet.keywords = @[@"haha",@"123"];

    itemSet.contentDescription = @"这是搜索到得内容";

    itemSet.thumbnailData = UIImagePNGRepresentation([UIImage imageNamed:@"Icon-114.png"]);

     

    CSSearchableItem * item = [[CSSearchableItem alloc]initWithUniqueIdentifier:@"1" domainIdentifier:@"1" attributeSet:itemSet];

     

    [[CSSearchableIndex defaultSearchableIndex]indexSearchableItems:@[item] completionHandler:nil];

我们在搜索中输入haha或者123效果如下:

CoreSpotlight的搜索回调和NSUserActivaty一样,只是区分id的方式有所不同:

?


1

2

3

4

5

6

7

8

9

10

11

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:

{

    NSString *activityType = userActivity.activityType;

    //先取CSSearchableItemActionType

    if ([activityType isEqual: CSSearchableItemActionType]) {

        NSString *uniqueIdentifier = [userActivity.userInfo                                                 objectForKey:CSSearchableItemActivityIdentifier];

        // do something

        return YES;

    }

    return NO;

}

3、Web Markup

        这个功能与我们app开发关系不大,但是对我app的推广却至关重要,这项技术可以让我们的app关联一个网站,apple通过爬虫来获取我们规定的一些标签值,无论用户是否安装了app,在搜索时,都可以展示出相关信息,因为这项功能主要关联前端技术,需要了解的可以参看:App Search Programming Guide

三、结语

        在我参考的许多相关文章中,都一致建议,iOS9的搜索功能固然强大,然而滥用会造成垃圾信息的泛滥,这样的结果一定会适得其反,作为开发者,我们需要将最合适,最简洁的信息推送到用户的面前。另外,文章有疏漏和错误之处,欢迎指正。

时间: 2025-01-20 11:37:18

iOS9系列专题二——全新的搜索功能api的相关文章

iOS9系列专题五——全新的联系人与联系人UI框架

iOS9全新的联系人相关框架--Contacts Framework 一.引言         在以前iOS开发中,涉及联系人相关的编程,代码都非常繁琐,并且框架的设计也不是Objective-C风格的,这使开发者用起来非常的难受.在iOS9中,apple终于解决了这个问题,全新的Contacts Framework将完全替代AddressBookFramework,AddressBookFramework也将成为历史被弃用.至于AddressBookFramework的相关api如何繁琐,在以

iOS9系列专题6——iOS9其他适配注意点

iOS9适配注意点 一.后台定位类app适配点         在iOS8中,APP的定位服务apple就做了一些修改,需要用户申请相应的权限,并在info.plist文件中添加对应的键值.具体的做法在这篇博客中有详细的讲解:http://my.oschina.net/u/2340880/blog/414760.         在iOS9系统中,定位服务的做法基本没有改变,对于前台的定位没有影响,但app中如果需要后台定位,那么还需要多做一些操作,例如: ? 1 2 3 4 5 6 7 8 9

iOS9系列专题一——3D Touch

新的触摸体验--iOS9的3D Touch 一.引言         在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,通过区分轻按和重按来进行不同的用户交互. 二.在模拟器上学习和测试3D Touch         3D Touch是一个很新颖的设计,可是苹果文档有言: With Xcode 7.0 you must develop on a device that support

iOS9系列专题三——应用瘦身

更小,更快--iOS9的App Thinning         apple在iOS9中引入了一套新的app瘦身方案,通过一些优化策略,将尽可能的减小app安装包的体积.这部分的大多工作是由app store来完成,开发者并不需要付出太多额外的开销.这篇博客将这部分内容做了简单的介绍,详细信息在App Thinning.         App的瘦身策略主要包括三部分: 一.slicing         这部分的主要原理是不同的设备下载安装不同的app包,各个app包副本中包含相应尺寸的素材.

iOS9系列专题四——APP传输安全

APP Transport Security--加密传输方式         随着ios9的推出和Xcode的升级,apple将默认开发者使用https的传输方式,相比http的传输协议,这无疑会增加一些安全性,对于开发者而言,一下子将http协议全部升级为https协议,不是一件容易的事,我们可以通过Xcode的一些配置,使其支持http的传输协议.         如果在Xcode7上运行http协议的应用,会出现如下信息: 这个信息也很清晰,需要我们在info.plist文件中配置一些参数

win7搜索功能找不到怎么办

  一.win7旗舰版搜索功能找不到的原因: 1.可能是权限受限了,也有可能是登陆的用户并不是所谓的管理帐号,这时候就没有搜索功能的权限,就是所谓的权限受到限制了. 2.还有可能是搜索服务被关闭了,这样情况发生的原因很有可能是用了一些优化类型的软件,这些软件将搜索功能关闭了. 二.win7搜索功能找不到的讲解方法: 1.先认真的查看一下是不是管理员帐户登录或登陆帐没有登录的权限,如果是的话就要及时将用户主设为管理员帐户就讲解问题了.当然可以在"计算机"图标上面点击右键,接着就选择&qu

php+ajax实现google搜索功能二[原创]

// 原创作品 本站原创:www.111cn.net 作者:面条爱兔子 QQ:271728967 注明:转载请说明原出去 http://www.111cn.net // 现在来讲一下post.php文件了,post.php文件很简单,这个不一定用php可以用很多,只要是服务器脚都可以完成,{个人意见} header("Content-type:text/html;charset=gb2312");我只说讲这一句了,设置文档编码. $key =isset($_POST['key'])?$

magento -- 搜索功能的后台管理技巧二

关于Magento的搜索功能,在之前的文章有提到一些(搜索功能的后台管理技巧),这里介绍一下另外一部分,跟Magento最强大的功能之一属性属性有关. 现在国内绝大多数商城,包括京东,凡客甚至是淘宝,搜索功能所搜索的对象都是商品的名称,也就是说,希望用某个词搜索到的商品,它的名称里必须包含这个词.而有一种情况是,某个商品包含某个属性值(比如白色),而商品名称中不包含"白色"这个词,这时用白色来搜索是搜不到这个商品的.我们来拿凡客做个实验,进入凡客网站,点击男装分类下的衬衫分类,在左栏分

站内优化系列教程二:网站头部和底部优化

前面给大家讲了<站内优化系列教程一:导航优化和结构优化>和<站内优化系列教程二:URL和网站地图优化>两课,今天讲第三课<站内优化系列教程二:网站头部和底部优化>.给网站做站优化最基本的目的就是为了提高网站的排名,相对来说这也是大部分站长优化的主要目的,毕竟如果网站排名不靠前,自然就无法从搜索引挚获取大量的流量,而对于网站运营.提高网站知名度.打造网站特有的品牌则是难之又难.回归正题,大部分站长做网站优化都是特别的重视站外优化,而忽视站内的基本优化,其实最基本的提高用户