¿Cómo asocio tipos de archivos con una aplicación de iPhone?

Resuelto Mihai Damian asked hace 54 años • 5 respuestas

Sobre el tema de asociar la aplicación de tu iPhone con tipos de archivos.

En esta pregunta informativa aprendí que las aplicaciones se pueden asociar con protocolos de URL personalizados.

Eso fue hace casi un año y desde entonces Apple introdujo el 'Soporte de documentos' que va un paso más allá y permite que las aplicaciones se asocien con tipos de archivos. En la documentación se habla mucho sobre cómo configurar su aplicación para iniciar otras aplicaciones apropiadas cuando encuentra un tipo de archivo desconocido. Esto significa que la asociación no funciona de forma inmediata para ninguna aplicación, como lo hizo el registro del protocolo URL.

Esto me lleva a la pregunta: ¿las aplicaciones del sistema como Safari o Mail han implementado este sistema para elegir aplicaciones asociadas o no harán nada, como antes?

Mihai Damian avatar Jan 01 '70 08:01 Mihai Damian
Aceptado

El manejo del tipo de archivo es nuevo en iPhone OS 3.2 y es diferente a los esquemas de URL personalizados ya existentes. Puede registrar su aplicación para manejar tipos de documentos particulares, y cualquier aplicación que utilice un controlador de documentos puede transferir el procesamiento de estos documentos a su propia aplicación.

Por ejemplo, mi aplicación Molecules (cuya código fuente está disponible) maneja los tipos de archivos .pdb y .pdb.gz, si se reciben por correo electrónico o en otra aplicación compatible.

Para registrar 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 LSItemContentTypesclave le permite proporcionar una variedad de identificadores de tipo uniforme (UTI) que su aplicación puede abrir. Para obtener una lista de infecciones urinarias definidas por el sistema, consulte la Referencia de identificadores de tipo uniforme de Apple . Se pueden encontrar aún más detalles sobre las infecciones urinarias en la descripción general de identificadores de tipo uniforme de Apple . Esas guías se encuentran en el centro de desarrolladores de Mac, porque esta capacidad se ha trasladado desde Mac.

Una de las ITU utilizadas en el ejemplo anterior estaba definida por el sistema, pero la otra era una ITU específica de la aplicación. Será necesario exportar la UTI específica de la aplicación para que otras aplicaciones del sistema puedan conocerla. Para hacer esto, agregaría una sección a su Info.plist 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 en particular exporta la com.sunsetlakesoftware.molecules.pdbUTI con la extensión de archivo .pdb, correspondiente al tipo MIME chemical/x-pdb.

Una vez implementado esto, su aplicación podrá manejar documentos adjuntos a correos electrónicos o desde otras aplicaciones del sistema. En Mail, puedes 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, se iniciará su aplicación y deberá manejar el procesamiento de este archivo en su -application:didFinishLaunchingWithOptions:método de delegado de 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 al buzón de correo electrónico al 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 los archivos de otras utilizando un código como el siguiente:

if ([url isFileURL])
{
    // Handle file being passed in
}
else
{
    // Handle custom URL scheme
}
Brad Larson avatar May 06 '2010 13:05 Brad Larson

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 de Correo, su aplicación no se activa ni se notifica si el archivo adjunto se abrió antes. Aparece la ventana emergente "abrir con...", pero no hace nada.

Esto parece solucionarse (re)moviendo el archivo del directorio de la Bandeja de entrada. Un enfoque seguro parece ser (re)mover el archivo a medida que se abre (en -(BOOL)application:openURL:sourceApplication:annotation:), así como recorrer el directorio Documentos/Bandeja de entrada, eliminando todos los elementos, por ejemplo, en applicationDidBecomeActive:. Es posible que se necesite ese último comodín para que la aplicación vuelva a estar limpia, en caso de que una importación anterior provoque un bloqueo o se interrumpa.

mvds avatar Jun 26 '2011 12:06 mvds

GRAN ADVERTENCIA: Asegúrese CIENTO POR CIENTO de que su extensión no esté vinculada a algún tipo mime.

Usamos la extensión '.icz' para nuestros archivos personalizados, básicamente, siempre, y Safari nunca te permitía abrirlos diciendo "Safari no puede abrir este archivo". no importa lo que hicimos o intentamos con el material UT anterior.

Finalmente me di cuenta de que hay algunas funciones UT* C que puedes usar para explorar varias cosas, y aunque .icz da la respuesta correcta (nuestra aplicación):

La aplicación se cargó en la parte superior, solo haz esto...

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, 
                                                                   (CFStringRef)@"icz", 
                                                                   NULL);
CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

y coloque un descanso después de esa línea y vea 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 nos devuelve Dropbox para nuestro enlace, que puedes comprobar haciendo por ejemplo

$ curl -D headers THEURLGOESHERE > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27393  100 27393    0     0  24983      0  0:00:01  0:00:01 --:--:-- 28926
$ cat headers
HTTP/1.1 200 OK
accept-ranges: bytes
cache-control: max-age=0
content-disposition: attachment; filename="123.icz"
Content-Type: text/calendar
Date: Fri, 24 May 2013 17:41:28 GMT
etag: 872926d
pragma: public
Server: nginx
x-dropbox-request-id: 13bd327248d90fde
X-RequestId: bf9adc56934eff0bfb68a01d526eba1f
x-server-response-time: 379
Content-Length: 27393
Connection: keep-alive

El tipo de contenido es lo que queremos. Dropbox afirma que se trata de una entrada de texto/calendario. Excelente. Pero en mi caso, YA INTENTÉ PONER texto/calendario en los tipos MIME de mi aplicación y todavía no funciona. En cambio, cuando intento obtener la UTI y la URL del paquete para el tipo MIME de texto/calendario,

NSString * UTI = (NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType,
                                                                   (CFStringRef)@"text/calendar", 
                                                                   NULL);

CFURLRef ur =UTTypeCopyDeclaringBundleURL(UTI);

Veo "com.apple.ical.ics" como la ITU y ".../MobileCoreTypes.bundle/" como la URL del paquete. No nuestra aplicación, sino Apple. Así que intento poner com.apple.ical.ics en LSItemContentTypes junto con el mío y en UTConformsTo en la exportación, pero no lo hago.

Básicamente, si Apple cree que quiere en algún momento manejar algún tipo de archivo (que podría crearse 10 años después de que su aplicación esté activa), tendrá que cambiar la extensión porque simplemente no le dejarán manejar. el tipo de archivo.

Kalle avatar May 24 '2013 17:05 Kalle