将CSSearchableItem添加到Core Spotlight(MacOS)

时间:2017-11-20 12:27:48

标签: swift macos macos-high-sierra corespotlight

我最近想用Core Spotlight在我的一个项目中进行搜索。但是,每当我将一个CSSearchableItem添加到SearchIndex时,我在完成处理程序中得到一个错误,其中包含描述:

The operation couldn’t be completed. (CSIndexErrorDomain error -1.)

根据Apple的参考,错误代码-1引用Unknown Error,这并不完全有用。我在我的应用程序中添加了CoreSpotlight和CoreServices框架,我真的不知道我可能做错了什么。

我把一个最小的例子放在一起:

import Foundation
import CoreSpotlight

print("Start indexing...")
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
attributeSet.title = "test element"
attributeSet.contentDescription = "This is a description."
attributeSet.keywords =  ["test1", "test2", "test3"]
let item = CSSearchableItem(uniqueIdentifier: "123455", domainIdentifier: "TestDomain", attributeSet: attributeSet)
var ready = false
CSSearchableIndex.default().indexSearchableItems([item]) { (error) in
    if error == nil {
        print("Success")
    } else {
        print(error?.localizedDescription)
    }
    ready = true
}
//Wait for the block to finish
while (ready == false) {
    sleep(1)
}
print("Finish indexing...")

我设法从WWDC17编译Apple的Core Spotlight示例项目,它实际上没有错误地工作。但是,我无法使用系统范围的Spotlight搜索获取索引项目。

有没有人知道可能会发生什么?顺便说一句,我正在运行最新的High Sierra版本。

[编辑]刚才看到,实际上有其他人有这个问题。但是,问题尚未得到解答:Error while using CoreSpotlight

[Edit2]更新到10.13.2后,行为发生了变化。放在游乐场的这段代码现在正在运行;但是,我的应用程序中放置的相同代码仍然会产生错误,但它确实包含更多信息。打印错误对象会导致:

Error Domain=CSIndexErrorDomain Code=-1003 "(null)" 
UserInfo={NSUnderlyingError=0x60000105f6e0 
{Error Domain=NSCocoaErrorDomain Code=4097 
"Couldn’t communicate with a helper application."}}

正如它向我展示的那样,这显然是框架中的一个错误,或者您对此有何看法?

2 个答案:

答案 0 :(得分:2)

使用macOS 10.13,SIP和App Sandbox似乎变得更加严格。 经过大量的挖掘才能完成这项工作,这就是我所做的,也应该为其他人阅读本文:

  1. 在Xcode中,切换运行CoreSpotlight代码的目标的“App Sandbox”功能。如果这是在框架中,它需要是托管应用程序的目标。对于新项目而言,这不是必需的(有关详细信息,请参阅this bug report)。
  2. 启用将运行CoreSpotlight代码的应用程序/二进制文件的开发签名。就我而言,它是测试主机。

答案 1 :(得分:0)

最终我设法以某种方式解决了这个问题,我按照提示说代码在操场上工作。所以我做了我想做的事情并将代码放在框架中。 没有任何进一步的变化,它开始起作用。显然它与项目配置有关,但如果有人想出了Spotlight失败的根本原因,那将会很棒。