似乎访问 macOS Finder 当前选定的文件/文件夹的唯一方法是通过脚本桥。 SwiftScripting 项目提供了一些预先生成的扩展供使用。代码相当简单:
public func getSelected() -> [NSURL] {
guard let app = SBApplication(bundleIdentifier: "com.apple.finder") else {
print("no app")
return []
}
let finder = app as FinderApplication
guard let result = finder.selection else {
print("No items selected")
return []
}
print("result", result)
guard let selection = result.get() else {
print("get failed: ", result.lastError() ?? "")
return []
}
print("selection", selection)
return []
}
但不幸的是选择失败
get
result <SBObject @0x600000d26310: selection of application "Finder" (6039)>
get failed: Error Domain=NSOSStatusErrorDomain Code=-1743 "(null)" UserInfo={ErrorNumber=-1743}
该错误是
errAEEventNotPermitted
。这表明该应用程序需要正确的权利。 App Store 不允许临时例外——但理论上应该足够了。脚本目标可能是可行的方法 - 但似乎几乎不可能找到相关文档。
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.temporary-exception.apple-events</key>
<array>
<string>com.apple.finder</string>
</array>
<key>com.apple.security.scripting-targets</key>
<dict>
<key>com.apple.finder</key>
<array>
<string>???</string>
</array>
</dict>
</dict>
我缺少哪些部分才能使其正常工作?
更新:
我缺少的是
Info.plist
中的许可。需要设置键Privacy - AppleEvents Sending Usage Description
。这使得 get
调用成功。
要通过应用程序商店审核,仍然需要正确设置
com.apple.security.scripting-targets
。
我仍在寻找有关 Finder 可用的目标配置的信息。