El problema: las carpetas .itmsp se muestran como archivos
El Finder trata las carpetas .itmsp como paquetes Es decir, como si se tratara de un único archivo. Por ejemplo, en la vista de columna, todo lo que contiene la carpeta .itmsp es invisible, sólo se muestra el icono del documento:
El Finder considera que un directorio es un paquete si alguna de las siguientes condiciones es verdadera (desde el 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
. Este es un plist binario, ábrelo con Xcode: open -a Xcode Info.plist
).
-
El directorio tiene una extensión que alguna otra aplicación afirma que representa un tipo de paquete (busque com.apple.package
en la salida de mdls -name kMDItemContentTypeTree <foldername>
para averiguarlo).
-
El directorio tiene su bit de paquete activado (si GetFileInfo -ab <foldername>
devuelve 1
).
El caso 2. se aplica a las carpetas .itmsp: Application Loader.app
tipo de exportaciones com.apple.itunes-producer.itmsp
y lo ajusta 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 extensión itmsp
como carpeta y forzar a los Servicios de Lanzamiento a utilizar la declaración de tipo modificada.
Nota importante:
Aunque resuelve de forma fiable el problema del OP, la solución propuesta, cuando se aplica a otros paquetes, no los muestra como carpetas.
He descubierto que la solución propuesta parece funcionar sólo con los tipos de archivo declarados por las aplicaciones situadas en una ruta de aplicación no estándar.
Este es el caso de Application Loader.app
que se encuentra en /Applications/Xcode.app/Contents/Applications/
.
Si estás interesado en una solución parcial consulta el final de esta respuesta.
Para que las carpetas .itmsp sean mostradas como carpetas por el Finder siga los siguientes pasos:
-
Abra Automator en la carpeta de aplicaciones y seleccione Aplicación :
-
Seleccione Utilidades en la lista de la Biblioteca, seleccione Ejecutar Shell script y arrástrelo al panel de la derecha:
-
Sustituye el contenido por defecto de script por exit 0
:
-
Guarde la aplicación como itmspOpener:
-
Cerrar Automator.
-
Seleccione itmspOpener.app
y mostrar su contenido:
-
Localiza Contenido>Info.plist y ábrelo con tu editor favorito:
-
Sustituya 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é kUTTypeDirectory
en lugar de public.directory
en UTExportedTypeDeclarations
? Desde Documentación de Apple : Importante: Cuando utilice UTIs definidos por el sistema en su código, debe utilizar las constantes definidas en UTCoreTypes.h
en el marco de los servicios de lanzamiento cuando están disponibles, en lugar de las cadenas UTI reales. Por ejemplo, pase kUTTypeApplication en lugar de "com.apple.application". En "System-Declared Uniform Type Identifiers" se enumeran estas constantes además de las cadenas UTI.
-
Asociar un archivo .itmsp a itmspOpener
y pulse el botón Change All... :
-
Restablecer la base de datos de los Servicios de Lanzamiento:
$ 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 liste 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 los Servicios de Lanzamiento fue restablecida, 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
-
Inicie Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Carpeta foo3.itmsp
debería seguir apareciendo como una carpeta.
-
Compruebe de nuevo las propiedades de la carpeta:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
no se añadió a los atributos de metadatos de la carpeta, por eso el Finder sigue mostrando las carpetas .itmsp como carpetas.
Solución automatizada: mostrar las carpetas .itmsp como carpetas tras el inicio de sesión
Para mostrar las carpetas .itmsp como carpetas después del inicio de sesión:
-
Crear itmspOpener.app
y modificar su Info.plist
como se ha descrito anteriormente.
-
Crear /usr/local/bin/itmspTypeLoader
con este contenido (la variable itmspOpener
señala el lugar donde itmspOpener.app
reside, cambiar si es 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
Ambos sleep 15
antes y después de correr lsregister
son de suma importancia. Si no ve el resultado deseado, pruebe con otros retrasos.
-
Crear /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 gancho de acceso :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
-
Reinicie para que los cambios surtan efecto. Después de iniciar la 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
--------------------------------------------------------
¿Ves el inactive
bandera establecida en la exportación de tipo de Application Loader.app? Derrotamos a Application Loader.
La prueba de fuego: las carpetas .itmsp siguen apareciendo como tales tras la actualización de iTunes
Recientemente he actualizado Xcode:
y puedo 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 al hacer doble clic
Como se ha comentado anteriormente, el procedimiento detallado anteriormente no funcionará con carpetas arbitrarias que el Finder muestra como paquetes.
Sin embargo, si sólo quiere 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 oculta y temporal dentro del paquete, la revela en el Finder (revelando así el paquete como una carpeta) y luego borra la carpeta temporal.
Nota:
El script podría en cambio crear un archivo oculto y temporal. Sin embargo, prefiero crear una carpeta porque rmdir
sólo borra vacío carpetas, mientras que rm
borra cualquier archivo, así que si, por alguna razón. el script hace estragos, sólo se borrarán las carpetas vacías, lo que probablemente no sea tan malo como si se borraran archivos.
-
Automator agrupa el script en una aplicación que se asociará a los archivos del paquete.
Estos son los pasos para crear una aplicación de este tipo. Utilizaré archivos .itmsp como ejemplo de tipo de paquete en la explicación que sigue:
-
Abra Automator en la carpeta de aplicaciones y seleccione Aplicación :
-
Seleccione Servicios públicos en la lista de la Biblioteca, seleccione Ejecutar Shell script y arrástrelo al panel de la derecha:
-
Establecer Pasar la entrada a como argumentos :
-
Sustituye el contenido por defecto de script por 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:
-
Cerrar Automator.
Ahora tienes una aplicación que puede abrir archivos .itmsp como carpetas si se asocian a ella.
Hay un problema cosmético: tal y 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:
-
Localiza Contenido>Info.plist y ábrelo con tu editor favorito:
-
Sustituir el valor de esta clave en el CFBundleDocumentTypes
matriz:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
y añadir esta clave:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Ahora, la sección tiene este aspecto:
-
Cambie al Finder, seleccione una carpeta, pulse ⌘I seleccione el icono de la carpeta en la esquina superior izquierda y cópielo con ⌘C :
-
Abra la vista previa y seleccione Archivo>Nuevo desde el portapapeles. Guarde el archivo como folder.icns
:
-
Copiar folder.icns
a itmspOpener/Contents/Resources
:
-
Asociar un archivo .itmsp a itmspOpener
y pulse el botón Change All... :
El icono de los archivos .itmsp debería cambiar a una carpeta, o al menos eso creía yo: por desgracia, no era así. Así que moví la aplicación itmspOpener a otra ubicación (creé una carpeta temporal en mi Escritorio, la moví allí y de nuevo a mi Escritorio). Eso refrescó la información del icono en el Finder:
Ahora haz doble clic en un archivo .itmsp y verás cómo se abre como una carpeta: