一、CoreSpotlight 简介
iOS9 推出了 CoreSpotlight 框架,这个框架可以为 iOS 的搜索 App 内部的数据,能够使我们在 iPhone 上下拉出现得搜索框中,搜索我们使用的 App 中的内容(当然 App 需要做适配,才能搜索到)。在 iOS 9 之前这是一个私有的 API,只有系统能搜索,并且无法搜索到 App 里面的内容。如下图:我们输入一个“海”字,就能搜索到哪些 App 中包含“海”的信息。
CoreSpotlight 搜索
对于 CoreSpotlight 可以类比 NSUserDefault,都是全局的存储空间。不同的是 CoreSpotlight 是系统的存储空间,而
NSUserDefault 是每个 App 私有的,其他 App 无法访问。另外对于存储的内容
CoreSpotlight 存储的是 item,即 CSSearchableItem,而每个
CSSearchableItem 又有许多属性,这些属性是通过
CSSearchableItemAttributeSet 进行设置。
二、Core Spotlight 使用样例
1. 导入头文件
import CoreSpotlight
2. 基本使用
let set = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)
set.title = "盗梦空间"
set.contentDescription = "《盗梦空间》是由克里斯托弗·诺兰执导,莱昂纳多·迪卡普里奥,玛丽昂·歌迪亚等主演的电影。影片剧情游走于梦境与现实之间,被定义为“发生在意识结构内的当代动作科幻片”。影片讲述由莱昂纳多·迪卡普里奥扮演的造梦师,带领约瑟夫·高登-莱维特、艾伦·佩吉扮演的特工团队,进入他人梦境,从他人的潜意识中盗取机密,并重塑他人梦境的故事。"
set.keywords = ["盗梦空间", "daomengkongjian"]
set.thumbnailData = UIImage(named: "inception")?.pngData()
set.rating = 4.5
set.ratingDescription = "4.2分"
let item = CSSearchableItem(uniqueIdentifier: "uniqueIdentifier", domainIdentifier: "domainIdentifier", attributeSet: set)
CSSearchableIndex.default().indexSearchableItems([item], completionHandler: nil)
当我们搜索 simple 时,就会出现刚才我们自己的 APP,keywords 是一个数组,可以容纳很多关键字,只要在这个数组中的关键字,都可以被搜索到。
WX20181123-153437@2x.png
注意:如果没有设置 thumbnail,默认用 App 的 icon 作为 Logo。
3. 显示时间
// 注意类型
let set = CSSearchableItemAttributeSet(itemContentType: kUTTypeMessage as String)
set.title = "盗梦空间"
set.contentDescription = "《盗梦空间》是由克里斯托弗·诺兰执导,莱昂纳多·迪卡普里奥,玛丽昂·歌迪亚等主演的电影。影片剧情游走于梦境与现实之间,被定义为“发生在意识结构内的当代动作科幻片”。影片讲述由莱昂纳多·迪卡普里奥扮演的造梦师,带领约瑟夫·高登-莱维特、艾伦·佩吉扮演的特工团队,进入他人梦境,从他人的潜意识中盗取机密,并重塑他人梦境的故事。"
set.keywords = ["盗梦空间", "daomengkongjian"]
set.contentCreationDate = Date()
let item = CSSearchableItem(uniqueIdentifier: "uniqueIdentifier", domainIdentifier: "domainIdentifier", attributeSet: set)
CSSearchableIndex.default().indexSearchableItems([item], completionHandler: nil)
显示时间
4. 导航
set.latitude = 123
set.longitude = 23
set.supportsNavigation = true
导航
5. 拨打电话
set.phoneNumbers = ["18300000000", "17300000000"]
set.supportsPhoneCall = true
显示电话
注意:虽然 phoneNumbers 属性是一个数组,但是在测试中发现,当点击电话按钮时,只会拨打第一个电话,并且只在真机上有效,模拟器无效
6. 删除索引
func deleteSearchableItems(withIdentifiers identifiers: [String], completionHandler: ((Error?) -> Swift.Void)? = nil)
func deleteSearchableItems(withDomainIdentifiers domainIdentifiers: [String], completionHandler: ((Error?) -> Swift.Void)? = nil)
func deleteAllSearchableItems(completionHandler: ((Error?) -> Swift.Void)? = nil)
7. 监听点击
在 AppDelegate
中实现以下代理方法:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Swift.Void) -> Bool