天天看点

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

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

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

<a href="http://my.oschina.net/u/2340880/blog/511694#">?</a>

1

2

3

4

5

6

7

8

9

10

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

<code>    </code><code>nsuseractivity *useractivity = [[nsuseractivity alloc] initwithactivitytype: @</code><code>"myapp"</code><code>];</code>

<code>    </code><code>//显示的标题</code>

<code>    </code><code>useractivity.title = @</code><code>"我的app"</code><code>;</code>

<code>    </code><code>// 搜索的关键字</code>

<code>    </code><code>useractivity.keywords = [nsset setwitharray: @[@</code><code>"sea"</code><code>,@</code><code>"rch"</code><code>]];</code>

<code>    </code><code>// 支持search</code>

<code>    </code><code>useractivity.eligibleforsearch = yes;</code>

<code>    </code><code>//提交设置</code>

<code>    </code><code>[useractivity becomecurrent];</code>

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

11

12

<code>- (</code><code>bool</code><code>)application:(uiapplication *)application continueuseractivity:(nsuseractivity *)useractivity restorationhandler:</code>

<code>{</code>

<code> </code><code>nsstring *activitytype = useractivity.activitytype;</code>

<code>    </code><code>if</code> <code>([activitytype isequal: @</code><code>"myapp"</code><code>]){</code>

<code>        </code><code>// handle restoration for values provided in userinfo</code>

<code>        </code><code>// do something</code>

<code>        </code><code>return</code> <code>yes;</code>

<code>    </code><code>}</code>

<code>    </code><code>return</code> <code>no;</code>

<code>    </code><code>//处理回调</code>

<code>}</code>

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

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

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

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

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

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

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

<code>@interface cssearchableitemattributeset : nsobject &lt;nscopying,nssecurecoding&gt;</code>

<code>- (instancetype)initwithitemcontenttype:(nonnull nsstring *)itemcontenttype;</code>

<code>@end</code>

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

<code>@interface cssearchableitemattributeset (csgeneral)</code>

<code>//展示的名称</code>

<code>@property(nullable, copy) nsstring *displayname;</code>

<code>//名称数组</code>

<code>@property(nullable, copy) nsarray&lt;nsstring*&gt; *alternatenames;</code>

<code>//完整的路径</code>

<code>@property(nullable, copy) nsstring *path;</code>

<code>//链接url</code>

<code>@property(nullable, strong) nsurl *contenturl;</code>

<code>//图片链接的url</code>

<code>@property(nullable, strong) nsurl *thumbnailurl;</code>

<code>//设置图片数据</code>

<code>@property(nullable, copy) nsdata *thumbnaildata;</code>

<code>//设置一个标识符</code>

<code>@property(nullable, copy) nsstring *relateduniqueidentifier;</code>

<code>@property(nullable, strong) nsdate *metadatamodificationdate;</code>

<code>//内容类型</code>

<code>@property(nullable, copy) nsstring *contenttype;</code>

<code>@property(nullable, copy) nsarray&lt;nsstring*&gt; *contenttypetree;</code>

<code>//搜索的关键字数组</code>

<code>@property(nullable, copy) nsarray&lt;nsstring*&gt; *keywords;</code>

<code>//标题信息</code>

<code>@property(nullable, copy) nsstring *title;</code>

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

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

<code>@interface cssearchableitem : nsobject &lt;nssecurecoding, nscopying&gt;</code>

<code>//init方法</code>

<code>- (instancetype)initwithuniqueidentifier:(nullable nsstring *)uniqueidentifier </code><code>//can be null, one will be generated</code>

<code>                        </code><code>domainidentifier:(nullable nsstring *)domainidentifier</code>

<code>                            </code><code>attributeset:(cssearchableitemattributeset *)attributeset;</code>

<code>//相应 的属性</code>

<code>@property (copy) nsstring *uniqueidentifier;</code>

<code>@property (copy, nullable) nsstring *domainidentifier;</code>

<code>@property (copy, null_resettable) nsdate * expirationdate;</code>

<code>@property (strong) cssearchableitemattributeset *attributeset;</code>

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

<code>@interface cssearchableindex : nsobject</code>

<code>@property (weak,nullable) id&lt;cssearchableindexdelegate&gt; indexdelegate;</code>

<code>//判断设备是否支持</code>

<code>+ (</code><code>bool</code><code>)isindexingavailable;</code>

<code>//取系统的searchindex管理者</code>

<code>+ (instancetype)defaultsearchableindex;</code>

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

<code>- (instancetype)initwithname:(nsstring *)name;</code>

<code>- (instancetype)initwithname:(nsstring *)name protectionclass:(nullable nsstring *)protectionclass;</code>

<code>//设置索引标签</code>

<code>- (</code><code>void</code><code>)indexsearchableitems:(nsarray&lt;cssearchableitem *&gt; *)items completionhandler:(</code><code>void</code> <code>(^ __nullable)(nserror * __nullable error))completionhandler;</code>

<code>//删除指定id索引标签</code>

<code>- (</code><code>void</code><code>)deletesearchableitemswithidentifiers:(nsarray&lt;nsstring *&gt; *)identifiers completionhandler:(</code><code>void</code> <code>(^ __nullable)(nserror * __nullable error))completionhandler;</code>

<code>- (</code><code>void</code><code>)deletesearchableitemswithdomainidentifiers:(nsarray&lt;nsstring *&gt; *)domainidentifiers completionhandler:(</code><code>void</code> <code>(^ __nullable)(nserror * __nullable error))completionhandler;</code>

<code>//删除所有索引标签</code>

<code>- (</code><code>void</code><code>)deleteallsearchableitemswithcompletionhandler:(</code><code>void</code> <code>(^ __nullable)(nserror * __nullable error))completionhandler;</code>

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

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

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

实现如下代码:

<code> </code><code>//进行标签设置</code>

<code> </code><code>cssearchableitemattributeset * itemset = [[cssearchableitemattributeset alloc]initwithitemcontenttype:@</code><code>"myapp"</code><code>];</code>

<code>    </code><code>itemset.title = @</code><code>"我的app"</code><code>;</code>

<code>    </code><code>itemset.keywords = @[@</code><code>"haha"</code><code>,@</code><code>"123"</code><code>];</code>

<code>    </code><code>itemset.contentdescription = @</code><code>"这是搜索到得内容"</code><code>;</code>

<code>    </code><code>itemset.thumbnaildata = uiimagepngrepresentation([uiimage imagenamed:@</code><code>"icon-114.png"</code><code>]);</code>

<code>    </code> 

<code>    </code><code>cssearchableitem * item = [[cssearchableitem alloc]initwithuniqueidentifier:@</code><code>"1"</code> <code>domainidentifier:@</code><code>"1"</code> <code>attributeset:itemset];</code>

<code>    </code><code>[[cssearchableindex defaultsearchableindex]indexsearchableitems:@[item] completionhandler:nil];</code>

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

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

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

<code>    </code><code>nsstring *activitytype = useractivity.activitytype;</code>

<code>    </code><code>//先取cssearchableitemactiontype</code>

<code>    </code><code>if</code> <code>([activitytype isequal: cssearchableitemactiontype]) {</code>

<code>        </code><code>nsstring *uniqueidentifier = [useractivity.userinfo                                                 objectforkey:cssearchableitemactivityidentifier];</code>

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

继续阅读