Das Problem: .itmsp-Ordner werden als Dateien angezeigt
Der Finder behandelt .itmsp-Ordner als Pakete , dh als ob sie eine einzelne Datei wären. In der Spaltenansicht ist beispielsweise alles, was im Ordner .itmsp enthalten ist, unsichtbar. Es wird nur das Dokumentsymbol angezeigt:
Der Finder betrachtet ein Verzeichnis als Paket, wenn eine der folgenden Bedingungen erfüllt ist (aus dem Bundle-Programmierhandbuch ):
Das Verzeichnis hat eine bekannte Dateinamenerweiterung: .app, .bundle, .framework, .plugin, .kext usw. (wie in /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Dies ist eine binäre Liste, öffne sie mit Xcode :) open -a Xcode Info.plist
.
Das Verzeichnis hat eine Erweiterung, die von einigen anderen Anwendungsansprüchen als Pakettyp angegeben wird (suchen Sie com.apple.package
in der Ausgabe von mdls -name kMDItemContentTypeTree <foldername>
, um dies herauszufinden.)
Das Verzeichnis hat seine Paket - Bit gesetzt (wenn GetFileInfo -ab <foldername>
zurückkehrt 1
, es gesetzt ist.)
Fall 2. gilt für .itmsp-Ordner: Application Loader.app
exportiert den Typ com.apple.itunes-producer.itmsp
und stellt ihn so ein, dass er den folgenden Anforderungen entspricht 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>
Eine Lösung: Typ neu deklarieren com.apple.itunes-producer.itmsp
Eine Lösung wäre, Typ com.apple.itunes-producer.itmsp
und Erweiterung itmsp
als Ordner neu zu deklarieren und Launch Services zu zwingen, die geänderte Typdeklaration zu verwenden.
Wichtige Notiz:
Obwohl es das Problem des OP zuverlässig löst, zeigt die vorgeschlagene Lösung, wenn sie auf andere Pakete angewendet wird, diese nicht als Ordner an.
Ich habe herausgefunden, dass die vorgeschlagene Lösung nur mit Dateitypen funktioniert, die von Anwendungen deklariert wurden, die sich in einem nicht standardmäßigen Anwendungspfad befinden.
Dies ist der Fall bei Application Loader.app
, der sich in befindet /Applications/Xcode.app/Contents/Applications/
.
Wenn Sie an einer Teillösung interessiert sind, überprüfen Sie das Ende dieser Antwort.
Befolgen Sie die folgenden Schritte, damit .itmsp-Ordner vom Finder als Ordner angezeigt werden:
Öffnen Sie Automator im Ordner Applications und wählen Sie Application :
Wählen Sie in der Bibliotheksliste Dienstprogramme aus, wählen Sie Shell-Skript ausführen aus und ziehen Sie es in den Bereich rechts:
Ersetzen Sie den Standard-Skriptinhalt durch exit 0
:
Speichern Sie die Anwendung als itmspOpener:
Schließen Sie Automator.
Wählen Sie itmspOpener.app
den Inhalt aus und zeigen Sie ihn an:
Suchen Sie nach Contents> Info.plist und öffnen Sie es mit Ihrem bevorzugten Editor:
Ersetzen Sie diese Abschnitte in 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>
Hinweis:
Warum kUTTypeDirectory
statt public.directory
in UTExportedTypeDeclarations
? Aus der Dokumentation von Apple : Wichtig: Wenn Sie systemdefinierte UTIs in Ihrem Code verwenden, sollten Sie die UTCoreTypes.h
im Launch Services-Framework definierten Konstanten verwenden, sofern verfügbar, und nicht die tatsächlichen UTI-Zeichenfolgen. Übergeben Sie beispielsweise kUTTypeApplication anstelle von "com.apple.application". "System-Declared Uniform Type Identifiers" listet diese Konstanten zusätzlich zu den UTI-Zeichenfolgen auf.
Verknüpfen Sie eine .itmsp-Datei mit itmspOpener
und drücken Sie die Taste Change All...:
Setzen Sie die Launch Services-Datenbank zurück:
$ lsregister -kill -r -domain local -domain system -domain user
(Unter OS X 10.8 lsregister
befindet sich in /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
Erstellen Sie einen .itmsp-Ordner und listen Sie seine Eigenschaften auf:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Da die Launch Services-Datenbank zurückgesetzt wurde, werden im Finder jetzt .itmsp-Ordner als Ordner angezeigt.
Öffnen Sie itmspOpener.app
, um die plist-Datei zu laden und zu registrieren com.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
Start Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Ordner foo3.itmsp
sollte weiterhin als Ordner angezeigt werden.
Überprüfen Sie die Ordnereigenschaften erneut:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
Wurde den Metadatenattributen des Ordners nicht hinzugefügt, zeigt der Finder die .itmsp-Ordner weiterhin als Ordner an.
Automatisierte Lösung: Anzeigen von .itmsp-Ordnern als Ordner nach der Anmeldung
So zeigen Sie .itmsp-Ordner nach der Anmeldung als Ordner an:
Erstellen itmspOpener.app
und ändern Sie es Info.plist
wie oben beschrieben.
Erstellen Sie /usr/local/bin/itmspTypeLoader
mit diesem Inhalt (die Variable itmspOpener
zeigt auf den Ort, an dem sich der Inhalt itmspOpener.app
befindet, ändern Sie ihn nach Bedarf):
#!/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
Sowohl sleep 15
vor als auch nach dem Laufen lsregister
sind von größter Bedeutung. Wenn Sie das gewünschte Ergebnis nicht sehen, versuchen Sie es mit verschiedenen Verzögerungen.
Erstellen Sie /usr/local/bin/itmspTypeLoaderLauncher
mit diesen Inhalten:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Stellen Sie beide ausführbaren Skripte ein:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Stellen Sie /usr/local/bin/itmspTypeLoaderLauncher
als Login Haken :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Starten Sie den Computer neu, damit die Änderungen wirksam werden. Nach dem Einloggen solltest du folgendes sehen:
und lsregister -dump
sollte zeigen, dass itmspOpener.app
's UTExportedTypeDeclarations
Vorrang vor Application Loader.app
' s hat:
$ 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
--------------------------------------------------------
inactive
Wird das Flag beim Typexport von Application Loader.app angezeigt? Wir haben Application Loader besiegt.
Der Härtetest: .itmsp-Ordner werden nach dem iTunes-Update immer noch als solche angezeigt
Ich habe kürzlich Xcode aktualisiert:
und können bestätigen, dass .itmsp-Ordner während der Aktualisierung als Ordner angezeigt wurden:
und danach:
Eine Teillösung: Das Paket zeigt den Inhalt an, wenn Sie darauf doppelklicken
Wie bereits erwähnt, funktioniert das oben beschriebene Verfahren nicht mit beliebigen Ordnern, die vom Finder als Pakete angezeigt werden.
Wenn Sie jedoch nur auf ein Paket doppelklicken möchten, um es zu öffnen, gibt es eine Möglichkeit, dies mit einem bash
Skript und Automator zu tun :
Das Skript erstellt einen versteckten temporären Ordner innerhalb des Pakets, zeigt ihn im Finder an (wodurch das Paket als Ordner angezeigt wird) und löscht dann den temporären Ordner.
Hinweis:
Das Skript könnte stattdessen eine versteckte, temporäre Datei erstellen. Ich ziehe es jedoch vor, einen Ordner zu erstellen, da rmdir
nur leere Ordner gelöscht werden, während alle Dateien rm
gelöscht werden . Das Skript ist verheerend, nur leere Ordner werden gelöscht, was wahrscheinlich nicht so schlimm ist, als ob Dateien gelöscht würden.
Automator bündelt das Skript in eine Anwendung, die den Paketdateien zugeordnet wird.
Dies sind die Schritte, um eine solche Anwendung zu erstellen. In der folgenden Erläuterung werden .itmsp-Dateien als Beispiel für Pakettypen verwendet:
Öffnen Sie Automator im Ordner Applications und wählen Sie Application :
Wählen Sie in der Bibliotheksliste Dienstprogramme aus, wählen Sie Shell-Skript ausführen aus und ziehen Sie es in den Bereich rechts:
Setze Pass Eingabe auf als Argumente :
Ersetzen Sie den Standard-Skriptinhalt durch Folgendes:
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
Speichern Sie die Anwendung als itmspOpener:
Schließen Sie Automator.
Jetzt haben Sie eine Anwendung, die .itmsp-Dateien als Ordner öffnen kann, wenn sie damit verknüpft sind.
Es gibt ein kosmetisches Problem: So wie es aussieht, haben verknüpfte Dateien das standardmäßige weiße Dokumentsymbol:
Lassen Sie uns das auch beheben:
Stellen Sie sicher, dass Automator geschlossen ist.
Wählen Sie itmspOpener aus und zeigen Sie den Inhalt an:
Suchen Sie nach Contents> Info.plist und öffnen Sie es mit Ihrem bevorzugten Editor:
Ersetzen Sie den Wert für diesen Schlüssel im CFBundleDocumentTypes
Array:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
und diesen Schlüssel hinzufügen:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Nun sieht der Abschnitt so aus:
Wechseln Sie zum Finder, wählen Sie einen Ordner aus, drücken Sie ⌘I, wählen Sie das Ordnersymbol in der linken oberen Ecke und kopieren Sie es mit ⌘C:
Öffnen Sie die Vorschau und wählen Sie Datei> Neu aus der Zwischenablage. Speichern Sie die Datei als folder.icns
:
Kopieren folder.icns
nach itmspOpener/Contents/Resources
:
Verknüpfen Sie eine .itmsp-Datei mit itmspOpener
und drücken Sie die Taste Change All...:
Das Icon von .itmsp-Dateien sollte sich in einen Ordner ändern, oder zumindest dachte ich das so: Leider war dies nicht der Fall. Daher habe ich die Anwendung itmspOpener an einen anderen Speicherort verschoben (ich habe einen temporären Ordner auf meinem Desktop erstellt, dorthin und zurück auf meinen Desktop verschoben). Dadurch wurden die Symbolinformationen im Finder aktualisiert:
Doppelklicken Sie nun auf eine .itmsp-Datei und sehen Sie, wie diese als Ordner geöffnet wird: