Core Spotlight 作为新版 iOS 提供的众多特性之一很少被我们注意到,但作为 App 开发者,它确实很实用, 让我们的 App 有更多的暴露机会。
关于 Core Spotlight, 顾名思义,就是 iOS Spotlight 提供的服务了。至于什么是 Spotlight, 一张图一目了然:
通过 Core Spotlight, 我们可以让自己的 App 出现在 Spotlight 搜索结果中。 光这一点,就非常强大了。 毕竟这是激发我们活跃用户的一个渠道。
Core Spotlight 提供的接口还是很简单的。 它的原理是一种注册机制, 我们预先把我们 App 中的内容注册到系统中, 然后系统会根据我们注册的条目在搜索的时候进行匹配, 如果匹配成功, 就会展现到搜索结果中。
这个注册项叫做 CSSearchableItem
,它需要三个信息, uniqueIdentifier, domainIdentifier 和 attributeSet。
我们先从 attributeSet 说起:
let attr = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
attr.title = "我是标题"
attr.contentDescription = "描述信息"
attr.thumbnailData = UIImagePNGRepresentation(icon)
上面这段代码完成了 attributeSet 的创建。 它的构造方法接受一个 itemContentType 参数, 这个表示我们要创建的搜索项所对应的数据类型,我们这里使用的是 kUTTypeText
,它表示文本数据。
接下来也不难理解,分别设置了这个搜索项的标题,描述和缩略图。 这些信息都会展现在搜索结果界面中, 同时他们也会作为搜索匹配的依据。
有了这些信息,我们就可以创建 CSSearchableItem
了:
let item = CSSearchableItem(uniqueIdentifier: "/file.txt", domainIdentifier: "open-file", attributeSet: attr)
SSearchableItem
接受 3 个参数, 第一个就是 uniqueIdentifier, 接下来是 domainIdentifier, 最后是我们刚刚创建的 attributeSet。
我们使用文件路径作为 uniqueIdentifier 参数传入, 这样当用户点击搜索项调起我们自己的 App 的时候,就可以根据这个路径打开相应的文件了。
创建后搜索项后,我们还要做最后一步操作,就是把它注册到 Spotlight 的搜索系统中:
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item], completionHandler: { error in
})
到此为止, Core Spotlight 的注册过程就完成了。 如果你把上面的代码放到你的 App 工程中,然后运行程序,就可以在 Spotlight 搜索框中搜索到自己 App 的内容了。
Spotlight 的注册工作完成了,如果没有什么异常情况,你应该可以在搜索结果中看到自己的应用内容了。现在我们开始处理点击搜索结果项后的调起操作:
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
if userActivity.activityType == CSSearchableItemActionType {
if let uniqueIdentifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String {
mainViewController?.openFile(uniqueIdentifier) //打开相应文件
}
}
return true
}
当我们点击 Spotlight 搜索项的时候, 系统会调用我们 APPDelegate 的 application:continueUserActivity 方法, 这里我们判断 activity 类型。 只有类型为 CSSearchableItemActionType 的才是来自 Spotlight 的跳转。
然后在 userInfo 中,我们可以通过 CSSearchableItemActivityIdentifier 这个 key 来得到相应搜索项的 uniqueIdentifier。 在我们这个例子中,它就是我们要打开文件的路径。 然后调用相应的文件处理方法就完成了。
到此为止,我们处理 Core Spotlight 的基本流程就完成了。先是完成了注册,然后处理了搜索项点击。
我们创建完 Spotlight 索引后, 还要对他进行一些维护工作。 比如当我们相应的文件内容或文件名被修改后,我们同时也要更新 Core Spotlight 索引, 更新的方法同样使用 indexSearchableItems 方法:
CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([newItem]) { error in
}
另外,如果文件被删除了, 我们还要记得也同时删除它的索引, 删除索引有三种方法:
通过 uniqueIdentifier 删除
func deleteSearchableItemsWithIdentifiers(identifiers: [String], completionHandler: ((NSError?) -> Void)?)
通过 domainIdentifier 删除
func deleteSearchableItemsWithDomainIdentifiers(domainIdentifiers: [String], completionHandler: ((NSError?) -> Void)?)
删除本应用所有的索引
func deleteAllSearchableItemsWithCompletionHandler(completionHandler: ((NSError?) -> Void)?)
经过一番折腾后,大家是不是觉得 Core Spotlight 的接口还挺简单的。我自己觉得挺方便的。 不过虽然简单,但它的作用还是挺大的。合理使用 Core Spotlight 索引,无疑是增加我们 App 入口机会的一个好方法。 当然注册索引的时候一定要合理,比如我们的 App 是一个文本编辑器,那么就可以将每个文本文件作为索引。 如果我们是一个新闻 App 那么每条新闻作为索引就最合适不过。这样用户点击进来就正好是他们想要的东西,对这个 App 的好感也会有所提高。