12 votes

Revenir à l'Association de Type de Fichier

Je travaille occasionnellement avec des packages de l'iTunes Music Store. Ces packages ont une extension .itmsp. Comme .app, .itmsp est essentiellement un répertoire conteneur. Les dossiers .itmsp contiennent des fichiers XML et des médias.

La dernière mise à jour de Xcode et/ou de Mac OS X (Xcode 4.6.1 sur Mac OS 10.8.3) a détourné l'association de type de fichier pour les répertoires avec l'extension .itmsp. Auparavant, ils étaient traités comme des dossiers normaux - pas besoin de double-cliquer pour voir à l'intérieur. Maintenant, je dois double-cliquer dessus pour interagir avec eux. Lorsque je le fais, un programme appelé Application Loader tente de les ouvrir. Pour voir à l'intérieur, je dois faire un clic droit et sélectionner "Afficher le contenu du paquet". Je travaille avec des milliers de ces fichiers à tout moment, donc cela ne fonctionnera pas.

J'ai essayé de changer ou de supprimer l'association de type de fichier en utilisant Obtenir des informations et RCDefaultApp. Aucun des deux ne fonctionne. Supprimer l'association de type de fichier transforme simplement les répertoires .itmsp en fichiers vierges. Il en va de même si je supprime complètement Application Loader.app. Dans les deux cas, je ne peux toujours pas parcourir le contenu sans faire un clic droit.

La réponse précédemment acceptée a bien fonctionné pendant un moment : lsregister -u /Applications/Contents/Applications/Application\ Loader.app/ Mais cela ne fonctionne plus depuis que j'ai mis à jour Xcode et/ou Mac OS X. Si vous avez Xcode installé, vous devriez pouvoir tester cela vous-même en nommant un répertoire foo.itmsp.

Comment puis-je faire en sorte que les fichiers .itmsp soient à nouveau traités comme des dossiers ?

11voto

jaume Points 13186

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 :

enter image description here

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 ):

  1. 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 ).

  2. 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).

  3. 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 :

  1. Ouvrez Automator dans le dossier Applications et sélectionnez Application :

    enter image description here

  2. 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 :

    enter image description here

  3. Remplacer le contenu par défaut de script par exit 0 :

    enter image description here

  4. Enregistrez l'application sous le nom de itmspOpener :

    enter image description here

  5. Fermer Automator.

  6. Sélectionnez itmspOpener.app et montrer son contenu :

    enter image description here

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

    enter image description here

  8. 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.

  9. Associer un fichier .itmsp à itmspOpener et appuyez sur le bouton Change All... :

    enter image description here

  10. 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/ .)

  11. 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.

  12. Abrir itmspOpener.app pour charger son fichier plist et enregistrer com.apple.itunes-producer.itmsp :

    $ open ~/Desktop/itmspOpener.app
  13. Début Application Loader.app :

    $ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'

    Dossier foo3.itmsp devrait toujours être affiché comme un dossier.

  14. 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 :

  1. Créer itmspOpener.app et modifier son Info.plist comme décrit ci-dessus.

  2. 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.

  3. 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 &
  4. Définir les deux scripts exécutables :

    $ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher 
  5. Définir /usr/local/bin/itmspTypeLoaderLauncher comme crochet de connexion :

    $ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
  6. Redémarrez pour que les changements prennent effet. Après vous être connecté, vous devriez voir ceci :

    enter image description here

    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 :

enter image description here

et je peux confirmer que les dossiers .itmsp ont été affichés comme des dossiers pendant la mise à jour :

enter image description here

et après :

enter image description here

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 :

  1. Ouvrez Automator dans le dossier Applications et sélectionnez Application :

    enter image description here

  2. 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 :

    enter image description here

  3. Définir Passer l'entrée a comme arguments :

    enter image description here

  4. 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
  5. Enregistrez l'application sous le nom de itmspOpener :

    enter image description here

  6. 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 :

enter image description here

Réparons cela aussi :

  1. Assurez-vous que Automator est fermé.

  2. Sélectionnez itmspOpener et affichez son contenu :

    enter image description here

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

    enter image description here

  4. 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 :

    enter image description here

  5. 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 :

    enter image description here

  6. Ouvrez l'aperçu et sélectionnez Fichier>Nouveau à partir du presse-papiers. Enregistrez le fichier en tant que folder.icns :

    enter image description here

  7. Copie folder.icns a itmspOpener/Contents/Resources :

    enter image description here

  8. Associer un fichier .itmsp à itmspOpener et appuyez sur le bouton Change All... :

    enter image description here

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 :

enter image description here

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

enter image description here

7voto

Une option serait de désenregistrer Application Loader avec lsregister -u /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/, mais il est de nouveau enregistré s'il est ouvert, si la base de données des services de lancement est reconstruite, ou éventuellement si Xcode est mis à jour.

Vous pourriez également mettre en commentaire les entrées dans les dictionnaires CFBundleDocumentTypes et UTExportedTypeDeclarations dans /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Info.plist et exécuter lsregister -f /Applications/Xcode.app/Contents/Applications/Utilities/Application\ Loader.app/. Cela n'invalide pas la signature de code de Xcode, mais les modifications pourraient être écrasées par des mises à jour.

Le chemin complet vers lsregister est /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister dans 10.5 et les versions ultérieures.

2voto

Old Pro Points 5634

Voici un extrait pertinent de la documentation d'Apple sur les bundles (ajout d'emphase)

Comment le système identifie les bundles et les packages

Le Finder considère qu'un répertoire est un package si l'une des conditions suivantes est vraie :

  • Le répertoire a une extension de nom de fichier connue : .app, .bundle, .framework, .plugin, .kext, et ainsi de suite.
  • Le répertoire a une extension qu'une autre application prétend représenter un type de package; voir “Paquets de Documents”.
  • Le répertoire a son bit de package défini.

La manière préférée de spécifier un package est de donner au répertoire du package une extension de nom de fichier connue. Dans la plupart des cas, Xcode s'occupe de cela pour vous en fournissant des modèles qui appliquent la bonne extension. Tout ce que vous avez à faire est de créer un projet Xcode du type approprié.

Il est presque certain que Xcode affirme que .itmsp représente un type de package, comme décrit dans Paquets de Documents. Peut-être en supprimant cette extension du Info.plist de Xcode cela règlera le problème, mais je soupçonne qu'une fois que cette association a été notée par le Finder, la supprimer de Xcode ne l'annulera pas. Quels sont les "applications recommandées" que vous obtenez lorsque vous faites un clic droit sur "Ouvrir Avec..."? Vous devez vérifier tous leurs Info.plists.

Je suggère de voir si vous pouvez vous en sortir en utilisant lsregister -u pour désenregistrer toute application qui prétend que .itmsp est un package. Sinon, vous devrez peut-être supprimer .itmsp de tous les plists et ensuite réinitialiser l'ensemble de la base de données d'association du Finder en utilisant lsregister -kill -seed. Je n'ai jamais fait ça, on ne sait pas combien de dommages cela pourrait causer au reste de votre système. Probablement vous voulez désenregistrer, puis modifier les plists, ensuite tuer et reseeder la base de données. Ça ne me surprendrait pas si le désenregistrement ne supprime pas l'association si vous l'avez déjà retirée du plist, et le reseeder l'ajoutera de nouveau si vous ne l'avez pas encore supprimée. De plus, de cette façon, vous ne perdrez pas toutes les autres associations des applications incriminées.

Pire encore, Xcode aurait pu passer et définir le bit de bundle sur tous les dossiers. Je suppose que vous devrez alors écrire un script utilisant GetFileInfo et SetFile pour scanner le disque et annuler cela, ce qui est un peu ennuyeux, mais faisable. Croisons les doigts pour que les bits de bundle restent non définis. Utilisez GetFileInfo pour vérifier en testant quelques-uns.

0voto

moodforaday Points 2633

Je crois que vous pouvez résoudre cela en utilisant

/usr/bin/SetFile -a B /chemin/vers/fichier.itmsp

Testez-le sur un avant d'essayer sur tous les autres, évidemment.

Si vous avez besoin de l'exécuter sur tous ceux dans un dossier donné:

find . -name \*.itmsp -exec /usr/bin/SetFile -a B {} \;

devrait le faire pour vous.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X