Mi aplicación iOS puede abrir archivos CSV para importar sus datos. Puedo abrir archivos desde la aplicación a través de un UIDocumentPickerViewController
sin problemas, seleccionando un archivo que se muestra en la aplicación Archivos. Sin embargo, cuando primero veo un archivo en la aplicación Archivos y luego abro mi aplicación desde allí (a través de la hoja para compartir Abrir en), mi aplicación no puede ver el archivo en la URL que se le pasó a mi aplicación. El archivo no parece existir.
Agregué el siguiente código de depuración a mi 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 }
Cuando abro un archivo de Archivos en esta aplicación, aparece una línea de registro como:
Existe: false (
/private/var/mobile/Library/Mobile Documents/com~apple~CloudDocs/Reading List - Andrew's iPhone - 2018-10-18 11-19.csv
)
Cuando abro un archivo desde alguna otra aplicación (por ejemplo, Dropbox o desde un correo electrónico), el archivo se puede procesar y se registra lo siguiente:
Existe: verdadero (
/private/var/mobile/Containers/Data/Application/F9110F90-7A91-4AB6-A92E-0ED933184EA4/Documents/Inbox/Reading List - Andrew's iPhone - 2018-01-27 08-03.csv
)
Tenga en cuenta la ruta diferente ( Documents/Inbox
de entrada frente a Mobile Documents/com~apple~CloudDocs
). ¿Qué está causando esto? ¿Cómo puedo admitir la apertura de archivos desde la aplicación Archivos en mi aplicación?
Los tipos de documentos compatibles con mi aplicación son los siguientes:
Lo solucioné ajustando algunas configuraciones en Info.plist de la aplicación.
UISupportsDocumentBrowser
a false
y agregué LSSupportsOpeningDocumentsInPlace
, también establecido en false
.
Creo que esta configuración se configuró incorrectamente (por mí) después de recibir un correo electrónico de App Store Connect que decía:
Configuración de documento no válida: las aplicaciones basadas en documentos deben ser compatibles con el Explorador de documentos (UISupportsDocumentBrowser = YES) o implementar Open In Place (LSSupportsOpeningDocumentsInPlace = YES/NO). Visite https://developer.apple.com/document-based-apps/ para obtener más información.
Establecer el indicador LSSupportsOpeningDocumentsInPlace
en falso evita que la aplicación se abra automáticamente al seleccionar el archivo en la aplicación Archivos. En caso de que el archivo se abra en su lugar, primero debe solicitar/desbloquear el acceso:
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 }
No creo que puedas compartir archivos entre diferentes aplicaciones (que no están en el mismo grupo de aplicaciones):