Cannot open file from iOS Files app via the Open In <My App> share sheet: no file at the provided file URL exists
Asked Answered
A

3

14

My iOS app can open CSV files, in order to import their data. I can open files from within the app via a UIDocumentPickerViewController with no issues, selecting a file shown in the Files app. However, when viewing a file in the Files app first, and then opening my app from there (via the Open In share sheet), my app cannot see the file at the URL passed to my app. The file does not seem to exist.

I added the following debug code to my 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
}

When I open a file from Files in this app, it results in a log line like:

Exists: false (/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/Reading List - Andrew’s iPhone - 2018-10-18 11-19.csv)

When I open a file from some other app (e.g. Dropbox, or from an Email), the file can be processed, and the following is logged:

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

Note the different path (Documents/Inbox vs Mobile Documents/com~apple~CloudDocs). What is causing this? How can I support the opening of files from the Files app in my app?

The document type(s) supported by my app are as follows:

Xcode document types

Azotobacter answered 30/1, 2019 at 23:24 Comment(0)
A
18

I fixed this by adjusting some settings in the app's Info.plist.

I switched UISupportsDocumentBrowser to false, and added LSSupportsOpeningDocumentsInPlace, also set to false.

I think these settings were set incorrectly (by me) after I received an email from App Store Connect stating:

Invalid Document Configuration - Document Based Apps should support either the Document Browser (UISupportsDocumentBrowser = YES) or implement Open In Place (LSSupportsOpeningDocumentsInPlace = YES/NO). Visit https://developer.apple.com/document-based-apps/ for more information.

Azotobacter answered 31/1, 2019 at 19:39 Comment(1)
Thank you, it worked. For me setting LSSupportsOpeningDocumentsInPlace to false was enoughPuseyism
S
8

Setting the LSSupportsOpeningDocumentsInPlace flag to false prevents the app to be automatically opened when selecting the file in the Files App. In case the the file is opened in place one needs to request/unlock access first:

 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
 }
Sevenup answered 7/7, 2020 at 8:23 Comment(0)
E
-1

I don't think you can share files between different apps (that are not in the same app group):

Sharing data between apps on iOS

Eolande answered 31/1, 2019 at 1:46 Comment(1)
Well, the app does successfully open files from other apps (Mail, Dropbox), just not from the Files appAzotobacter

© 2022 - 2024 — McMap. All rights reserved.