实战iOS 9:开发者必须掌握的三种搜索API
2015-08-11 10:40
591 查看
原文链接点击打开链接
摘要:本文介绍了iOS
9的三种搜索API,分别为:NSUserActivity,索引用户活动以及App的状态;iOS 9新增的CoreSpotlight.framework提供了增、删、改、查等搜索API,可以索引App的内容;Web Markup,Web内容可被搜索。
iOS9 Day-by-Day是作者Chris Grant新开的一个系列博客,覆盖了iOS开发者必须知道的关于iOS 9的新技术与API,并且还进行了实际操作演练,每篇文章中相关的代码Chris都会将其托管到GitHub。
在第一篇文章中,Chris介绍了iOS 9的三种搜索API,分别为:
NSUserActivity,索引用户活动以及App的状态。
iOS 9新增的CoreSpotlight.framework提供了增、删、改、查等搜索API,可以索引App的内容。
Web Markup,Web内容可被搜索。
译文如下:
在苹果发布iOS 9之前,你只能在Spotlight中输入名称来寻找App,而随着苹果发布了一套全新的iOS 9 Search APIs之后,开发者不但可以自由选择App的部分内容编入索引,还能对Spotlight上的搜索结果以及点击不同结果显示的内容进行设置。
NSUserActivity
NSUserActivity是iOS 8专为Handoff推出的API,iOS 9之后得到了提升。现在用户只需提供元数据(metadata)就能搜索不同的activity(活动)了。换言之,Spotlight可以将activity编入索引,而NSUserActivity就好比网页浏览器的历史堆栈(history stack),使用户能在Spotlight上搜到最近的活动。
Web Markup
Web Markup在网页上显示App的内容并编入Spotlight索引,如此一来即便没有安装某个App,苹果的索引器也能在网页上搜索特别的标记(markup),在Safari或Spotlight上显示搜索结果。
显示未安装App的搜索结果是一大亮点,有望为开发者带来更多潜在用户。公布在搜索API上的App深链接则储存在苹果的cloud index中。更多详情,请参阅苹果的“Web Markup使用指南(Use
Web Markup to Make App Content Searchable)”。
CoreSpotlight
NSUserActivity帮助储存用户历史,而全新的Core Spotlight则能将App中的任何内容编入索引,实质是在用户设备上提供基础的Core Spotlight索引渠道,满足用户另外一个需求。
使用Core Spotlight API
NSUserActivity和Web Markup比较简单,而Core Spotlight就有点复杂了。为帮助读者更好地理解CoreSpotlight的作用,我们创建了一个简易的好友清单App,点击不同的好友名称,就会显示对应的照片。读者可以在GitHub上找到代码,跟我们一起实践一下吧。
App中简单列出了一个故事板,FriendTableViewController显示好友的名字,FriendViewController则显示好友的详细信息。
好友信息都储存在Datasource类的模型里,其中包含将相关信息存入CoreSpotlight索引的逻辑。
先重写Datasource类中的init()方法,在Datasource类里创建和储存一队列Person对象。其实从数据库或服务器上加载真实数据也行,但方便理解,我们直接创建一些虚拟数据。
[cpp] view
plaincopy
override init () {
let becky = Person()
becky.name = "Becky"
becky.id = "1"
becky.image = UIImage(named: "becky")!
...
people = [becky, ben, jane, pete, ray, tom]
}
数据在一队列people中储存好之后,就可以用Datasource了!
现在数据准备好了,FriendTableViewController可以创建一个Datasource的实例来响应表格视图显示储存格的请求。
[cpp] view
plaincopy
let datasource = Datasource()
cellForRowAtIndexPath显示在储存格里的内容可以很简单,比如:
[cpp] view
plaincopy
let person = datasource.people[indexPath.row]
cell?.textLabel?.text = person.name
将好友信息存入CoreSpotlight
我们可以用新的iOS9 API将好友信息存入CoreSpotlight。在Datasource 类里已经定义了savePeopleToIndex的功能,视图加载好后FriendTableViewController 就会调用该功能。
我们在队列里循环访问不同好友的信息,为每个人创建一个CSSearchableItem,然后储存到名为searchableItems的暂存阵列里。
[cpp] view
plaincopy
let attributeSet = CSSearchableItemAttributeSet(itemContentType: "image" as String)
attributeSet.title = person.name
attributeSet.contentDescription = "This is an entry all about the interesting person called (person.name)"
attributeSet.thumbnailData = UIImagePNGRepresentation(person.image)
let item = CSSearchableItem(uniqueIdentifier: person.id, domainIdentifier:
"com.ios9daybyday.SearchAPIs.people", attributeSet: attributeSet)
searchableItems.append(item)
最后一步是在系统默认的CSSearchableIndex上调用indexSearchableItems ,作用是将信息一项一项存入CoreSpotlight,以便用户搜索,显示搜索结果。
[cpp] view
plaincopy
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems,
completionHandler: { error -> Void in
if error != nil {
print(error?.localizedDescription)
}
})
大功告成!现在运行App时就会储存数据了。在Spotlight中能够搜到好友们的信息啦!
用户选择
Spotlight能显示搜索结果了,那么点击不同好友会怎样呢?——其实只是打开App的主屏幕而已。要想直接显示对应的好友信息,还需要做更多。我们通过AppDelegate的continueUserActivity UIApplicationDelegate方法添加这个功能。
以下是该方法完整的执行过程:
[cpp] view
plaincopy
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
// Find the ID from the user info
let friendID = userActivity.userInfo?["kCSSearchableItemActivityIdentifier"] as! String
// Find the root table view controller and make it show the friend with this ID
let navigationController = (window?.rootViewController as! UINavigationController)
navigationController.popToRootViewControllerAnimated(false)
let friendTableViewController = navigationController.viewControllers.first as! FriendTableViewController
friendTableViewController.showFriend(friendID)
return true
}
好了,之前用indexSearchableItems功能存入CoreSportlight索引的信息显示在userActivity.userInfo目录里了。我们所关心的好友ID一项一项通过kCSSearchableItemActivityIdentifier储存在索引里了。
从userInfo目录提取信息时,可以找到App的导航控制器,回归到root(由于没有动画提示,用户可能注意不到),然后在friendTableViewController上调用showFriend 功能。具体细节不多说,这个过程实际上是在数据源里找到好友的ID信息,然后给导航控制器堆栈推送新的视图控制器就可以了!现在点击Spotlight的好友信息,就会看到如下内容:
看到了吧?App屏幕左上方角落里有“Back to Search(返回搜索)”选项,直接返回到显示好友名称的搜索屏。也可以用“back(返回)”键完成这一步。
我们刚刚了解了如何整合App数据跟CoreSpotlight索引,过程很简单——简化了打开App的操作,搜索特定内容也更方便了。
此文没有提及如何从索引中删除数据。为保持更新app所用的索引,CoreSpotlight的删除功能必不可少,这方面可以看看deleteSearchableItemsWithIdentifiers,deleteSearchableItemsWithDomainIdentifiers和deleteAllSearchableItemsWithCompletionHandler三个功能。
对开发者而言,在Spotlight和Safari上的曝光率自然是越高越好,但信息泛滥可能导致不良后果,所以奉劝各位三思。在iOS生态系统中努力做“良民”能在用户心里留下好印象,另外也不会给苹果公司留下把柄,他们在关联数据上投下重金,由于数据相关性收到严密监控,若出现数据泛滥的情况,就会被移到搜索结果的底部。
若想了解iOS9搜索API的更多信息,推荐观看WWDC 709会议对搜索API的介绍(Introducing Search APIs),另外NSUserActivity
Class Reference以及documentation
for CoreSpotlight也是很不错的参考资料。若想亲自体验上述的小实验,可以在GitHub上找到源码。
摘要:本文介绍了iOS
9的三种搜索API,分别为:NSUserActivity,索引用户活动以及App的状态;iOS 9新增的CoreSpotlight.framework提供了增、删、改、查等搜索API,可以索引App的内容;Web Markup,Web内容可被搜索。
iOS9 Day-by-Day是作者Chris Grant新开的一个系列博客,覆盖了iOS开发者必须知道的关于iOS 9的新技术与API,并且还进行了实际操作演练,每篇文章中相关的代码Chris都会将其托管到GitHub。
在第一篇文章中,Chris介绍了iOS 9的三种搜索API,分别为:
NSUserActivity,索引用户活动以及App的状态。
iOS 9新增的CoreSpotlight.framework提供了增、删、改、查等搜索API,可以索引App的内容。
Web Markup,Web内容可被搜索。
译文如下:
在苹果发布iOS 9之前,你只能在Spotlight中输入名称来寻找App,而随着苹果发布了一套全新的iOS 9 Search APIs之后,开发者不但可以自由选择App的部分内容编入索引,还能对Spotlight上的搜索结果以及点击不同结果显示的内容进行设置。
三大API
NSUserActivityNSUserActivity是iOS 8专为Handoff推出的API,iOS 9之后得到了提升。现在用户只需提供元数据(metadata)就能搜索不同的activity(活动)了。换言之,Spotlight可以将activity编入索引,而NSUserActivity就好比网页浏览器的历史堆栈(history stack),使用户能在Spotlight上搜到最近的活动。
Web Markup
Web Markup在网页上显示App的内容并编入Spotlight索引,如此一来即便没有安装某个App,苹果的索引器也能在网页上搜索特别的标记(markup),在Safari或Spotlight上显示搜索结果。
显示未安装App的搜索结果是一大亮点,有望为开发者带来更多潜在用户。公布在搜索API上的App深链接则储存在苹果的cloud index中。更多详情,请参阅苹果的“Web Markup使用指南(Use
Web Markup to Make App Content Searchable)”。
CoreSpotlight
NSUserActivity帮助储存用户历史,而全新的Core Spotlight则能将App中的任何内容编入索引,实质是在用户设备上提供基础的Core Spotlight索引渠道,满足用户另外一个需求。
实战
使用Core Spotlight APINSUserActivity和Web Markup比较简单,而Core Spotlight就有点复杂了。为帮助读者更好地理解CoreSpotlight的作用,我们创建了一个简易的好友清单App,点击不同的好友名称,就会显示对应的照片。读者可以在GitHub上找到代码,跟我们一起实践一下吧。
App中简单列出了一个故事板,FriendTableViewController显示好友的名字,FriendViewController则显示好友的详细信息。
好友信息都储存在Datasource类的模型里,其中包含将相关信息存入CoreSpotlight索引的逻辑。
先重写Datasource类中的init()方法,在Datasource类里创建和储存一队列Person对象。其实从数据库或服务器上加载真实数据也行,但方便理解,我们直接创建一些虚拟数据。
[cpp] view
plaincopy
override init () {
let becky = Person()
becky.name = "Becky"
becky.id = "1"
becky.image = UIImage(named: "becky")!
...
people = [becky, ben, jane, pete, ray, tom]
}
数据在一队列people中储存好之后,就可以用Datasource了!
现在数据准备好了,FriendTableViewController可以创建一个Datasource的实例来响应表格视图显示储存格的请求。
[cpp] view
plaincopy
let datasource = Datasource()
cellForRowAtIndexPath显示在储存格里的内容可以很简单,比如:
[cpp] view
plaincopy
let person = datasource.people[indexPath.row]
cell?.textLabel?.text = person.name
将好友信息存入CoreSpotlight
我们可以用新的iOS9 API将好友信息存入CoreSpotlight。在Datasource 类里已经定义了savePeopleToIndex的功能,视图加载好后FriendTableViewController 就会调用该功能。
我们在队列里循环访问不同好友的信息,为每个人创建一个CSSearchableItem,然后储存到名为searchableItems的暂存阵列里。
[cpp] view
plaincopy
let attributeSet = CSSearchableItemAttributeSet(itemContentType: "image" as String)
attributeSet.title = person.name
attributeSet.contentDescription = "This is an entry all about the interesting person called (person.name)"
attributeSet.thumbnailData = UIImagePNGRepresentation(person.image)
let item = CSSearchableItem(uniqueIdentifier: person.id, domainIdentifier:
"com.ios9daybyday.SearchAPIs.people", attributeSet: attributeSet)
searchableItems.append(item)
最后一步是在系统默认的CSSearchableIndex上调用indexSearchableItems ,作用是将信息一项一项存入CoreSpotlight,以便用户搜索,显示搜索结果。
[cpp] view
plaincopy
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems(searchableItems,
completionHandler: { error -> Void in
if error != nil {
print(error?.localizedDescription)
}
})
大功告成!现在运行App时就会储存数据了。在Spotlight中能够搜到好友们的信息啦!
用户选择
Spotlight能显示搜索结果了,那么点击不同好友会怎样呢?——其实只是打开App的主屏幕而已。要想直接显示对应的好友信息,还需要做更多。我们通过AppDelegate的continueUserActivity UIApplicationDelegate方法添加这个功能。
以下是该方法完整的执行过程:
[cpp] view
plaincopy
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
// Find the ID from the user info
let friendID = userActivity.userInfo?["kCSSearchableItemActivityIdentifier"] as! String
// Find the root table view controller and make it show the friend with this ID
let navigationController = (window?.rootViewController as! UINavigationController)
navigationController.popToRootViewControllerAnimated(false)
let friendTableViewController = navigationController.viewControllers.first as! FriendTableViewController
friendTableViewController.showFriend(friendID)
return true
}
好了,之前用indexSearchableItems功能存入CoreSportlight索引的信息显示在userActivity.userInfo目录里了。我们所关心的好友ID一项一项通过kCSSearchableItemActivityIdentifier储存在索引里了。
从userInfo目录提取信息时,可以找到App的导航控制器,回归到root(由于没有动画提示,用户可能注意不到),然后在friendTableViewController上调用showFriend 功能。具体细节不多说,这个过程实际上是在数据源里找到好友的ID信息,然后给导航控制器堆栈推送新的视图控制器就可以了!现在点击Spotlight的好友信息,就会看到如下内容:
看到了吧?App屏幕左上方角落里有“Back to Search(返回搜索)”选项,直接返回到显示好友名称的搜索屏。也可以用“back(返回)”键完成这一步。
Demo总结
我们刚刚了解了如何整合App数据跟CoreSpotlight索引,过程很简单——简化了打开App的操作,搜索特定内容也更方便了。此文没有提及如何从索引中删除数据。为保持更新app所用的索引,CoreSpotlight的删除功能必不可少,这方面可以看看deleteSearchableItemsWithIdentifiers,deleteSearchableItemsWithDomainIdentifiers和deleteAllSearchableItemsWithCompletionHandler三个功能。
做iOS生态系统的“良民”
对开发者而言,在Spotlight和Safari上的曝光率自然是越高越好,但信息泛滥可能导致不良后果,所以奉劝各位三思。在iOS生态系统中努力做“良民”能在用户心里留下好印象,另外也不会给苹果公司留下把柄,他们在关联数据上投下重金,由于数据相关性收到严密监控,若出现数据泛滥的情况,就会被移到搜索结果的底部。
更多信息
若想了解iOS9搜索API的更多信息,推荐观看WWDC 709会议对搜索API的介绍(Introducing Search APIs),另外NSUserActivityClass Reference以及documentation
for CoreSpotlight也是很不错的参考资料。若想亲自体验上述的小实验,可以在GitHub上找到源码。
相关文章推荐
- **浅述IOS成员变量(Member variables)和实例变量(Instance varialbes)的区别**
- [IOS]mac以太网连接
- Masonry介绍与使用实践
- ios内存管理 part1
- ios oc 判断输入的数是否是另一个的整数倍
- iOS库 .a与.framework区别
- OC_AddressBook_通讯录
- iOS类别(Category)与扩展(Extension)
- iOS setter与getter方法
- ios 单例模式的写法
- IOS代码添加控件,控件移动,放大,缩小,旋转
- iOS之TableView左划删除与刷新单挑数据
- cordova ios升级插件
- oschina iOS代码库
- oschina iOS代码库
- nagios插件之登陆SBC监控电话数
- iOS-CocoaPods第三方库管理工具的使用,(很多公司都用这个)
- iOS-NSThread多线程
- iOS CLLocationManager定位,IOS8注意
- 9秒学院iOS游戏开发从掌握到拥有,你只需四步