你需要了解的 Core Spotlight
--
了解Spotlight
Core Spotlight是iOS 9中苹果推出了新的Search API,可以直接搜App内的内容(in-App Search),这样用户更容易找到他们想要的内容,哪怕这个内容是在某个 App 内部的,从而大大提高 App 的使用度和曝光度。
项目的下载地址:SpotlightDemo项目地址
项目完工的?:
使用Spotlight
1 - 导入Framework
MobileCoreServices.framework
, CoreSpotlight.framework
在使用类中导入以下的文件
import CoreSpotlight
import MobileCoreServices
2 - 开始使用
2.1 - CSSearchableItemAttributeSet
我们先通过CSSearchableItemAttributeSet
开始
//用kUTTypeImage 或者 kUTTypeText 没啥影响
let attr = CSSearchableItemAttributeSet(itemContentType: kUTTypeImage as String)
//标题
attr.title = "上海"
//搜索关键字
attr.keywords = ["金融","shanghai","魔都"]
//描述信息,可以显示在搜索结果里
attr.contentDescription = "上海港货物吞吐量和集装箱吞吐量均居世界第一,是一个良好的滨江滨海国际性港口"
//搜索的图片
let defalutImgae = UIImage(named:"gankoo01")
attr.thumbnailData = UIImagePNGRepresentation(defalutImgae!)
上面这段代码完成了 attributeSet 的创建。 它的构造方法接受一个 itemContentType 参数,这个表示我们要创建的搜索项所对应的数据类型,我们这里使用的是kUTTypeText,它表示文本数据。
2.2 - CSSearchableItem
有了这些信息,我们就可以创建 CSSearchableItem 了:
SSearchableItem 接受 3 个参数,第一个就是 uniqueIdentifier,接下来是 domainIdentifier,最后是我们刚刚创建的attributeSet。这里如果要设置多个可以检索的项目uniqueIdentifier和domainIdentifier必须都不相同,否则无法搜索到。
let sm = CSSearchableItem(uniqueIdentifier: "identifier_001", domainIdentifier: "domainIdentifier_001", attributeSet: attr)
2.3 - CSSearchableIndex
创建后搜索项后,我们还要做最后一步操作,就是把它注册到 Spotlight 的搜索系统中:
CSSearchableIndex.default().indexSearchableItems([sm,sm2], completionHandler: { error in
if error != nil{
print("创建Spotlight索引失败:\(error?.localizedDescription)")
}
})
到此为止,Core Spotlight 的注册过程就完成了。如果你把上面的代码放到你的 App 工程中,然后运行程序,就可以在 Spotlight 搜索框中搜索到自己 App 的内容了。
处理 Spotlight 调起
Spotlight 的注册工作完成了,如果没有什么异常情况,你应该可以在搜索结果中看到自己的应用内容了。现在我们开始处理点击搜索结果项后的调起操作,我们在AppDelegate
中添加系统的回调方法:
//通过Spotlight进入APP
func application(_ application: UIApplication, willContinueUserActivityWithType userActivityType: String) -> Bool {
if userActivity?.activityType == CSSearchableItemActionType {
// let idetifier = (userActivity?.userInfo?[CSSearchableItemActivityIdentifier] as? String) !
guard let idfier = userActivity?.userInfo?[CSSearchableItemActivityIdentifier] as? String else {
return false
}
if idfier == "gankoo" {
print(userActivity?.userInfo ?? "")
}
}
return true
}
当我们点击 Spotlight 搜索项的时候, 系统会调用我们 APPDelegate 的 application:continueUserActivity 方法, 这里我们判断 activity 类型。 只有类型为 CSSearchableItemActionType 的才是来自 Spotlight 的跳转。
然后在 userInfo 中,我们可以通过 CSSearchableItemActivityIdentifier 这个 key 来得到相应搜索项的 uniqueIdentifier。 在我们这个例子中,它就是我们要打开文件的路径。 然后调用相应的文件处理方法就完成了
参考: