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.package
dans 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.app
exporte le type com.apple.itunes-producer.itmsp
et 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.itmsp
et l'extension en itmsp
tant 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.app
et 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 kUTTypeDirectory
au lieu de public.directory
dedans 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 à itmspOpener
et 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.app
pour 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.itmsp
doit 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.app
et modifiez son Info.plist
comme décrit ci-dessus.
Créez /usr/local/bin/itmspTypeLoader
avec ce contenu (la variable itmspOpener
pointe vers l'emplacement où itmspOpener.app
ré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 15
avant et après l' exécution lsregister
sont d' une importance capitale. Si vous ne voyez pas le résultat souhaité, essayez différents délais.
Créez /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éfinissez les deux scripts exécutables:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Définir /usr/local/bin/itmspTypeLoaderLauncher
comme 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 -dump
devrait révéler que itmspOpener.app
« UTExportedTypeDeclarations
a 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' inactive
indicateur 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 bash
script 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 rmdir
ne supprime que les dossiers vides , tout en rm
supprimant 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 CFBundleDocumentTypes
tableau:
<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 à itmspOpener
et 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: