Le problème: les dossiers .itmsp sont affichés sous forme de fichiers
Le Finder traite les dossiers .itmsp comme des packages , c'est-à-dire comme s'il s'agissait d'un seul fichier. Par exemple, en mode colonne, tout ce qui est contenu dans le dossier .itmsp est invisible, seule l'icône du document est affichée:

Le Finder considère un répertoire comme un package si l'une des conditions suivantes est remplie (du Bundle Programming Guide ):
Le répertoire a une extension de nom de fichier connue: .app, .bundle, .framework, .plugin, .kext, etc. (comme défini dans /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist. Il s'agit d'une liste binaire, ouvrez-la avec Xcode:) open -a Xcode Info.plist.
Le répertoire a une extension que certaines autres revendications d'application représentent un type de package (recherchez com.apple.packagedans la sortie de mdls -name kMDItemContentTypeTree <foldername>pour le savoir.)
Le répertoire a son bit de package défini (s'il GetFileInfo -ab <foldername>retourne 1, il est défini.)
Le cas 2. s'applique aux dossiers .itmsp: Application Loader.appexporte le type com.apple.itunes-producer.itmspet le définit pour se conformer à 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>
Une solution: re-déclarer le type com.apple.itunes-producer.itmsp
Une solution consisterait à re-déclarer le type com.apple.itunes-producer.itmspet l'extension en itmsptant que dossier et à forcer Launch Services à utiliser la déclaration de type modifiée.
Note importante:
Bien qu'elle résout de manière fiable le problème de l'OP, la solution proposée, lorsqu'elle est appliquée à d'autres packages, ne les affiche pas sous forme de dossiers.
J'ai découvert que la solution proposée semble fonctionner uniquement avec les types de fichiers déclarés par les applications situées dans un chemin d'application non standard.
C'est le cas de Application Loader.app, qui se trouve à /Applications/Xcode.app/Contents/Applications/.
Si vous êtes intéressé par une solution partielle, vérifiez la fin de cette réponse.
Pour que les dossiers .itmsp soient affichés en tant que dossiers par le Finder, procédez comme suit:
Ouvrez Automator dans le dossier Applications et sélectionnez Application :

Sélectionnez Utilitaires dans la liste Bibliothèque, sélectionnez Exécuter le script Shell et faites-le glisser vers le volet de droite:

Remplacez le contenu du script par défaut par exit 0:

Enregistrez l'application sous itmspOpener:

Fermez Automator.
Sélectionnez itmspOpener.appet affichez son contenu:

Localisez Contents> Info.plist et ouvrez-le avec votre éditeur préféré:

Remplacez ces sections dans 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>
Remarque:
pourquoi kUTTypeDirectoryau lieu de public.directorydedans UTExportedTypeDeclarations? Dans la documentation d'Apple : Important: lorsque vous utilisez des UTI définies par le système dans votre code, vous devez utiliser les constantes définies dansUTCoreTypes.h dans le framework Launch Services lorsqu'elles sont disponibles, plutôt que les chaînes UTI réelles. Par exemple, passez kUTTypeApplication plutôt que «com.apple.application». «System-Declared Uniform Type Identifiers» répertorie ces constantes en plus des chaînes UTI.
Associez un fichier .itmsp à itmspOpeneret appuyez sur le bouton Change All...:

Réinitialisez la base de données Launch Services:
$ lsregister -kill -r -domain local -domain system -domain user
(sous OS X 10.8 lsregister se trouve dans /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/.)
Créez un dossier .itmsp et répertoriez ses propriétés:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Étant donné que la base de données Launch Services a été réinitialisée, le Finder affiche désormais les dossiers .itmsp en tant que dossiers.
Ouvrez itmspOpener.apppour charger son fichier plist et vous inscrire com.apple.itunes-producer.itmsp:
$ open ~/Desktop/itmspOpener.app
Début Application Loader.app:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Le dossier foo3.itmspdoit toujours être affiché en tant que dossier.
Vérifiez à nouveau les propriétés du dossier:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package n'a pas été ajouté aux attributs de métadonnées du dossier, c'est pourquoi le Finder affiche toujours les dossiers .itmsp en tant que dossiers!
Solution automatisée: affichage des dossiers .itmsp en tant que dossiers après la connexion
Pour afficher les dossiers .itmsp en tant que dossiers après la connexion:
Créez itmspOpener.appet modifiez son Info.plistcomme décrit ci-dessus.
Créez /usr/local/bin/itmspTypeLoaderavec ce contenu (la variable itmspOpenerpointe vers l'emplacement où itmspOpener.appréside, modifiez si nécessaire):
#!/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
Les deux sleep 15avant et après l' exécution lsregistersont d' une importance capitale. Si vous ne voyez pas le résultat souhaité, essayez différents délais.
Créez /usr/local/bin/itmspTypeLoaderLauncheravec ce contenu:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Définissez les deux scripts exécutables:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Définir /usr/local/bin/itmspTypeLoaderLaunchercomme hook de connexion :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Redémarrez pour que les modifications prennent effet. Une fois connecté, vous devriez voir ceci:

et lsregister -dumpdevrait révéler que itmspOpener.app« UTExportedTypeDeclarationsa priorité sur Application Loader.app»:
$ 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
--------------------------------------------------------
Voyez-vous l' inactiveindicateur défini dans l'exportation de type d'Application Loader.app? Nous avons vaincu Application Loader.
Le test acide: les dossiers .itmsp s'affichent toujours comme tels après la mise à jour d'iTunes
J'ai récemment mis à jour Xcode:

et peut confirmer que les dossiers .itmsp ont été affichés en tant que dossiers lors de la mise à jour:

et après:

Une solution partielle: le package affichera le contenu lors d'un double clic
Comme indiqué précédemment, la procédure détaillée ci-dessus ne fonctionnera pas avec les dossiers arbitraires affichés sous forme de packages par le Finder.
Cependant, si vous souhaitez simplement pouvoir double-cliquer sur un package pour l'ouvrir, il existe un moyen de le faire avec un bashscript et Automator:
Le script crée un dossier temporaire masqué à l'intérieur du package, le révèle dans le Finder (révélant ainsi le package en tant que dossier), puis supprime le dossier temporaire.
Remarque:
Le script pourrait plutôt créer un fichier temporaire masqué. Cependant, je préfère créer un dossier car rmdirne supprime que les dossiers vides , tout en rmsupprimant tout fichier, donc si, pour une raison quelconque. le script fait des ravages, seuls les dossiers vides seront supprimés, ce qui n'est probablement pas aussi mauvais que si les fichiers étaient supprimés.
Automator regroupe le script dans une application qui sera associée aux fichiers de package.
Ce sont les étapes pour créer une telle application. Je vais utiliser les fichiers .itmsp comme exemple de type de package dans l'explication ci-dessous:
Ouvrez Automator dans le dossier Applications et sélectionnez Application :

Sélectionnez Utilitaires dans la liste Bibliothèque, sélectionnez Exécuter le script Shell et faites-le glisser vers le volet de droite:

Set entrée passe à comme arguments :

Remplacez le contenu du script par défaut par ceci:
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
Enregistrez l'application sous itmspOpener:

Fermez Automator.
Vous disposez maintenant d'une application qui peut ouvrir des fichiers .itmsp en tant que dossiers si elle y est associée.
Il y a un problème cosmétique: en l'état, les fichiers associés auront l'icône de document blanc standard:

Corrigeons cela aussi:
Assurez-vous que Automator est fermé.
Sélectionnez itmspOpener et affichez son contenu:

Localisez Contents> Info.plist et ouvrez-le avec votre éditeur préféré:

Remplacez la valeur de cette clé dans le CFBundleDocumentTypestableau:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
et ajoutez cette clé:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Maintenant, la section ressemble à ceci:

Basculez vers le Finder, sélectionnez un dossier, appuyez sur ⌘I, sélectionnez l'icône de dossier dans le coin supérieur gauche et copiez-la avec ⌘C:

Ouvrez Aperçu et sélectionnez Fichier> Nouveau dans le presse-papiers. Enregistrez le fichier sous folder.icns:

Copier folder.icnsà itmspOpener/Contents/Resources:

Associez un fichier .itmsp à itmspOpeneret appuyez sur le bouton Change All...:

L'icône des fichiers .itmsp devrait changer dans un dossier, ou du moins je le pensais: malheureusement, ce n'était pas le cas. J'ai donc déplacé l'application itmspOpener vers un autre emplacement (j'ai créé un dossier temporaire sur mon bureau, je l'ai déplacé là-bas et de nouveau sur mon bureau). Cela a actualisé les informations d'icône dans le Finder:

Maintenant, double-cliquez sur un fichier .itmsp et regardez-le s'ouvrir en tant que dossier:
