El manejo del tipo de archivo es nuevo con iPhone OS 3.2, y es diferente de los esquemas de URL personalizados ya existentes. Puede registrar su aplicación para manejar tipos de documentos particulares, y cualquier aplicación que use un controlador de documentos puede transferir el procesamiento de estos documentos a su propia aplicación.
Por ejemplo, mi aplicación Molecules (para la cual está disponible el código fuente) maneja los tipos de archivo .pdb y .pdb.gz, si se reciben por correo electrónico o en otra aplicación compatible.
Para registrar el soporte, necesitará tener algo como lo siguiente en su Info.plist:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>Document-molecules-320.png</string>
<string>Document-molecules-64.png</string>
</array>
<key>CFBundleTypeName</key>
<string>Molecules Structure File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.sunsetlakesoftware.molecules.pdb</string>
<string>org.gnu.gnu-zip-archive</string>
</array>
</dict>
</array>
Se proporcionan dos imágenes que se utilizarán como iconos para los tipos admitidos en Mail y otras aplicaciones capaces de mostrar documentos. La LSItemContentTypes
clave le permite proporcionar una variedad de identificadores de tipo uniforme (UTI) que su aplicación puede abrir. Para obtener una lista de las IU definidas por el sistema, consulte la Referencia de identificadores de tipo uniforme de Apple . Puede encontrar aún más detalles sobre las infecciones urinarias en la Descripción general de los identificadores de tipo uniforme de Apple . Esas guías residen en el centro de desarrolladores de Mac, porque esta capacidad se ha trasladado desde Mac.
Una de las infecciones urinarias utilizadas en el ejemplo anterior estaba definida por el sistema, pero la otra era una infección urinaria específica de la aplicación. La UTI específica de la aplicación deberá exportarse para que otras aplicaciones del sistema puedan conocerla. Para hacer esto, debe agregar una sección a su lista de información como la siguiente:
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.plain-text</string>
<string>public.text</string>
</array>
<key>UTTypeDescription</key>
<string>Molecules Structure File</string>
<key>UTTypeIdentifier</key>
<string>com.sunsetlakesoftware.molecules.pdb</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>pdb</string>
<key>public.mime-type</key>
<string>chemical/x-pdb</string>
</dict>
</dict>
</array>
Este ejemplo particular exporta la com.sunsetlakesoftware.molecules.pdb
UTI con la extensión de archivo .pdb, correspondiente al tipo MIME chemical/x-pdb
.
Con esto en su lugar, su aplicación podrá manejar documentos adjuntos a correos electrónicos o desde otras aplicaciones en el sistema. En Correo, puede tocar y mantener presionado para que aparezca una lista de aplicaciones que pueden abrir un archivo adjunto en particular.
Cuando se abra el archivo adjunto, su aplicación se iniciará y deberá manejar el procesamiento de este archivo en el -application:didFinishLaunchingWithOptions:
método de delegado de su aplicación. Parece que los archivos cargados de esta manera desde Mail se copian en el directorio Documentos de su aplicación en un subdirectorio correspondiente a la casilla de correo electrónico a la que llegaron. Puede obtener la URL de este archivo dentro del método de delegado de la aplicación usando un código como el siguiente:
NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
Tenga en cuenta que este es el mismo enfoque que utilizamos para manejar esquemas de URL personalizados. Puede separar las URL de archivo de otras utilizando código como el siguiente:
if ([url isFileURL])
{
// Handle file being passed in
}
else
{
// Handle custom URL scheme
}
-application:didFinishLaunchingWithOptions:
en la aplicación, solo se llama al delegado si su aplicación no está en segundo plano cuando se abre para manejar un archivo.- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
también en iOS 4+Además de la excelente respuesta de Brad, descubrí que (al menos en iOS 4.2.1) al abrir archivos personalizados desde la aplicación Correo, su aplicación no se activa ni se notifica si el archivo adjunto se ha abierto antes. Aparece la ventana emergente "abrir con ...", pero no hace nada.
Esto parece solucionarse al (re) mover el archivo desde el directorio de la Bandeja de entrada. Un enfoque seguro parece ser tanto (re) mover el archivo a medida que se abre (en
-(BOOL)application:openURL:sourceApplication:annotation:
) como ir a través del directorio Documentos / Bandeja de entrada, eliminando todos los elementos, por ejemplo, enapplicationDidBecomeActive:
. Es posible que se necesite la última captura general para que la aplicación vuelva a estar limpia, en caso de que una importación anterior cause un bloqueo o se interrumpa.fuente
-(BOOL)application:openURL:sourceApplication:annotation:
siempre se llama, incluso para los archivos adjuntos que ya se han abierto. Cada vez que se abre el archivo adjunto, se agrega un número al sufijo del nombre del archivo y se incrementa para que sea único - test.text, test-1.txt, test-2.txt, etc.ADVERTENCIA GRANDE: Asegúrese de CIENTO POR CIENTO que su extensión no esté vinculada a algún tipo de mimo.
Usamos la extensión '.icz' para nuestros archivos personalizados, básicamente, para siempre, y Safari nunca te dejaba abrirlos diciendo "Safari no puede abrir este archivo". no importa lo que hicimos o probamos con las cosas de UT anteriores.
Finalmente, me di cuenta de que hay algunas funciones UT * C que puedes usar para explorar varias cosas, y mientras .icz da la respuesta correcta (nuestra aplicación):
En la aplicación se cargó en la parte superior, solo haz esto ...
y poner un salto después de esa línea y ver qué son UTI y ur - en nuestro caso, era nuestro identificador como queríamos, y la url del paquete (ur) apuntaba a la carpeta de nuestra aplicación.
Pero el tipo MIME que Dropbox nos devuelve para nuestro enlace, que puede verificar haciendo, por ejemplo,
El tipo de contenido es lo que queremos. Dropbox afirma que esta es una entrada de texto / calendario. Excelente. Pero en mi caso, YA Traté de poner texto / calendario en los tipos mime de mi aplicación, y todavía no funciona. En cambio, cuando trato de obtener la UTI y la URL del paquete para el texto / calendario mimetype,
Veo "com.apple.ical.ics" como la UTI y "... / MobileCoreTypes.bundle /" como la URL del paquete. No es nuestra aplicación, sino Apple. Así que trato de poner com.apple.ical.ics en LSItemContentTypes junto con el mío, y en UTConformsTo en la exportación, pero no voy.
Básicamente, si Apple cree que en algún momento quiere manejar algún tipo de tipo de archivo (eso podría crearse 10 años después de que su aplicación esté activa, tenga en cuenta), tendrá que cambiar la extensión porque simplemente no le permitirán manejar El tipo de archivo.
fuente
Para manejar cualquier tipo de archivos para mi propia aplicación, uso esta configuración para CFBundleDocumentTypes:
fuente