无法通过“在以下位置打开”共享文件夹中的“ iOS文件”应用程序打开文件:提供的文件URL上没有文件

时间:2019-01-30 23:24:22

标签: ios swift icloud nsfilemanager

我的iOS应用可以打开CSV文件,以便导入其数据。我可以通过UIDocumentPickerViewController从应用程序内打开文件而没有问题,选择“文件”应用程序中显示的文件。但是,当先在“文件”应用程序中查看文件,然后从那里打开我的应用程序时(通过“打开方式”共享表),我的应用程序无法在传递给我的应用程序的URL上看到该文件。该文件似乎不存在。

我在AppDelegate中添加了以下调试代码:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
    print("Exists: \(FileManager.default.fileExists(atPath: url.path)) (\(url.path))")
    return true
}

当我从此应用程序中的“文件”中打开文件时,它会显示如下日志行:

  

存在:错误(/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/Reading List - Andrew’s iPhone - 2018-10-18 11-19.csv

当我从其他应用程序(例如Dropbox或电子邮件)打开文件时,可以处理文件 ,并记录以下内容:

  

存在:是(/private/var/mobile/Containers/Data/Application/F9110F90-7A91-4AB6-A92E-0ED933184EA4/Documents/Inbox/Reading List - Andrew’s iPhone - 2018-01-27 08-03.csv

请注意不同的路径(Documents/InboxMobile Documents/com~apple~CloudDocs)。是什么原因造成的?如何在我的应用程序中支持通过“文件”应用程序打开文件?

我的应用程序支持的文档类型如下:

Xcode document types

3 个答案:

答案 0 :(得分:4)

我通过调整应用程序的Info.plist中的某些设置来解决此问题。

我将UISupportsDocumentBrowser切换为false,并添加了LSSupportsOpeningDocumentsInPlace,也将其设置为false

在我收到来自App Store Connect的电子邮件时,我认为这些设置(我)设置不正确:

  

无效的文档配置-基于文档的应用程序应支持文档浏览器(UISupportsDocumentBrowser = YES)或实现就地打开(LSSupportsOpeningDocumentsInPlace = YES / NO)。访问https://developer.apple.com/document-based-apps/了解更多信息。

答案 1 :(得分:1)

LSSupportsOpeningDocumentsInPlace标志设置为false会阻止在“文件”应用程序中选择文件时自动打开该应用程序。如果文件在原地打开,则需要首先请求/解锁访问:

 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {     
   let opensInPlace = options[.openInPlace] != nil
   opensInPlace ? url.startAccessingSecurityScopedResource() : nil
   let fileExists = FileManager.default.fileExists(atPath: url.path)  
   opensInPlace ? url.stopAccessingSecurityScopedResource() : nil
 }

答案 2 :(得分:-1)

我认为您不能在不同应用程序(不在同一应用程序组中)之间共享文件:

[Sharing data between apps on iOS