El problema: las carpetas .itmsp se muestran como archivos
El Finder trata las carpetas .itmsp como paquetes , es decir, como si fueran un solo archivo. Por ejemplo, en la vista de columna, todo lo contenido en la carpeta .itmsp es invisible, solo se muestra el icono del documento:
El Finder considera que un directorio es un paquete si se cumple alguna de las siguientes condiciones (de la Guía de programación de paquetes ):
El directorio tiene una extensión de nombre de archivo conocida: .app, .bundle, .framework, .plugin, .kext, etc. (como se define en /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Esta es una lista binaria, ábrala con Xcode:) open -a Xcode Info.plist
.
El directorio tiene una extensión que algunas otras reclamaciones de aplicaciones representan un tipo de paquete (busque com.apple.package
en la salida mdls -name kMDItemContentTypeTree <foldername>
para averiguarlo).
El directorio tiene su bit de paquete establecido (si GetFileInfo -ab <foldername>
devuelve 1
, está establecido).
El caso 2. se aplica a las carpetas .itmsp: Application Loader.app
exporta el tipo com.apple.itunes-producer.itmsp
y lo configura para que se ajuste a com.apple.package
:
$ mkdir foo.itmsp
$ mdls -name kMDItemContentTypeTree foo.itmsp/
kMDItemContentTypeTree = (
"com.apple.itunes-producer.itmsp",
"com.apple.package",
(...)
)
$ grep -B 5 -A 8 com.apple.package /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Info.plist
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>com.apple.package</string>
<string>public.composite-content</string>
</array>
<key>UTTypeDescription</key>
<string>iTunes Package</string>
<key>UTTypeIconFile</key>
<string>ITMSP.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
Una solución: volver a declarar el tipo com.apple.itunes-producer.itmsp
Una solución sería volver a declarar el tipo com.apple.itunes-producer.itmsp
y la extensión itmsp
como una carpeta y forzar a Launch Services a usar la declaración de tipo modificada.
Nota IMPORTANTE:
Aunque resuelve de manera confiable el problema del OP, la solución propuesta, cuando se aplica a otros paquetes, no los muestra como carpetas.
Descubrí que la solución propuesta parece funcionar solo con los tipos de archivos declarados por las aplicaciones ubicadas en una ruta de aplicación no estándar.
Este es el caso con Application Loader.app
, que se encuentra en /Applications/Xcode.app/Contents/Applications/
.
Si está interesado en una solución parcial, marque el final de esta respuesta.
Para que el Finder muestre las carpetas .itmsp como carpetas, siga los siguientes pasos:
Abra Automator en la carpeta Aplicaciones y seleccione Aplicación :
Seleccione Utilidades en la lista Biblioteca, seleccione Ejecutar script de shell y arrástrelo al panel de la derecha:
Reemplace el contenido del script predeterminado con exit 0
:
Guarde la aplicación como itmspOpener:
Cierra Automator.
Seleccione itmspOpener.app
y muestre sus contenidos:
Localice Contenido> Info.plist y ábralo con su editor favorito:
Reemplace estas secciones en Info.plist
:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>itmsp</string>
</array>
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleTypeIconFile</key>
<string>folder</string>
<key>LSTypeIsPackage</key>
<false/>
<key>LSHandlerRank</key>
<string>Owner</string>
</dict>
</array>
(...)
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>kUTTypeDirectory</string>
</array>
<key>UTTypeDescription</key>
<string>itmsp folder</string>
<key>UTTypeIconFile</key>
<string>folder.icns</string>
<key>UTTypeIdentifier</key>
<string>com.apple.itunes-producer.itmsp</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>itmsp</string>
</dict>
</dict>
</array>
Nota:
¿Por qué en kUTTypeDirectory
lugar de public.directory
adentro UTExportedTypeDeclarations
? De la documentación de Apple : Importante: cuando use UTI definidas por el sistema en su código, debe usar las constantes definidas UTCoreTypes.h
en el marco de Launch Services cuando estén disponibles, en lugar de las cadenas de UTI reales. Por ejemplo, pase kUTTypeApplication en lugar de "com.apple.application". Los "Identificadores de tipo uniforme declarados por el sistema" enumeran estas constantes además de las cadenas UTI.
Asocia un archivo .itmsp itmspOpener
y presiona el botón Change All...:
Restablezca la base de datos de Launch Services:
$ lsregister -kill -r -domain local -domain system -domain user
(en OS X 10.8 lsregister
se encuentra en /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
).
Cree una carpeta .itmsp y enumere sus propiedades:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Debido a que la base de datos de Launch Services se restableció, ahora el Finder muestra las carpetas .itmsp como carpetas.
Abrir itmspOpener.app
para cargar su archivo plist y registrar com.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
Inicio Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
La carpeta foo3.itmsp
aún debe mostrarse como una carpeta.
Verifique nuevamente las propiedades de la carpeta:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
no se agregó a los atributos de metadatos de la carpeta, por eso el Finder todavía muestra las carpetas .itmsp como carpetas.
Solución automatizada: mostrar carpetas .itmsp como carpetas después de iniciar sesión
Para mostrar las carpetas .itmsp como carpetas después de iniciar sesión:
Crear itmspOpener.app
y modificar su Info.plist
como se describe anteriormente.
Cree /usr/local/bin/itmspTypeLoader
con este contenido (la variable itmspOpener
apunta a la ubicación donde itmspOpener.app
reside, cambie según sea necesario):
#!/bin/bash
itmspOpener="/Users/jaume/Applications/itmspOpener.app/"
echo "$(date): Starting" > /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Deleting Launch Services database" >> /tmp/itmspTypeLoader.log
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user >> /tmp/itmspTypeLoader.log
sleep 15
echo "$(date): Starting $itmspOpener" >> /tmp/itmspTypeLoader.log
open $itmspOpener >> /tmp/itmspTypeLoader.log
sleep 1
echo "$(date): Starting Application Loader.app" >> /tmp/itmspTypeLoader.log
open "/Applications/Xcode.app/Contents/Applications/Application Loader.app/"
# Wait until process "Application Loader.app" exists
while [ $(ps -ef|grep -v grep|grep -c "Application Loader") -ne 1 ]; do
sleep 1
echo "$(date): Waiting" >> /tmp/itmspTypeLoader.log
done
# Send TERM signal
kill -TERM $(ps -ef|grep "Application Loader"|grep -v grep|awk "{print \$2}")
if [ $? -eq 0 ]; then
echo "$(date): Application Loader killed" >> /tmp/itmspTypeLoader.log
else
echo "$(date): Application Loader could not be killed" >> /tmp/itmspTypeLoader.log
fi
echo "$(date): Exiting" >> /tmp/itmspTypeLoader.log
Tanto sleep 15
antes como después de correr lsregister
son de suma importancia. Si no ve el resultado deseado, pruebe diferentes demoras.
Crea /usr/local/bin/itmspTypeLoaderLauncher
con este contenido:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Establecer ambos scripts ejecutables:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Establecer /usr/local/bin/itmspTypeLoaderLauncher
como enlace de inicio de sesión :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Reinicie para que los cambios surtan efecto. Después de iniciar sesión, debería ver esto:
y lsregister -dump
debe revelar que itmspOpener.app
's UTExportedTypeDeclarations
tiene prioridad sobre Application Loader.app
' s:
$ lsregister -dump | less
bundle id: 24748
path: /Users/jaume/Desktop/itmspOpener.app/
name: itmspOpener
(...)
flags: apple-internal relative-icon-path ui-element has-min-sys-version-by-arch hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app scriptable services x86_64
(...)
--------------------------------------------------------
type id: 33796
uti: com.apple.itunes-producer.itmsp
description: itmsp folder
flags: exported active apple-internal trusted
icon: Contents/Resources/folder.icns
conforms to: kuttypedirectory
tags: .itmsp
--------------------------------------------------------
(...)
bundle id: 24600
path: /Applications/Xcode.app/Contents/Applications/Application Loader.app/
name: Application Loader
(...)
flags: apple-internal relative-icon-path hi-res-capable user-can-change-hi-res-mode
item flags: container package application extension-hidden native-app i386 x86_64
(...)
--------------------------------------------------------
type id: 33832
uti: com.apple.itunes-producer.itmsp
description: iTunes Package
flags: exported inactive apple-internal trusted
icon: Contents/Resources/ITMSP.icns
conforms to: com.apple.package, public.composite-content
tags: .itmsp
--------------------------------------------------------
¿Ve la inactive
bandera establecida en el tipo de exportación de Application Loader.app? Derrotamos a Application Loader.
La prueba de fuego: las carpetas .itmsp aún se muestran como tales después de la actualización de iTunes
Recientemente actualicé Xcode:
y puede confirmar que las carpetas .itmsp se mostraron como carpetas durante la actualización:
y después:
Una solución parcial: el paquete mostrará el contenido cuando se hace doble clic
Como se comentó anteriormente, el procedimiento detallado anteriormente no funcionará con carpetas arbitrarias que el Finder muestra como paquetes.
Sin embargo, si solo desea poder hacer doble clic en un paquete para abrirlo, hay una manera de hacerlo con un bash
script y Automator:
El script crea una carpeta temporal oculta dentro del paquete, la revela en el Finder (revelando así el paquete como una carpeta) y luego elimina la carpeta temporal.
Nota:
En su lugar, el script podría crear un archivo oculto y temporal. Sin embargo, prefiero crear una carpeta porque rmdir
solo elimina carpetas vacías , mientras que rm
elimina cualquier archivo, por lo que si, por alguna razón. el script causa estragos, solo se eliminarán las carpetas vacías, lo que probablemente no sea tan malo como si se eliminaran los archivos.
Automator agrupa el script en una aplicación que se asociará con los archivos del paquete.
Estos son los pasos para crear una aplicación de este tipo. Usaré archivos .itmsp como ejemplo de tipo de paquete en la explicación a continuación:
Abra Automator en la carpeta Aplicaciones y seleccione Aplicación :
Seleccione Utilidades en la lista Biblioteca, seleccione Ejecutar script de shell y arrástrelo al panel de la derecha:
Conjunto de entrada Paso a como argumentos :
Reemplace el contenido del script predeterminado con esto:
for f in "$@"; do
# If not dealing with a directory, exit
if [ ! -d "$f" ]; then exit; fi
# Create a temporary directory inside the itmsp "file"
tmpdir="$f/.itmspOpener$$"
if mkdir $tmpdir; then
# Reveal in Finder
open -R $tmpdir
# Delete temporary file
rmdir $tmpdir
fi
done
Guarde la aplicación como itmspOpener:
Cierra Automator.
Ahora tiene una aplicación que puede abrir archivos .itmsp como carpetas si está asociada a ella.
Hay un problema cosmético: tal como está, los archivos asociados tendrán el icono de documento blanco estándar:
Arreglemos esto también:
Asegúrese de que Automator esté cerrado.
Seleccione itmspOpener y muestre su contenido:
Localice Contenido> Info.plist y ábralo con su editor favorito:
Reemplace el valor de esta clave en la CFBundleDocumentTypes
matriz:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
y agregue esta clave:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Ahora, la sección se ve así:
Cambie al Finder, seleccione una carpeta, presione ⌘I, seleccione el icono de carpeta en la esquina superior izquierda y cópielo con ⌘C:
Abra Vista previa y seleccione Archivo> Nuevo desde el portapapeles. Guarde el archivo como folder.icns
:
Copiar folder.icns
a itmspOpener/Contents/Resources
:
Asocia un archivo .itmsp itmspOpener
y presiona el botón Change All...:
El ícono de los archivos .itmsp debería cambiar a una carpeta, o al menos eso pensé: desafortunadamente, este no fue el caso. Así que moví la aplicación itmspOpener a otra ubicación (creé una carpeta temporal en mi escritorio, la moví allí y de regreso a mi escritorio). Eso actualizó la información del icono en el Finder:
Ahora haga doble clic en un archivo .itmsp y vea cómo se abre como una carpeta: