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);
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 ;)
0 votos
Gracias... bueno si quieres añadir una respuesta a esta pregunta aunque sea con lo que has dado hasta ahora, sería genial. Gracias.
0 votos
Yo esperaría a una de las galletas más inteligentes, seguro que aparece alguna en breve :)
0 votos
Usted dijo: " He intentado algunos cambios en un directorio para convertirlo en un paquete, pero ha sido en vano. "¿Qué has probado? Además, echa un vistazo a, Paquete (MacOS) y Paquete (MacOS) .
0 votos
@user3439894 parece que depende del nombre, sobre todo tecleando la extensión del archivo, como apuntan otros comentaristas.
0 votos
@Tetsujin Jaja, acabo de ver tu comentario. Te he ofrecido una respuesta, ¡pero en ningún caso pretendo ser más listo que tú! :)
0 votos
@Monomeeth - A caballo regalado... Estoy gran en las preguntas muy, muy fáciles :P