7

特定のバンドル識別子を持つすべてのアプリを(ファイルシステムで)見つける良い方法を知っている人はいますか?NSWorkspaceおよびLaunchServicesを使用すると、バンドルIDでアプリを検索できますが、返される結果は1つだけです。Spotlight(NSMetadataQuery)が役立つかもしれないと思いますが、そのAPIについては少し不明なので、適切なキーがあるかどうかはわかりません。

コマンドラインlsregisterツール(LaunchServices.framework内)があり、システムにすべてを(再)登録してから、認識しているすべてのレポートをダンプするように指示できます。それは文書化されておらず、その出力を解析するのは苦痛かもしれないので、それに依存することは理想的とは言えないようです。

(背景:私はゲーム改造用のアプリを構築しており、ユーザーがオープンパネルでファイルシステム全体を掘り下げるのではなく、サポートされているゲームの短いリストからすばやく選択するためのUIを提供したいと考えています。ユーザーがゲームの複数のコピーをインストールしている可能性があります:リリースとベータ、改造用の追加コピーなど)

4

3 に答える 3

8

kMDItemCFBundleIdentifierSpotlight/metadata キーが必要です。

pierre$39> mdfind "kMDItemCFBundleIdentifier == 'org.videolan.vlc'"
/Applications/VLC.app
/Applications/vlc-0.8.6c/VLC.app

そこから、ファイル メタデータ APIへの正しい呼び出しを行うだけです(Poison、Carbon、または Cocoa を選択してください)。興味深いことに、このキーは十分に文書化されていません。MDItem Referenceにはありますが、 File Metadata Attributes Referenceにはありません。

繰り返しになりますが、ゲームのモッディング ツールがユース ケースを発生させる他の種類のアプリはほとんどなく、Apple によって十分に提供されない場合があることを示しています … </soapbox>

補遺: リストを取得したら、それをユーザーに提示する最善の方法は、kMDItemVersion見つけた各アイテムのバージョン ( ) をリストすることです。パスを表示することもできますが、バージョンはユーザーにとって最も有用なものになる可能性があります (結局のところ、ユーザーは特定のバージョンを取得するためにさまざまなインスタンスを保持する可能性があります)。

于 2012-04-08T14:52:08.147 に答える
4

この質問は、2012 年に OS X Lion 10.7 に関して行われました。OS X Yosemite 10.10 の時点での答えは次のとおりです。

LSCopyApplicationURLsForBundleIdentifier

概要:

バンドル識別子 (com.apple.finder など) を指定して、対応するアプリケーションへのすべての URL を見つけます。

討論:

指定されたバンドル ID を持つアプリケーションに 0 個以上の URL を返します。

于 2016-05-11T04:31:14.687 に答える
1

もう 1 つの方法は、LSCopyApplicationURLsForURL を使用して、特定の URL スキームを処理するすべてのアプリケーションのすべてのコピーを見つけることです。ただし、これにはアプリケーションで URL スキームを定義する必要があります。

たとえば、システム上に同じアプリの複数のバージョンがある場合でも、「mailto」スキームを処理するすべての電子メール アプリケーションを見つけることができます。

これは、システムが他の呼び出しで返された「デフォルト」または「優先」アプリケーションと見なすものではなく、すべてのアプリケーションを取得する唯一の方法です。

于 2014-03-19T02:12:27.227 に答える