Problem: foldery .itmsp są wyświetlane jako pliki
Finder traktuje foldery .itmsp jak pakiety , to znaczy, jakby były pojedynczym plikiem. Na przykład w widoku kolumny wszystko zawarte w folderze .itmsp jest niewidoczne, wyświetlana jest tylko ikona dokumentu:

Finder uważa katalog za pakiet, jeśli spełniony jest jeden z poniższych warunków (z Przewodnika programowania pakietów ):
Katalog ma znane rozszerzenie nazwy pliku: .app, .bundle, .framework, .plugin, .kext itd. (Zgodnie z definicją w /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist. To jest binarna lista, otwórz ją za pomocą Xcode:) open -a Xcode Info.plist.
Katalog ma rozszerzenie, które według niektórych innych aplikacji reprezentuje typ pakietu (poszukaj com.apple.packagew danych wyjściowych, mdls -name kMDItemContentTypeTree <foldername>aby się dowiedzieć).
Katalog ma ustawiony bit pakietu (jeśli GetFileInfo -ab <foldername>zwraca 1, jest ustawiony).
Przypadek 2. dotyczy folderów .itmsp: Application Loader.apptyp eksportu com.apple.itunes-producer.itmspi ustawia zgodność z 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>
Rozwiązanie: ponownie zadeklaruj typ com.apple.itunes-producer.itmsp
Rozwiązaniem byłoby ponowne zadeklarowanie typu com.apple.itunes-producer.itmspi rozszerzenia itmspjako folderu i wymuszenie na usługach uruchamiania korzystania ze zmodyfikowanej deklaracji typu.
Ważna uwaga:
Chociaż niezawodnie rozwiązuje problem PO, proponowane rozwiązanie zastosowane do innych pakietów nie wyświetla ich jako folderów.
Przekonałem się, że proponowane rozwiązanie wydaje się działać tylko z typami plików zadeklarowanymi przez aplikacje znajdujące się w niestandardowej ścieżce aplikacji.
Tak jest w przypadku Application Loader.app, który znajduje się w /Applications/Xcode.app/Contents/Applications/.
Jeśli jesteś zainteresowany częściowym rozwiązaniem, sprawdź koniec tej odpowiedzi.
Aby foldery .itmsp były wyświetlane przez Finder jako foldery, wykonaj następujące kroki:
Otwórz Automator w folderze Aplikacje i wybierz Aplikacja :

Wybierz Narzędzia z listy Biblioteka, wybierz Uruchom skrypt powłoki i przeciągnij go do panelu po prawej stronie:

Zamień domyślną zawartość skryptu na exit 0:

Zapisz aplikację jako itmspOpener:

Zamknij Automator.
Wybierz itmspOpener.appi pokaż jego zawartość:

Znajdź zawartość> Info.plist i otwórz go w swoim ulubionym edytorze:

Zamień te sekcje w 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>
Uwaga:
Dlaczego kUTTypeDirectoryzamiast public.directoryw UTExportedTypeDeclarations? Z dokumentacji Apple'a : Ważne: W przypadku korzystania ze zdefiniowanych w systemie interfejsów użytkownika w kodzie należy używać stałych zdefiniowanych w UTCoreTypes.hramach usług uruchamiania, jeśli są one dostępne, zamiast rzeczywistych ciągów interfejsu użytkownika. Na przykład przekaż kUTTypeApplication zamiast „com.apple.application”. „Deklarowane przez system jednolite identyfikatory typu” wymienia te stałe oprócz ciągów UTI.
Skojarz plik .itmsp z itmspOpeneri naciśnij przycisk Change All...:

Zresetuj bazę danych usług uruchamiania:
$ lsregister -kill -r -domain local -domain system -domain user
(w OS X 10.8 lsregisterznajduje się w /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/.)
Utwórz folder .itmsp i wyświetl jego właściwości:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Ponieważ baza danych Launch Services została zresetowana, teraz Finder pokazuje foldery .itmsp jako foldery.
Otwórz, itmspOpener.appaby załadować plik plist i zarejestrować com.apple.itunes-producer.itmsp:
$ open ~/Desktop/itmspOpener.app
Rozpocznij Application Loader.app:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Folder foo3.itmsppowinien nadal być wyświetlany jako folder.
Sprawdź ponownie właściwości folderu:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package nie został dodany do atrybutów metadanych folderu, dlatego Finder nadal wyświetla foldery .itmsp jako foldery!
Zautomatyzowane rozwiązanie: wyświetlanie folderów .itmsp jako folderów po zalogowaniu
Aby wyświetlić foldery .itmsp jako foldery po zalogowaniu:
Utwórz itmspOpener.appi zmodyfikuj go, Info.plistjak opisano powyżej.
Utwórz za /usr/local/bin/itmspTypeLoaderpomocą tej zawartości (zmienna itmspOpenerwskazuje lokalizację, w której się itmspOpener.appznajduje, w razie potrzeby zmień):
#!/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
Zarówno sleep 15przed, jak i po biegu lsregistermają ogromne znaczenie. Jeśli nie widzisz pożądanego rezultatu, spróbuj różnych opóźnień.
Utwórz /usr/local/bin/itmspTypeLoaderLauncherz tej zawartości:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Ustaw oba skrypty jako pliki wykonywalne:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Ustaw /usr/local/bin/itmspTypeLoaderLauncherjako hak logowania :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Uruchom ponownie, aby zmiany odniosły skutek. Po zalogowaniu powinieneś zobaczyć to:

