問題:.itmspフォルダーがファイルとして表示される
Finderは.itmspフォルダーをパッケージとして、つまり単一のファイルのように扱います。たとえば、列ビューでは、.itmspフォルダー内に含まれるものはすべて表示されず、ドキュメントアイコンのみが表示されます。
次の条件のいずれかが当てはまる場合、Finderはディレクトリをパッケージと見なします(バンドルプログラミングガイドから)。
ディレクトリには、.app、.bundle、.framework、.plugin、.kextなどの既知のファイル名拡張子があります(定義されて/System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist
いるとおりです。これはバイナリ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が変更されたタイプ宣言を使用するように強制することです。
重要な注意点:
OPの問題は確実に解決されますが、提案されたソリューションは、他のパッケージに適用された場合、フォルダーとして表示されません。
提案されたソリューションは、非標準のアプリケーションパスにあるアプリケーションによって宣言されたファイルタイプでのみ機能するようだとわかりました。
これは、の場合であるApplication Loader.app
に位置し、/Applications/Xcode.app/Contents/Applications/
。
部分的な解決策に関心がある場合は、この回答の終わりを確認してください。
Finderで.itmspフォルダーをフォルダーとして表示するには、次の手順に従います。
[アプリケーション]フォルダーでAutomatorを開き、[ アプリケーション ]を選択します。
[ライブラリ]リストで[ユーティリティ]を選択し、[シェルスクリプトの実行]を選択して、右側のペインにドラッグします。
デフォルトのスクリプトの内容をexit 0
次のように置き換えます。
アプリケーションをitmspOpenerとして保存します。
Automatorを閉じます。
itmspOpener.app
その内容を選択して表示します。
Contents> 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>
注:
なぜin kUTTypeDirectory
ではなく?Appleのドキュメントから:重要:コードでシステム定義のUTIを使用する場合、実際のUTI文字列ではなく、Launch Servicesフレームワークで定義されている定数を使用する必要があります。たとえば、「com.apple.application」ではなくkUTTypeApplicationを渡します。「システム宣言のUniform Type Identifiers」は、UTI文字列に加えてこれらの定数をリストしています。public.directory
UTExportedTypeDeclarations
UTCoreTypes.h
.itmspファイルを関連付けてitmspOpener
、ボタンを押しますChange All...。
Launch Servicesデータベースをリセットします。
$ lsregister -kill -r -domain local -domain system -domain user
(OS 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
: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
--------------------------------------------------------
あなたは参照していますinactive
アプリケーションLoader.appのタイプの輸出でフラグが設定されて?Application Loaderを破りました。
酸のテスト:.itmspフォルダーは、iTunesの更新後もそのまま表示されます
私は最近Xcodeを更新しました:
更新中に.itmspフォルダーがフォルダーとして表示されたことを確認できます。
そしてその後:
部分的な解決策:ダブルクリックするとパッケージに内容が表示されます
前述のとおり、上記の手順は、Finderによってパッケージとして表示される任意のフォルダーでは機能しません。
ただし、パッケージをダブルクリックして開くだけの場合は、1つのbash
スクリプトとAutomatorでそれを行う方法があります。
これらは、このようなアプリケーションを作成する手順です。以下の説明では、パッケージタイプの例として.itmspファイルを使用します。
[アプリケーション]フォルダーでAutomatorを開き、[ アプリケーション ]を選択します。
[ ライブラリ]リストで[ ユーティリティ]を選択し、[ シェルスクリプトの実行]を選択して、右側のペインにドラッグします。
引数として入力を渡すを設定します。
デフォルトのスクリプトの内容をこれに置き換えます:
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として保存します。
Automatorを閉じます。
これで、.itmspファイルが関連付けられている場合、フォルダーとして開くことができるアプリケーションができました。
表面的な問題があります:現状では、関連するファイルには標準の白いドキュメントアイコンがあります:
これも修正しましょう:
Automatorが閉じていることを確認してください。
itmspOpenerを選択して、その内容を表示します。
Contents> 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ファイルをダブルクリックして、フォルダーとして開いているのを確認します。