web-dev-qa-db-ja.com

<My App> Share Sheet:指定されたファイルのURLのファイルなしでファイルなしでiOSファイルからファイルを開くことはできません。

データをインポートするために、私の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
}
 _

このアプリのファイルからファイルを開くと、次のようなログ行が表示されます。

存在します:false(/private/var/mobile/Library/Mobile Documents/com~Apple~CloudDocs/Reading List - Andrew’s iPhone - 2018-10-18 11-19.csv

他のアプリケーション(例えばDropbox、またはEメールから)からファイルを開くと、ファイルが処理できます、次のことが記録されます。

存在します: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

異なるパスに注意してください(Documents/Inbox vs Mobile Documents/com~Apple~CloudDocs)。これを引き起こしているのは何ですか?アプリのファイルアプリからファイルのオープンをサポートする方法

アプリでサポートされている文書タイプは次のとおりです。

Xcode document types

8
Andrew Bennet

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
 }
 _
1
crom87