从Swift或Objective-C应用程序中检索Finder标签

时间:2018-09-09 18:42:01

标签: swift macos cocoa finder

使用NSURL API,我如何确定目录中设置了哪些标签?我所知道的唯一API确实确实返回了与标签关联的数字,但是我不确定如何从返回的值中提取特定标签。

例如,这将为目录4返回B。我需要确定同时设置了BlueGreen标签。

let url = URL(fileURLWithPath: "/Users/Username/Desktop/Test/B")
let resourceValues = try! url.resourceValues(forKeys: 
      [URLResourceKey.labelNumberKey])
print(resourceValues.labelNumber!) // 4

enter image description here

我已经看到有人使用enum将结果映射回Swift,但这似乎无法处理多个标签。

enum LabelColor: Int {
    case none
    case gray
    case green
    case purple
    case blue
    case yellow
    case red
    case orange
}

因此看来OptionSet将是Swift的最佳实现。

如果有人能指出我要从总数中提取标签的算法,那就太好了!

1 个答案:

答案 0 :(得分:0)

除了 through a shell 之外,我不知道有什么方法可以将数值抓取到标签中。

但是,您可以按照@Martin-R 的建议,获取附加到文件的标签数组。我认为这是最好的,因为用户可以创建自定义标签,这可能很难用数字识别。

我建议使用 ⤵︎ 获取数组

var itemTags: [String] = []
do {
    let resources = try url.resourceValues(forKeys: [.tagNamesKey])
    if let tags = resources.tagNames {
        itemTags = tags // ["Green", "Red"]
    }
} catch {}

一旦你有了数组,你就可以使用某种 enum & switch、for 循环或 if/else 来匹配你自己指定的颜色。

秘制酱汁⤵︎

现在的问题是,如果您在沙盒中尝试此操作,您可能只会获得我想象的一个标签。它将是最前面的标签。

这只是 Apple 的另一项安全措施。 要解决此问题,您的沙箱需要扩展到此资源。

这篇博文中涉及安全范围的内容有点多,但您可以尝试以下两件事。

  1. 使用 NSOpenPanel() 获取 url 或父目录 url。这将自动为您授予该会话的该资源的权限。您可以为它添加书签、解决它,and start accessing it

  2. 停止使用沙箱

不幸的是,我不知道其他可行的解决方案。我选择了第一个,目前它是最不痛苦的。