i lsregister -dumppowinny ujawnić, że itmspOpener.app„s UTExportedTypeDeclarationsma pierwszeństwo przed 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
--------------------------------------------------------
Czy widzisz inactiveflagę ustawioną w eksporcie typu Application Loader.app? Pokonaliśmy moduł ładujący aplikacje.
Kwasowy test: foldery .itmsp nadal są wyświetlane jako takie po aktualizacji iTunes
Niedawno zaktualizowałem Xcode:

i może potwierdzić, że foldery .itmsp były wyświetlane jako foldery podczas aktualizacji:

a potem:

Częściowe rozwiązanie: pakiet wyświetli zawartość po dwukrotnym kliknięciu
Jak wspomniano wcześniej, procedura opisana powyżej nie będzie działać z dowolnymi folderami wyświetlanymi przez Finder jako pakiety.
Jeśli jednak chcesz po prostu kliknąć dwukrotnie pakiet, aby go otworzyć, możesz to zrobić za pomocą jednego bashskryptu i Automatora:
Skrypt tworzy ukryty, tymczasowy folder w pakiecie, ujawnia go w Finderze (ujawniając pakiet jako folder), a następnie usuwa folder tymczasowy.
Uwaga:
Zamiast tego skrypt może utworzyć ukryty plik tymczasowy. Jednak wolę utworzyć folder, ponieważ rmdirusuwa tylko puste foldery, a jednocześnie rmusuwa dowolny plik, więc jeśli z jakiegoś powodu. skrypt sieje spustoszenie, tylko puste foldery zostaną usunięte, co prawdopodobnie nie jest tak złe, jak gdyby pliki zostały usunięte.
Automator łączy skrypt w aplikację, która zostanie powiązana z plikami pakietu.
Są to kroki, aby utworzyć taką aplikację. Wykorzystam pliki .itmsp jako przykład typu pakietu w poniższym objaśnieniu:
Otwórz Automator w folderze Aplikacje i wybierz Aplikacja :

Wybierz Narzędzia z listy Biblioteka, wybierz Uruchom skrypt powłoki i przeciągnij go do panelu po prawej stronie:

Zestaw Przełęcz wejście do jako argumenty :

Zastąp domyślną zawartość skryptu tym:
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
Zapisz aplikację jako itmspOpener:

Zamknij Automator.
Teraz masz aplikację, która może otwierać pliki .itmsp jako foldery, jeśli są z nią powiązane.
Istnieje problem kosmetyczny: na obecnym etapie skojarzone pliki będą miały standardową białą ikonę dokumentu:

Naprawmy to również:
Upewnij się, że Automator jest zamknięty.
Wybierz itmspOpener i pokaż jego zawartość:

Znajdź zawartość> Info.plist i otwórz go w swoim ulubionym edytorze:

Zamień wartość tego klucza w CFBundleDocumentTypestablicy:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
i dodaj ten klucz:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Teraz sekcja wygląda następująco:

Przejdź do Findera, wybierz folder, naciśnij ⌘I, wybierz ikonę folderu w lewym górnym rogu i skopiuj za pomocą ⌘C:

Otwórz podgląd i wybierz Plik> Nowy ze schowka. Zapisz plik jako folder.icns:

Skopiuj folder.icnsdo itmspOpener/Contents/Resources:

Skojarz plik .itmsp z itmspOpeneri naciśnij przycisk Change All...:

Ikona plików .itmsp powinna zmienić się w folder, a przynajmniej tak mi się wydawało: niestety tak nie było. Przeniosłem więc aplikację itmspOpener do innej lokalizacji (utworzyłem folder tymczasowy na moim pulpicie, przeniosłem go tam iz powrotem na pulpit). Odświeżono informacje o ikonie w Finderze:

Teraz kliknij dwukrotnie plik .itmsp i obejrzyj go jako folder:
