Masalahnya: folder .itmsp ditampilkan sebagai file
Finder memperlakukan folder .itmsp sebagai paket , yaitu seolah-olah itu adalah satu file. Misalnya, dalam tampilan kolom, apa pun yang terkandung dalam folder .itmsp tidak terlihat, hanya ikon dokumen yang ditampilkan:
Finder menganggap direktori sebagai paket jika salah satu dari kondisi berikut ini benar (dari Panduan Pemrograman Bundle ):
Direktori ini memiliki ekstensi nama file yang dikenal: .app, .bundle, .framework, .plugin, .kext, dan sebagainya (seperti yang didefinisikan /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
. Ini adalah daftar biner, buka dengan Xcode:) open -a Xcode Info.plist
.
Direktori memiliki ekstensi yang diklaim oleh beberapa aplikasi lain sebagai tipe paket (cari com.apple.package
di output mdls -name kMDItemContentTypeTree <foldername>
untuk mengetahuinya.)
Direktori ini memiliki bit set paketnya (jika GetFileInfo -ab <foldername>
dikembalikan 1
, sudah diatur.)
Kasus 2. berlaku untuk folder .itmsp: Application Loader.app
jenis ekspor com.apple.itunes-producer.itmsp
dan atur agar sesuai dengan 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>
Solusi: ketik deklarasi ulang com.apple.itunes-producer.itmsp
Sebuah solusi adalah mendeklarasikan ulang tipe com.apple.itunes-producer.itmsp
dan ekstensi itmsp
sebagai folder dan memaksa Layanan Peluncuran untuk menggunakan deklarasi tipe yang dimodifikasi.
Catatan penting:
Meskipun itu andal memecahkan masalah OP, solusi yang diusulkan, ketika diterapkan ke paket lain, tidak menampilkannya sebagai folder.
Saya telah menemukan bahwa solusi yang diusulkan tampaknya hanya bekerja dengan jenis file yang dideklarasikan oleh aplikasi yang terletak di jalur aplikasi non standar.
Ini adalah kasus dengan Application Loader.app
, yang terletak di /Applications/Xcode.app/Contents/Applications/
.
Jika Anda tertarik dengan solusi parsial, periksa bagian akhir jawaban ini.
Agar folder .itmsp ditampilkan sebagai folder oleh Finder, ikuti langkah-langkah berikut:
Buka Automator di folder Aplikasi dan pilih Aplikasi :
Pilih Utilitas di daftar Perpustakaan, pilih Jalankan Script Shell dan seret ke panel di sebelah kanan:
Ganti konten skrip default dengan exit 0
:
Simpan aplikasi sebagai itmspOpener:
Tutup Automator.
Pilih itmspOpener.app
dan tampilkan isinya:
Temukan Konten> Info.plist dan buka dengan editor favorit Anda:
Ganti bagian ini di 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>
Catatan:
Kenapa kUTTypeDirectory
bukannya public.directory
di UTExportedTypeDeclarations
? Dari dokumentasi Apple : Penting: Saat menggunakan ISK yang ditentukan sistem dalam kode Anda, Anda harus menggunakan konstanta yang didefinisikan dalam UTCoreTypes.h
kerangka Layanan Peluncuran bila tersedia, daripada string UTI yang sebenarnya. Misalnya, kirimkan kUTTypeApplication daripada "com.apple.application". "Pengidentifikasi Jenis Seragam yang Dideklarasikan Sistem" mencantumkan konstanta ini sebagai tambahan pada string UTI.
Kaitkan file .itmsp ke itmspOpener
dan tekan tombol Change All...:
Setel ulang basis data Layanan Peluncuran:
$ lsregister -kill -r -domain local -domain system -domain user
(pada OS X 10.8 lsregister
terletak di /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/
.)
Buat folder .itmsp dan daftarkan propertinya:
$ mkdir foo3.itmsp
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.folder",
"public.directory",
"public.item"
)
Karena basis data Layanan Peluncuran direset, sekarang Finder menunjukkan folder .itmsp sebagai folder.
Buka itmspOpener.app
untuk memuat file plistnya dan mendaftar com.apple.itunes-producer.itmsp
:
$ open ~/Desktop/itmspOpener.app
Mulai Application Loader.app
:
$ open '/Applications/Xcode.app/Contents/Applications/Application Loader.app'
Folder foo3.itmsp
harus tetap ditampilkan sebagai folder.
Periksa properti folder lagi:
$ mdls -name kMDItemContentTypeTree foo3.itmsp/
kMDItemContentTypeTree = (
"public.directory",
"public.item",
"public.content"
)
com.apple.package
tidak ditambahkan ke atribut metadata folder, itu sebabnya Finder masih menampilkan folder .itmsp sebagai folder!
Solusi otomatis: menampilkan folder .itmsp sebagai folder setelah login
Untuk menampilkan folder .itmsp sebagai folder setelah login:
Buat itmspOpener.app
dan modifikasi Info.plist
seperti dijelaskan di atas.
Buat /usr/local/bin/itmspTypeLoader
dengan konten ini (variabel itmspOpener
menunjuk ke lokasi tempat itmspOpener.app
tinggal, ubah seperlunya):
#!/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
Baik sleep 15
sebelum dan sesudah berlari lsregister
adalah yang paling penting. Jika Anda tidak melihat hasil yang diinginkan, coba berbagai penundaan.
Buat /usr/local/bin/itmspTypeLoaderLauncher
dengan konten ini:
#!/bin/bash
# $1 returns the short name of the user who is logging in
su - $1 -c /usr/local/bin/itmspTypeLoader &
Atur kedua skrip yang dapat dieksekusi:
$ sudo chmod a+x /usr/local/bin/itmspTypeLoader /usr/local/bin/itmspTypeLoaderLauncher
Tetapkan /usr/local/bin/itmspTypeLoaderLauncher
sebagai kait masuk :
$ sudo defaults write com.apple.loginwindow LoginHook /usr/local/bin/itmspTypeLoaderLauncher
Mulai ulang agar perubahan diterapkan. Setelah masuk, Anda akan melihat ini:
dan lsregister -dump
harus mengungkapkan bahwa itmspOpener.app
's UTExportedTypeDeclarations
lebih diprioritaskan 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
--------------------------------------------------------
Apakah Anda melihat inactive
bendera yang diatur dalam jenis ekspor Application Loader.app? Kami mengalahkan Application Loader.
Tes asam: folder .itmsp masih ditampilkan seperti itu setelah pembaruan iTunes
Saya baru saja memperbarui Xcode:
dan dapat mengonfirmasi bahwa folder .itmsp ditampilkan sebagai folder selama pembaruan:
dan sesudahnya:
Solusi parsial: Paket ini akan menampilkan konten ketika diklik ganda
Seperti yang dikomentari sebelumnya, prosedur yang dirinci di atas tidak akan berfungsi dengan folder sewenang-wenang yang ditampilkan sebagai paket oleh Finder.
Namun, jika Anda hanya ingin mengklik dua kali paket untuk membukanya, ada cara untuk melakukannya dengan satu bash
skrip dan Automator:
Script membuat folder sementara yang tersembunyi di dalam paket, mengungkapkannya di Finder (sehingga mengungkapkan paket sebagai folder) dan kemudian menghapus folder sementara.
catatan:
Sebaliknya skrip dapat membuat file sementara yang tersembunyi. Namun, saya lebih suka membuat folder karena rmdir
hanya menghapus folder kosong , sementara rm
menghapus file apa pun , jadi jika, karena alasan tertentu. skrip mendatangkan malapetaka, hanya folder kosong yang akan dihapus, yang mungkin tidak seburuk jika file dihapus.
Automator menggabungkan skrip ke dalam aplikasi yang akan dikaitkan dengan file paket.
Ini adalah langkah-langkah untuk membuat aplikasi semacam itu. Saya akan menggunakan file .itmsp sebagai contoh tipe paket dalam penjelasan di bawah ini:
Buka Automator di folder Aplikasi dan pilih Aplikasi :
Pilih Utilitas di daftar Perpustakaan, pilih Jalankan Script Shell dan seret ke panel di sebelah kanan:
Setel masukan Lulus ke sebagai argumen :
Ganti konten skrip default dengan ini:
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
Simpan aplikasi sebagai itmspOpener:
Tutup Automator.
Sekarang Anda memiliki aplikasi yang dapat membuka file .itmsp sebagai folder jika dikaitkan dengannya.
Ada masalah kosmetik: seperti yang terjadi, file terkait akan memiliki ikon dokumen putih standar:
Mari kita perbaiki ini juga:
Pastikan Automator ditutup.
Pilih itmspOpener dan tampilkan kontennya:
Temukan Konten> Info.plist dan buka dengan editor favorit Anda:
Ganti nilai untuk kunci ini dalam CFBundleDocumentTypes
array:
<key>CFBundleTypeName</key>
<string>itmsp folder</string>
dan tambahkan kunci ini:
<key>CFBundleTypeIconFile</key>
<string>folder</string>
Sekarang, bagian ini terlihat seperti ini:
Beralih ke Finder, pilih folder, tekan ⌘I, pilih ikon folder di sudut kiri atas dan salin dengan ⌘C:
Buka Pratinjau dan pilih File> Baru dari Clipboard. Simpan file sebagai folder.icns
:
Salin folder.icns
ke itmspOpener/Contents/Resources
:
Kaitkan file .itmsp ke itmspOpener
dan tekan tombol Change All...:
Ikon file .itmsp harus berubah menjadi folder, atau setidaknya saya pikir begitu: sayangnya, ini tidak terjadi. Jadi saya memindahkan aplikasi itmspOpener ke lokasi lain (saya membuat folder sementara di Desktop saya, memindahkannya ke sana dan kembali ke Desktop saya). Itu menyegarkan informasi ikon di Finder:
Sekarang klik dua kali file .itmsp dan tontonlah itu terbuka sebagai folder: