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:这种方式添加的关键字搜索,必须创建全局变量,否则无法进行搜索:
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 <nscopying,nssecurecoding></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<nsstring*> *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<nsstring*> *contenttypetree;</code>
<code>//搜索的关键字数组</code>
<code>@property(nullable, copy) nsarray<nsstring*> *keywords;</code>
<code>//标题信息</code>
<code>@property(nullable, copy) nsstring *title;</code>
cssearchableitem:搜索标签类,通过这个类,来创建响应的搜索标签。主要内容如下:
<code>//这个类主要用于创建搜索的标签</code>
<code>@interface cssearchableitem : nsobject <nssecurecoding, nscopying></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<cssearchableindexdelegate> 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<cssearchableitem *> *)items completionhandler:(</code><code>void</code> <code>(^ __nullable)(nserror * __nullable error))completionhandler;</code>
<code>//删除指定id索引标签</code>
<code>- (</code><code>void</code><code>)deletesearchableitemswithidentifiers:(nsarray<nsstring *> *)identifiers completionhandler:(</code><code>void</code> <code>(^ __nullable)(nserror * __nullable error))completionhandler;</code>
<code>- (</code><code>void</code><code>)deletesearchableitemswithdomainidentifiers:(nsarray<nsstring *> *)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的搜索功能。
首先,需要在项目中导入如下库:
实现如下代码:
<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效果如下:
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的搜索功能固然强大,然而滥用会造成垃圾信息的泛滥,这样的结果一定会适得其反,作为开发者,我们需要将最合适,最简洁的信息推送到用户的面前。另外,文章有疏漏和错误之处,欢迎指正。