9 votos

¿Qué hace que un "paquete" de macOS se muestre como tal?

Un paquete es sólo un directorio, aparentemente, pero de alguna manera Finder y Path Finder saben que es un paquete.

¿Cómo se indica esto en el sistema de archivos? He intentado algunos cambios en un directorio para convertirlo en un paquete, pero ha sido en vano.

0 votos

Llámalo algo.app o algo.fototeca etc. Hay muchas versiones

0 votos

@Tetsujin tienes razón que está en el nombre del archivo. que yo no lo sabía. Pero aún así la aplicación DayOne ha conseguido registrar .dayone como tipo de paquete. Entonces... ¿cómo se puede hacer eso para los nuevos pathnames? Gracias.

1 votos

Lo siento, me temo que para eso hace falta alguien más listo que yo ;)

13voto

Monomeeth Puntos 139

Respuesta corta

Para registrar un documento como paquete, el desarrollador de DayOne habría tenido que modificar la información sobre el tipo de documento en el archivo de la lista de propiedades de información (Info.plist) de la aplicación DayOne.

Respuesta larga

A paquete es un directorio del sistema de archivos utilizado por MacOS e iOS. Es básicamente un directorio que aparece como un único archivo, pero que en realidad puede contener un estado conservado de archivos y carpetas. Así, una carpeta podría tener varias subcarpetas y muchos archivos, pero como paquete se mostrará a los usuarios como un único archivo. Por ejemplo, en MacOS el Finder verá un paquete como un único archivo para evitar que los usuarios se metan con el contenido real. Sin embargo, los usuarios pueden ver el contenido a través de varios métodos, como haciendo clic con el botón derecho en el paquete y seleccionando Mostrar contenido del paquete en el menú contextual.

Apple Guía de programación de paquetes disponible en su sitio para desarrolladores, tiene toda una sección sobre paquetes de documentos. A continuación figuran algunas citas pertinentes:

Para registrar un documento como paquete, debe en la lista de propiedades de información de su aplicación ( Info.plist ). La dirección CFBundleDocumentTypes la clave almacena información sobre los tipos de documentos que admite su aplicación. Para cada documento incluya la clave LSTypeIsPackage con una tecla apropiado. La presencia de esta clave indica a los servicios Finder y Launch que traten los directorios con la extensión de archivo dada como un paquete. Para más información sobre Info.plist teclas, véase Información Lista de propiedades Clave de referencia .

Los paquetes de documentos deben tener siempre una extensión para identificar aunque el usuario pueda ocultar dicha extensión. La extensión extensión permite al Finder identificar su directorio de documentos y tratarlo como un paquete. Nunca debe asociar un paquete de documentos con un tipo MIME o un tipo OS de 4 bytes.

Fuente: Guía de programación de paquetes

Si no puedes acceder al documento, házmelo saber e incluiré algunas citas adicionales de la página.

0 votos

¿Codificas aplicaciones para Mac?

0 votos

No, todavía no. En realidad, yo soy trabajando lentamente en uno, pero sería el primero. Hasta ahora sólo he desarrollado aplicaciones para iOS o he realizado otras tareas de programación de bajo nivel (por ejemplo, AppleScript, VBA, HTML, etc.).

1 votos

Escribo aplicaciones Mac/iOS/tvOS desde 1991... aún así, aunque tu texto es correcto --- no responde a la pregunta: "Qué archivos de mi Mac se presentarán como paquetes". Sigo buscando la respuesta. Conozco APIs que me lo dirán para un archivo específico, pero ¿dónde está la lista de extensiones de nombre de archivo en mi Mac que están registradas como paquetes?

6voto

Motti Shneor Puntos 130

Tenía la misma pregunta y todas las respuestas me han parecido poco satisfactorias. Esta es mi opinión (después de 2 semanas de investigación).

Lo más importante es entenderlo: macOS (también iOS, iPadOS tvOS, watchOS) mantiene unas base de datos dinámica de inscritos Identificadores universales de tipo . No puedo extenderme mucho - es un tema muy amplio - pero diré que un UTI formal puede emparejarse con varias "etiquetas" (identificadores de otros "espacios", como por ejemplo --- una Extensión de nombre de archivo.

Cada vez que una nueva aplicación llega al sistema de archivos del Mac, el sistema operativo consulta su Info.plist y añade a su base de datos las nuevas definiciones de tipo que encuentra.

El Framework de MacOS responsable de la comunicación con esta base de datos se llama LaunchServices y ahora he visto que muchas de sus API están obsoletas y van a ser sustituidas por el nuevo UniformTypeIdentifiers sólo disponible en MacOS Big Sur (11.x) y versiones posteriores.

Estos marcos son utilizados por Finder, y todas las demás instalaciones, para determinar qué tipo de datos utilizar para Archivo específico, Directorio, Paquete, datos-en-memoria, objeto Pegar-tablero, etc.

Algunos objetos Cocoa de nivel superior ( NSURL , NSFileManager , NSWorkspace y otros) también envuelven estos frameworks, para proporcionar funcionalidades relacionadas con el tipo (por ejemplo, para darte las URLs de las aplicaciones que pueden abrir un tipo de datos específico, o para saber si un archivo/directorio es realmente el paquete de un documento, o para tener una conjetura educada sobre un archivo para el que NO tienes una aplicación en tu Mac).

Para responder directamente a la pregunta del OP - NO fui capaz (ni siquiera mirando a nivel del kernel) de encontrar un "bit de paquete" o "bit de paquete" que se pueda asignar a un directorio - pero INCLUSO SI EXISTIERA, NO determinaría el comportamiento del SO hacia algún directorio. Siempre es LaunchServices el que es consultado al respecto.

Otra distinción importante es entre un Paquete y un Paquete . Un "paquete" es un objeto del sistema de archivos (archivo, directorio, alias, lo que sea) que debe presentarse y manipularse COMO SI fuera un único objeto (archivo de documento). Si hay algo que depende del misterioso "bit de paquete" es el aspecto de "paquete" de un directorio/archivo/lo que sea.

A " Paquete "por otro lado, es una ESTRUCTURA FORMAL de un directorio, que incluye un Info.plist con las entradas necesarias, y otros elementos (como aplicaciones, extensiones del núcleo, plugins, etc.) que puede ser un paquete (como .app) o no (como .framework).

No sé si la pregunta de la OP proviene de sus necesidades de desarrollo, pero voy a proporcionar aquí algunas API relacionadas que pueden ser útiles.

BOOL isPackage = [[NSWorkspace sharedWorkspace] isFilePackageAtPath:_filePath ]; // will only help with EXISTING path. DO READ the documentation in the header for this method.

NSURL *fileURL = [NSURL fileURLWithPath:_documentPath isDirectory:YES];
NSError *error = nil;
NSNumber *value = nil;
isPackage = ([fileURL getResourceValue:&value forKey:NSURLIsPackageKey error:&error] && [value boolValue]); // a more powerful alternative - read header for more "resource keys" you can use in this method - e.g. for determining content-type and not only the package. Again, this is meant to be used for existing files/directories.

 // this one is lower-level Core-Foundation tool that will work for non-existing objects - a "what if" question to LaunchServices.  
 CFArrayRef types = UTTypeCreateAllIdentifiersForTag( kUTTagClassFilenameExtension, (__bridge CFStringRef _Nonnull)(_filenameExtension), kUTTypePackage);
 CFIndex typeCount = CFArrayGetCount(types);
 switch (typeCount) {
     case 0: _isDocument = NO; break; // no package UTI with this filename extension is known to LaunchServices.
     case 1: {
          CFStringRef type = CFArrayGetValueAtIndex(types, 0); 
          isPackage = ! CFStringHasPrefix(type, CFSTR("dyn.")); // LaunchServices may synthesize a dynamic UTI when it doesn't know a filename extension.
          break;
     }
     default: isPackage = YES; break;
 }
 CFRelease(types);

4voto

paper1111 Puntos 110

Como he hecho una aplicación basada en documentos para MacOS, puede que te ayude a entender un poco. Aunque la respuesta de @Monomeeth es correcta, tratar con GUI es mucho mejor que Info.plist . La gente suele utilizar otro camino. En subclase NSDocment que proporciona la base para guardar y cargar archivos/paquetes. Entonces, la gente va a Xcode y en la pestaña "General", define un tipo de documento, luego va a "Exported UTIs" y exporta un UTI que se ajusta a com.apple.package . Se leen con el NSFileWrapper clase. De esta manera, la gente no tendrá que hacer un trabajo tedioso con cosas como NSData .

Si desea crear un paquete, marque esta respuesta . Basta con crear una aplicación MacOS vacía y editar las secciones "Exported UTIs" al gusto.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X