swift - 从 Swift 或 Objective-C 应用程序中检索 Finder 标签
问题描述
使用NSURL
API,我如何确定在目录上设置了哪些标签?我知道的唯一 API 确实返回了与标签关联的数字,但我不确定如何从返回值中提取特定标签。
例如,这将返回4
目录B
。我需要确定Blue
和Green
标签都已设置。
let url = URL(fileURLWithPath: "/Users/Username/Desktop/Test/B")
let resourceValues = try! url.resourceValues(forKeys:
[URLResourceKey.labelNumberKey])
print(resourceValues.labelNumber!) // 4
我见过一些使用 anenum
将结果映射回 Swift,但这似乎不能处理多个标签。
enum LabelColor: Int {
case none
case gray
case green
case purple
case blue
case yellow
case red
case orange
}
所以OptionSet
对于 Swift 来说,这似乎是最好的实现。
如果有人可以指出用于从总数中提取标签的算法,那就太好了!
解决方案
除了通过 shell之外,我不知道有任何方法可以将数值抓取到标签中。
但是,正如@Martin-R 建议的那样,您可以获取附加到文件的标签数组。我认为这是最好的,因为用户可以创建自定义标签,这可能很难用数字识别。
我建议使用 ⤵︎ 获取数组
var itemTags: [String] = []
do {
let resources = try url.resourceValues(forKeys: [.tagNamesKey])
if let tags = resources.tagNames {
itemTags = tags // ["Green", "Red"]
}
} catch {}
一旦你有了数组,你就可以使用某种枚举和开关、for 循环或 if/else 来匹配你自己指定的颜色。
秘制酱⤵︎
现在的问题是,如果你被沙盒化并且你尝试这个,你可能只会得到一个我想象的标签。它将是最前面的标签。
这只是 Apple 的另一项安全措施。要解决此问题,您的沙箱需要扩展到此资源。
在这篇文章中涉及安全范围的内容有点多,但是您可以尝试以下两件事。
用于
NSOpenPanel()
获取 url 或父目录 url。这将自动为您授予该会话对该资源的权限。您可以为它添加书签、解决它并开始访问它。停止使用沙盒
不幸的是,我不知道其他可行的解决方案。我选择了第一个,这是目前最不痛苦的。
推荐阅读
- javascript - 将 JS Web 程序集导入 TypeScript
- php - PHP 中的 REST API 请求 - 查询错误
- javascript - 减少中的连接不起作用?
- android - Firebase 回收器视图适配器
- computer-vision - 平均 SIFT 特征进行姿态估计
- php - 如何按条件过滤内爆结果?
- python - 多处理:主进程未终止
- c++ - boost multi_index - 如果元素的类型是仅移动,如何将元素从一个容器添加到另一个容器?
- python - face_recognition knn 算法:是否可以在生成的 .clf 文件中添加更多面孔而不必再次重新训练所有内容?
- php - Apache 重写规则擦除全局 $_SERVER['request-uri']