iOS 11:如何获取基于云的文件的位置(文件提供程序)名称?



我的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 云盘中的某个位置时,您才会获得结果。

最新更新