我的iOS 11应用程序使用UIDocumentPickerViewController(在.open
模式下(处理基于云的文件。获得 URL 后,如何获取存储文件的位置(文件提供程序(的名称?(如"iCloud"、"Dropbox"等(
我最好的猜测是URLResourceValues.ubiquitousItemContainerDisplayName
,但它似乎仅适用于iCloud。
下面是一个测试代码:
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
guard let url = urls.first else { return }
let isAccessible = url.startAccessingSecurityScopedResource()
let res = try! url.promisedItemResourceValues(forKeys: [.ubiquitousItemContainerDisplayNameKey])
print("Container name: (res.ubiquitousItemContainerDisplayName)")
if isAccessible {
url.stopAccessingSecurityScopedResource()
}
}
对于从iCloud中选择的文件,它会打印"iCloud Drive"。但对于基于 Dropbox 的文件,容器名称为nil
。
我错过了什么吗?还有别的办法吗?
这是不可能的。Apple 不允许您获取此信息以保护用户的隐私。
这适用于iOS 15,可能更早:
func documentPicker(_ controller: UIViewControllerType, didPickDocumentsAt urls: [URL]) {
guard let url = urls.first else { return }
guard url.startAccessingSecurityScopedResource() else {
print("unable to access security scoped resource: (url.absoluteString)")
return
}
defer { url.stopAccessingSecurityScopedResource() }
let fileCoord = NSFileCoordinator.init()
fileCoord.coordinate(readingItemAt: url, options: .immediatelyAvailableMetadataOnly, error: nil) { (url) in
if let res = try? url.resourceValues(forKeys: [.ubiquitousItemContainerDisplayNameKey]),
let name = res.ubiquitousItemContainerDisplayName {
print("(name)")
} else {
print("no name found")
}
}
}
仅当 URL 代表 iCloud 云盘中的某个位置时,您才会获得结果。