无需用户从 DocumentBrowser 中选择即可呈现 iCloud 文件

Posted

技术标签:

【中文标题】无需用户从 DocumentBrowser 中选择即可呈现 iCloud 文件【英文标题】:Present an iCloud file without user picking it from the DocumentBrowser 【发布时间】:2018-10-19 19:05:07 【问题描述】:

我的应用首次启动时需要加载一个 iCloud 文件。我希望应用程序显示从应用程序关闭时最后打开的文件,因此如果最后打开的文件是 iCloud 文件,这就是我遇到问题的地方。

首先让我声明,如果最后打开的文件在我的文档目录中而不是在 iCloud 中,那么我可以毫无问题地打开它。我不能只存储完整的 url 路径,因为我的应用程序的沙箱目录可以在重新打开应用程序时更改,所以我将最后打开的文件相对于最后打开的文件的文档目录的路径附加到我的 documentDirectory 路径在运行时通过这样做:

var myfolder: URL? 
        get 
            do 
                let docsurl = try fileManager.url(for:.documentDirectory,
                                         in: .userDomainMask, appropriateFor: nil, create: false)
                return docsurl
             catch 
                return nil
            
        
    

然后是这个

if let lastOpenedFile = UserDefaults.standard.string(forKey: "lastOpenedFile") 
        let lastOpenedFileURL = myfolder!.appendingPathComponent(lastOpenedFile)
        print(lastOpenedFileURL.path)
        if (FileManager.default.fileExists(atPath: lastOpenedFileURL.path)) 
                documentBrowserViewController.presentDocument(at: lastOpenedFileURL)
        

(如果这是一种不好的做法,请告诉我!)

现在回到主要问题。对于 iCloud 文件,保存 url 是个问题,但问题不是沙箱目录已更改,而是因为这里提到的内容,我无法访问 url:How to access files in iCloud Drive from within my ios app? 说

文档选择器调用委托的 documentPicker:didPickDocumentAtURL: 方法当用户选择一个 应用程序沙箱之外的目的地。系统会保存一份 您的文件到指定的目的地。文档选择器 提供副本的 URL 以指示成功;但是,您的应用确实 无权访问此 URL 引用的文件。

所以我的问题是,如果它是 iCloud 文件,我如何加载最后打开的文件? documentBrowser 可以访问它,但这是因为用户选择了屏幕上的文件,并且出于保护原因我无法在代码中模拟它吗?提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

文档选择器用于将文件复制到应用程序的沙箱和另一个沙箱中或从中复制出来。

如果文件存储在通用 iCloud Drive 而不是应用程序的私有 iCloud 容器中,您可以通过 Ubiquity Url - https://developer.apple.com/documentation/foundation/filemanager/1411653-url 访问它们

您可以通过类似于url(for:.documentDirectory 的方式将您的相对路径附加到普遍性网址

【讨论】:

以上是关于无需用户从 DocumentBrowser 中选择即可呈现 iCloud 文件的主要内容,如果未能解决你的问题,请参考以下文章

用户界面:多选选择框

如何从 Spotify 获取艺术家的 URI,而无需从 Spotify 手动复制艺术家的 URI

从会话外部更新在线用户数据(无需重新验证)

SWTableviewcell - 无需滑动或选择即可调用动画方法

将值从选择器视图设置为文本字段,而无需以编程方式全局快速声明 uitextfield

从精简版到完整版,适用于 APP 旧/当前用户的完整版,无需应用内购买