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.package
w 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.app
typ eksportu com.apple.itunes-producer.itmsp
i 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.itmsp
i rozszerzenia itmsp
jako 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.app
i 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 kUTTypeDirectory
zamiast public.directory
w 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.h
ramach 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 itmspOpener
i 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 lsregister
znajduje 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.app
aby 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.itmsp
powinien 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.app
i zmodyfikuj go, Info.plist
jak opisano powyżej.
Utwórz za /usr/local/bin/itmspTypeLoader
pomocą tej zawartości (zmienna itmspOpener
wskazuje lokalizację, w której się itmspOpener.app
znajduje, 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 15
przed, jak i po biegu lsregister
mają ogromne znaczenie. Jeśli nie widzisz pożądanego rezultatu, spróbuj różnych opóźnień.
Utwórz /usr/local/bin/itmspTypeLoaderLauncher
z 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/itmspTypeLoaderLauncher
jako 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 -dump
powinny ujawnić, że itmspOpener.app
„s UTExportedTypeDeclarations
ma 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 inactive
flagę 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 bash
skryptu 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ż rmdir
usuwa tylko puste foldery, a jednocześnie rm
usuwa 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 CFBundleDocumentTypes
tablicy:
<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.icns
do itmspOpener/Contents/Resources
:
Skojarz plik .itmsp z itmspOpener
i 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: