我有一个应用,我想添加对Spotlight的支持。
我已经使用NSUserActivity实现了它,并且效果很好。不利之处在于,用户需要“打开”文档才能使其显示在聚光灯下。
因此,除了使用NSUserActivity之外,我还想使用Core Spotlight在用户启动应用或导入新内容时为所有应用内容编制索引。
这是一个简单的操作:
func indexNewDocuments() {
let documentsToBeIndexed = ...
CSSearchableIndex.default().indexSearchableItems(documentsToBeIndexed) { (error) -> Void in
if error != nil {
print(error!.localizedDescription)
} else {
// Indexed
}
}
}
documentsToBeIndexed
数组是在我的文档对象上使用几个计算出的var生成的:
var attributeSet: CSSearchableItemAttributeSet {
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeArchive as String)
attributeSet.title = title
attributeSet.contentDescription = "document description"
return attributeSet
}
var searchableItem: CSSearchableItem {
return CSSearchableItem(uniqueIdentifier: id,
domainIdentifier: "com.myApp.document",
attributeSet: attributeSet)
}
一切正常,我可以看到在Spotlight中正确索引了所有数据库(在用户打开文档之前)。
问题是当用户从Spotlight中选择文档后,我尝试导航。
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard userActivity.activityType == "com.myApp.document" else {
return false
}
//Navigation
return true
}
这仅适用于NSUserActivty
(因此,当用户先前打开文档时)。
通过CoreSpotlight编制索引无法正常工作,原因是:
po userActivity.activityType
"com.apple.corespotlightitem"
po userActivity.userInfo
▿ Optional<Dictionary<AnyHashable, Any>>
▿ some : 1 element
▿ 0 : 2 elements
▿ key : AnyHashable("kCSSearchableItemActivityIdentifier")
- value : "kCSSearchableItemActivityIdentifier"
- value : e7ed763e42ecf3312bb7fe931f28e694
由于某种原因,使用Core Spotlight编制索引时,我没有收到正确的userActivity。
我想念什么吗?
PS:我还将密钥添加到了信息列表NSUserActivityTypes