前回は Launch Services API の LSCopyApplicationURLsForURLを使ってオープン可能なアプリケーションの一覧を取得した。
例えば pro.jpg というファイルの場合、次のリストが取得できた。
file://localhost/Applications/QuickTime%20Player.app/,
file://localhost/Developer/Applications/Xcode.app/,
file://localhost/Applications/Gimp.app/,
file://localhost/Applications/OpenOffice.org%202.1.app/,
file://localhost/Applications/Safari.app/,
file://localhost/Applications/Preview.app/,
file://localhost/Developer/Applications/Graphics%20Tools/Core%20Image%20Fun%20House.app/,
file://localhost/Applications/Adobe%20Illustrator%20CS2/Adobe%20Illustrator.app/,
file://localhost/Applications/%E3%83%84%E3%83%BC%E3%83%AB/Firefox.2.app/,
file://localhost/Applications/tools/Firefox.app/,
file://localhost/Applications/Utilities/ColorSync%20Utility.app/,
file://localhost/Users/hashi/development/study/package/build/Release/package.app/,
file://localhost/Applications/Firefox.app/
SimpleCapで扱うファイルは GIF/JPEG/PNG なので、特定のファイルを開けるアプリの一覧よりは、これらの種類を開けるアプリの一覧が欲しい。API の中に LSCopyAllRoleHandlersForContentType があったのでこれを使ってみる。結果は下記の通り。
"com.apple.CoreImageFunHouse.app",
"org.gimp.Gimp",
"com.apple.Preview",
"com.apple.ColorSyncUtility"
むむ。返される形式が異なるのは別として、アプリの数が少ない。
これは結局2つの関数の検索条件が異なることに起因しているようだ。前者は拡張子かクリエータを対象に、後者は Info.plistのLSCopyDefaultRoleHandlerForContentTypeエントリを対象として検索している。
この話題はメーリングリストでも取り上げられていた。
Re: Get a list of all Apps for a File
なるほど。
だったらダミーファイルを GIF/JPEG/PNGの3種類、バンドル内に用意してこれを使って対応アプリを取得することにしよう。
かなり安易だが。。
#ちなみに試しに実在しないファイルを LSCopyApplicationURLsForURL を渡したところ nullが返ってきた。