Le problème : les dossiers .itmsp sont affichés comme des fichiers.
Le Finder traite les dossiers .itmsp comme des dossiers paquets c'est-à-dire comme s'il s'agissait d'un seul fichier. Par exemple, dans la vue en colonnes, tout ce qui est contenu dans le dossier .itmsp est invisible, seule l'icône du document est affichée :
Le Finder considère qu'un répertoire est un paquet si l'une des conditions suivantes est vraie (d'après l'onglet Guide de programmation de l'offre groupée ):
-
Le répertoire a une extension de nom de fichier connue : .app, .bundle, .framework, .plugin, .kext, etc. /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. C'est un plist binaire, ouvrez-le avec Xcode : open -a Xcode Info.plist
).
-
Le répertoire a une extension qui, selon une autre application, représente un type de paquet (recherchez com.apple.package
dans la sortie de mdls -name kMDItemContentTypeTree <foldername>
pour le savoir).
-
Le répertoire a son bit de paquetage activé (si GetFileInfo -ab <foldername>
renvoie à 1
il est fixé).
Le cas 2. s'applique aux dossiers .itmsp : Application Loader.app
type d'exportation com.apple.itunes-producer.itmsp
et le met en conformité avec 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 : redéclarer le type com.apple.itunes-producer.itmsp
Une solution serait de redéclarer le type com.apple.itunes-producer.itmsp
et extension itmsp
en tant que dossier et forcer les services de lancement à utiliser la déclaration de type modifiée.
Remarque importante :
Bien qu'elle résolve de manière fiable le problème du PO, la solution proposée, lorsqu'elle est appliquée à d'autres paquets, 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 est situé à /Applications/Xcode.app/Contents/Applications/
.
Si vous êtes intéressé par une solution partielle, consultez la fin de cette réponse.
Pour que les dossiers .itmsp soient affichés comme des dossiers par le Finder, suivez les étapes suivantes :
-
Ouvrez Automator dans le dossier Applications et sélectionnez Application :
-
Sélectionnez Utilitaires dans la liste de la bibliothèque, sélectionnez Exécuter le Shell script et faites-le glisser vers le volet de droite :
-
Remplacer le contenu par défaut de script par exit 0
:
-
Enregistrez l'application sous le nom de itmspOpener :
-
Fermer Automator.
-
Sélectionnez itmspOpener.app
et montrer son contenu :
-
Localisez Contents>Info.plist et ouvrez-le avec votre éditeur préféré :
-
Remplacer 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>
Note : Pourquoi kUTTypeDirectory
au lieu de public.directory
sur UTExportedTypeDeclarations
? De La documentation d'Apple : Important : Lorsque vous utilisez des UTIs définies par le système dans votre code, vous devez utiliser les constantes définies dans la section UTCoreTypes.h
dans le cadre des services de lancement lorsqu'ils 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" liste ces constantes en plus des chaînes UTI.
-
Associer un fichier .itmsp à itmspOpener
et appuyez sur le bouton Change All... :
-
Réinitialisez la base de données des services de lancement :
$ lsregister -kill -r -domain local -domain system -domain user
(sur OS X 10.8 lsregister
est situé à /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
-
Créer un dossier .itmsp et énumérer ses propriétés :
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
La base de données des services de lancement ayant été réinitialisée, le Finder affiche désormais les dossiers .itmsp comme des dossiers.
-
Abrir itmspOpener.app
pour charger son fichier plist et enregistrer com.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
-
Début Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Dossier foo3.itmsp
devrait toujours être affiché comme un 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 comme des 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éer itmspOpener.app
et modifier son Info.plist
comme décrit ci-dessus.
-
Créer /usr/local/bin/itmspTypeLoader
avec ce contenu (la variable itmspOpener
indique l'endroit où itmspOpener.app
réside, modifier 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 sites sleep 15
avant et après la course lsregister
sont de la plus haute importance. Si vous ne voyez pas le résultat souhaité, essayez d'autres délais.
-
Créer /usr/local/bin/itmspTypeLoaderLauncher
avec ce contenu :
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
-
Définir les deux scripts exécutables :
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
-
Définir /usr/local/bin/itmspTypeLoaderLauncher
comme crochet de connexion :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
-
Redémarrez pour que les changements prennent effet. Après vous être connecté, vous devriez voir ceci :
et lsregister -dump
devrait révéler que itmspOpener.app
's UTExportedTypeDeclarations
a la priorité sur 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
--------------------------------------------------------
Voyez-vous le inactive
dans l'exportation de type d'Application Loader.app ? Nous avons battu Application Loader.
L'épreuve de vérité : les dossiers .itmsp s'affichent toujours comme tels après la mise à jour d'iTunes.
J'ai récemment mis à jour Xcode :
et je peux confirmer que les dossiers .itmsp ont été affichés comme des dossiers pendant la mise à jour :
et après :
Une solution partielle : Le paquet montrera le contenu lorsqu'on double-clique dessus
Comme indiqué précédemment, la procédure détaillée ci-dessus ne fonctionnera pas avec les dossiers arbitraires qui sont affichés comme des paquets par le Finder.
Toutefois, si vous souhaitez simplement pouvoir double-cliquer sur un paquet pour l'ouvrir, il existe un moyen de le faire avec un seul et même outil bash
script et Automator :
-
Le script crée un dossier temporaire caché à l'intérieur du paquet, le révèle dans le Finder (révélant ainsi le paquet comme un dossier) et supprime ensuite le dossier temporaire.
Note :
Le script pourrait au contraire créer un fichier caché et temporaire. Cependant, je préfère créer un dossier car rmdir
seulement supprime vide tandis que rm
supprime tout donc si, pour une raison quelconque raison, le script fait des ravages, seuls les dossiers vides seront supprimés, ce qui n'est probablement pas aussi grave que si les fichiers étaient supprimés.
-
Automator regroupe le script dans une application qui sera associée aux fichiers du paquet.
Voici les étapes à suivre pour créer une telle application. Je vais utiliser les fichiers .itmsp comme exemple de type de paquet dans l'explication ci-dessous :
-
Ouvrez Automator dans le dossier Applications et sélectionnez Application :
-
Sélectionnez Utilitaires dans la liste des bibliothèques, sélectionnez Exécuter le Shell script et faites-le glisser vers le volet de droite :
-
Définir Passer l'entrée a comme arguments :
-
Remplacez le contenu par défaut de script 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 le nom de itmspOpener :
-
Fermer Automator.
Vous avez maintenant une application qui peut ouvrir les fichiers .itmsp comme des dossiers s'ils lui sont associés.
Il y a un problème d'ordre cosmétique : dans l'état actuel des choses, les fichiers associés auront l'icône blanche standard du document :
Réparons 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é :
-
Remplacer la valeur de cette clé dans le CFBundleDocumentTypes
le tableau :
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
et ajoutez cette clé :
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Maintenant, la section ressemble à ceci :
-
Passez au Finder, sélectionnez un dossier, appuyez sur I sélectionnez l'icône du dossier dans le coin supérieur gauche et copiez-la avec le bouton de la souris. C :
-
Ouvrez l'aperçu et sélectionnez Fichier>Nouveau à partir du presse-papiers. Enregistrez le fichier en tant que folder.icns
:
-
Copie folder.icns
a itmspOpener/Contents/Resources
:
-
Associer un fichier .itmsp à itmspOpener
et appuyez sur le bouton Change All... :
L'icône des fichiers .itmsp devrait se transformer en 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à et de nouveau sur mon Bureau). Cela a rafraîchi les informations sur l'icône dans le Finder :
Maintenant, double-cliquez sur un fichier .itmsp et regardez-le s'ouvrir comme un dossier :