【问题标题】:iOS 11: How to get the location (File Provider) name of cloud-based file?iOS 11:如何获取基于云的文件的位置(文件提供者)名称?
【发布时间】:2019-02-25 05:56:32
【问题描述】:

我的 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

我错过了什么吗?还有其他方法吗?

【问题讨论】:

    标签: ios swift dropbox icloud uidocument


    【解决方案1】:

    这适用于 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 Drive 中的位置时,您才会得到结果。

    【讨论】:

    • 谢谢。我直接通过parsing bookmark data 解决了最初的问题——它恰好包含纯文本的文件提供者 ID。然而,所有的功劳都归功于 Michael Lynn(又名 pudquick),他写了Apple's BookmarkData - exposed!
    • 对不起 - 我意识到我实际上并没有回答你的问题。谢谢你的链接。您的解决方案是一条艰难的道路!
    【解决方案2】:

    这是不可能的。 Apple 不允许您获取此信息以保护用户的隐私。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2019-07-22
      相关资源
      最近更新 更多