Swift 未下载文件时从文件应用程序打开文件(使用就地打开)

Swift 未下载文件时从文件应用程序打开文件(使用就地打开),swift,Swift,我希望我的用户能够点击文件应用程序中的文件,并将其发送到我的应用程序。以前,我的应用程序设置可以成功地从邮件中打开文件,当文件以这种方式共享时,使用“open in”。我使用的文件类型是我的应用程序自定义的。文档类型、导出的UTI和导入的UTI是为了启用“打开”而创建的,尚未更改 如果文件还没有在文件应用程序中下载,我会收到一个错误(文件名旁边有一个向下箭头的小云)。即使你长时间点击它并选择“共享”和“打开”,我也会得到同样的错误 如果该文件是从该设备添加到文件中的,则该文件已经下载,在“文件”

我希望我的用户能够点击文件应用程序中的文件,并将其发送到我的应用程序。以前,我的应用程序设置可以成功地从邮件中打开文件,当文件以这种方式共享时,使用“open in”。我使用的文件类型是我的应用程序自定义的。文档类型、导出的UTI和导入的UTI是为了启用“打开”而创建的,尚未更改

如果文件还没有在文件应用程序中下载,我会收到一个错误(文件名旁边有一个向下箭头的小云)。即使你长时间点击它并选择“共享”和“打开”,我也会得到同样的错误

如果该文件是从该设备添加到文件中的,则该文件已经下载,在“文件”中点击该文件可以正常工作。在将文件发送到我的应用程序之前,我如何强制文件下载该文件?我在网上搜索过,我能找到的唯一参考资料是这里:最后一篇文章谈到了同样的问题,但我在任何地方都找不到解决方案

在我的info.plist文件中,我的应用程序设置“支持就地打开文档”设置为“是”。我还将“应用程序支持iTunes文件共享”设置为“是”

我正在检查
应用程序(uquo:open:options:)
方法中options[.openInPlace]的值,以检测文件是否来自文件应用程序。我必须先将调用添加到
url.startAccessingSecurityScopedResource()
,然后才能在设备上下载文件时使用

下面是进行处理的代码的精简版本:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
let isOpenInPlace = options[.openInPlace] as? Bool
var securityScopedResource = false

if isOpenInPlace {
    securityScopedResource = url.startAccessingSecurityScopedResource()
}

do {
    let data = try Data(contentsOf: url)
    // Use the data to create something inside my app

    if securityScopedResource {
        url.stopAccessingSecurityScopedResource()
    }
} catch {
    print("ERROR: \(error.localizedDescription)")
    if securityScopedResource {
        url.stopAccessingSecurityScopedResource()
    }
}
我得到的错误是:

ERROR: The file <filename.ext> couldn't be opened because there is no such file

此方法启动下载,但它是异步的,并立即返回。我正试图找到一种可靠的方式开始下载,等到下载完成后再进入我的应用程序的下一步。任何帮助都将不胜感激

如何从通过文件打开文件到通过AppDelegate接收文件?通过将“支持在适当位置打开文档”声明为“是”,操作系统会将它们发送到AppDelegate方法
应用程序(uquo:open:options:)
。用户只需点击该文件,它就会被发送到你的应用程序。这是AppDelegate中的方法,当用户选择“在中打开”时,它们也会被发送。为什么不使用
UIDocumentPickerController
,这样他们就不会选择一个不完整的文件?你是说不下载“不完整”吗?我不想在我的应用程序中实现UIDocumentPickerController——我只想能够从iCloud获取文件作为输入。iCloud(或DropBox)中的文件将只是他们文档的备份副本,我并没有实际编辑它们。
try FileManager.default.startDownloadingUbiquitousItem(at: url)