Проблема: папки .itmsp відображаються у вигляді файлів
Finder трактує .itmsp папки як пакети , тобто як би це один файл. Наприклад, у вікні стовпця все, що міститься у папці .itmsp, є невидимим, відображається лише значок документа:
Finder вважає каталог пакетом, якщо виконується будь-яке з наведених нижче умов (з Посібника з програмування пакетів ):
У каталозі є відоме розширення назви файлів: .app, .bundle, .framework, .plugin, .kext і так далі (як визначено в /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Це бінарний список), відкрийте його з Xcode:) open -a Xcode Info.plist
.
У каталозі є розширення, яке в деяких інших заявках додатків представляє тип пакету (шукайте com.apple.package
у висновку, mdls -name kMDItemContentTypeTree <foldername>
щоб дізнатися.)
У каталозі встановлено біт пакета (якщо він GetFileInfo -ab <foldername>
повертається 1
, він встановлюється.)
Випадок 2. стосується папки .itmsp: Application Loader.app
тип експорту com.apple.itunes-producer.itmsp
та встановлює його відповідно до 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>
Рішення: повторно оголосити тип com.apple.itunes-producer.itmsp
Рішенням може бути повторне оголошення типу com.apple.itunes-producer.itmsp
та розширення itmsp
як папки та змушення Launch Services використовувати декларацію модифікованого типу.
Важлива примітка:
Хоча воно надійно вирішує проблему ОП, запропоноване рішення, застосоване до інших пакетів, не відображає їх як папки.
Я з'ясував, що запропоноване рішення, здається, працює лише з типами файлів, оголошеними програмами, розташованими в нестандартному шляху до програми.
Це справа з тим Application Loader.app
, що знаходиться в /Applications/Xcode.app/Contents/Applications/
.
Якщо вас цікавить часткове рішення, перевірте кінець цієї відповіді.
Щоб Finder відображав папки .itmsp як папки, виконайте наступні дії:
Відкрийте Автоматизатор у папці Програми та виберіть Застосування :
Виберіть утиліти у списку бібліотеки, виберіть Запустити скрипт оболонки та перетягніть його до області праворуч:
Замініть вміст сценарію за замовчуванням на exit 0
:
Збережіть програму як itmspOpener:
Закрити Автоматизатор.
Виберіть itmspOpener.app
і покажіть його вміст:
Знайдіть Зміст> Info.plist та відкрийте його улюбленим редактором:
Замініть ці розділи на 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>
Примітка:
чому kUTTypeDirectory
замість public.directory
in UTExportedTypeDeclarations
? З документації Apple : Важливо: Під час використання визначених системою UTI у своєму коді слід використовувати константи, визначені UTCoreTypes.h
в рамках програми Launch Services, коли вони доступні, а не фактичні рядки UTI. Наприклад, передайте kUTTypeApplication, а не "com.apple.application". "Оголошені системою уніфіковані ідентифікатори типу" перераховують ці константи на додаток до рядків UTI.
Зв’яжіть файл .itmsp itmspOpener
і натисніть кнопку Change All...:
Скидання бази даних служб запуску:
$ lsregister -kill -r -domain local -domain system -domain user
(на ОС X 10.8 lsregister
знаходиться в /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
Створіть папку .itmsp та перелічіть її властивості:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Оскільки база даних Launch Services була скинута, зараз Finder показує .itmsp папки як папки.
Відкрийте , itmspOpener.app
щоб завантажити свій файл Plist і реєстрації com.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
Початок Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Папка foo3.itmsp
все одно повинна відображатися у вигляді папки.
Перевірте властивості папки ще раз:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
не додано до атрибутів метаданих папки, тому Finder все ще відображає папки .itmsp як папки!
Автоматизоване рішення: відображення .itmsp папок як папок після входу
Щоб відобразити папки .itmsp як папки після входу:
Створіть itmspOpener.app
та змініть її, Info.plist
як описано вище.
Створіть за /usr/local/bin/itmspTypeLoader
допомогою цього вмісту (змінна itmspOpener
точка вказує на місце, де itmspOpener.app
проживає, змінюйте за необхідності):
#!/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
І sleep 15
до, і після бігу lsregister
мають надзвичайно важливе значення. Якщо ви не бачите бажаного результату, спробуйте різні затримки.
Створіть за /usr/local/bin/itmspTypeLoaderLauncher
допомогою цього вмісту:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Встановіть обидва сценарії виконується:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Встановити /usr/local/bin/itmspTypeLoaderLauncher
як гачок для входу :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Перезавантажте, щоб зміни набрали чинності. Після входу ви повинні побачити таке:
і lsregister -dump
повинен виявити, що itmspOpener.app
російська мова UTExportedTypeDeclarations
має перевагу над 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
--------------------------------------------------------
Чи бачите ви встановлений inactive
прапор у експорті типу Application Loader.app? Ми перемогли програму Loader.
Тест на кислотність: папки .itmsp як і раніше відображаються як такі після оновлення iTunes
Я нещодавно оновив Xcode:
і може підтвердити, що папки .itmsp були показані як папки під час оновлення:
і після:
Часткове рішення: У пакеті буде показано вміст при подвійному натисканні
Як було раніше зауважено, описана вище процедура не працюватиме з довільними папками, які Finder відображає у вигляді пакетів.
Однак якщо ви просто хочете мати можливість двічі клацнути пакет, щоб відкрити його, є спосіб зробити це за допомогою одного bash
сценарію та Автоматизатора:
Сценарій створює приховану тимчасову папку всередині пакета, розкриває її у Finder (таким чином розкриваючи пакунок як папку), а потім видаляє тимчасову папку.
Примітка:
Сценарій може замість цього створити прихований тимчасовий файл. Однак я вважаю за краще створити папку, оскільки rmdir
видаляє лише порожні папки, тоді як rm
видаляє будь-який файл, тож якщо з якоїсь причини. скрипт спричиняє шкоду, видаляються лише порожні папки, що, мабуть, не так вже й погано, як якщо б файли були видалені.
Автоматизатор поєднує сценарій у програму, яка буде асоційована з файлами пакунків.
Це етапи створення такої програми. Я буду використовувати .itmsp файли як приклад типу пакету в поясненні нижче:
Відкрийте Автоматизатор у папці Програми та виберіть Застосування :
Виберіть утиліти у списку бібліотеки, виберіть Запустити скрипт оболонки та перетягніть його до області праворуч:
Set Pass вхід в якості аргументів :
Замініть вміст сценарію за замовчуванням таким:
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
Збережіть програму як itmspOpener:
Закрити Автоматизатор.
Тепер у вас є програма, яка може відкривати .itmsp файли як папки, якщо з нею пов’язана.
Існує косметична проблема: як відомо, пов’язані файли матимуть стандартний білий значок документа:
Давайте також це вирішимо:
Переконайтесь, що Automator закритий.
Виберіть itmspOpener та покажіть його вміст:
Знайдіть Зміст> Info.plist та відкрийте його улюбленим редактором:
Замініть значення для цього ключа в CFBundleDocumentTypes
масиві:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
і додайте цей ключ:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Тепер розділ виглядає так:
Перейдіть до Finder, виберіть папку, натисніть ⌘I, виберіть піктограму папки у верхньому лівому куті та скопіюйте її за допомогою ⌘C:
Відкрийте попередній перегляд та виберіть «Файл»> «Нове» з буфера обміну. Збережіть файл як folder.icns
:
Скопіюйте folder.icns
у itmspOpener/Contents/Resources
:
Зв’яжіть файл .itmsp itmspOpener
і натисніть кнопку Change All...:
Піктограма файлів .itmsp повинна змінитися в папку, або, принаймні, я так вважав: на жаль, це було не так. Тому я перемістив додаток itmspOpener в інше місце (я створив тимчасову папку на своєму робочому столі, перемістив її туди і назад на свій робочий стіл). Це оновило інформацію про іконку в Finder:
Тепер двічі клацніть файл .itmsp і дивіться, як він відкривається як папка: