問題タブ [launch-services]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - ドキュメントベースのアプリケーションの [開く] パネルで任意のタイプを許可する
どんなタイプでも開くことができるドキュメントベースの Mac アプリケーションを書いています。私のアプリケーションは、Dock タイルにドロップされた任意のタイプのファイルを正常に受信しますが、[ファイル] メニューから [開く] を選択すると、すべてのファイルがグレー表示されます。
これは、テンプレートに付属する標準の Open アイテムです。後ろに特別なことはしていません。
これが私の Info.plist の関連部分です。
カスタム ドキュメント コントローラがあります。これがその実装です。
Dock タイルにファイルをドロップしない限り、これらのメソッドは呼び出されません。
macos - 登録された URL スキームによって OS X アプリが起動された場合、どのようにして完全な URL にアクセスしますか?
私は、次のように Info.plist ファイルに登録されているカスタム スキームを持つ URL を使用して起動/アクティブ化される Cocoa アプリに取り組んでいます。
私の質問は、アプリが起動またはアクティブ化されたら、アプリを起動した URL をどのように確認すればよいですか? iOS では、NSURL インスタンスが渡されるため、UIApplicationDelegate の -application:openURL:sourceApplication:annotation: メソッドを使用すると簡単です。
myscheme://do/something/awesomeのような URL を使用してアプリにデータを渡すことができるようにしたい
macos - Finder の右クリック メニューを特殊なデータ タイプのファイルで非表示に設定するにはどうすればよいですか?
OS X (10.7.3) 用のサービスを作成しました。そして、次のように info.plist で構成しました。
また、Finder ではすべての「ファイルとフォルダー」(public.item) に対して表示されますが、特殊なデータ型 (*.txt、*.rar など) の一部のファイルに対しては非表示にしたいと考えています。
それを達成するためにinfo.plistを構成する方法はありますか?
objective-c - Launch Services から URL スキーム ハンドラを削除する
URLスキームを動的に生成して登録するCocoa Macアプリを開発しています。ただし、アプリケーションが新しく生成された URL スキーム (myscheme1423:// など) を処理するためにそれ自体を登録する場合、アプリケーションが以前に登録された URL スキームに応答しないようにしたいと考えています。
LSSetDefaultHandlerForURLScheme()
URL スキームを登録する目的で使用しています。同時に、アプリケーションは Info.plist を自動的に上書きして、新しいスキームを含めます。ご存じのとおり、このLSSetDefaultHandlerForURLScheme()
関数は、指定された bundleID/scheme を Launch Services データベースに追加します。ただし、同じ bundleID/scheme ペアをデータベースから削除する同等の Launch Services 関数が見つかりませんでした。
アプリがアクティブに登録されている URL スキーム以外の URL スキームから発生した外部イベントを単純に無視できることはわかっていますが、以前のシステムの知識を完全に一掃する簡単な方法があるはずだと感じています。図式。私のアプリケーションが数百回以上新しいスキームに登録するプロセスを経ると、大量の無意味な部分によってディスク上でかなりの量のスペース (少なくとも Plist の場合) が占有されるポイントが来ます。のデータ (つまり、古い Launch Services エントリ)。
macos - OSXにインストールされているすべてのアプリケーションを列挙する
基本的な問題
(Mac)OS Xシステムにインストールされているすべてのアプリケーション、つまりLaunchServicesに登録されているすべてのアプリケーションバンドルを列挙するソリューションを探しています。
うまくいかなかった単純なアプローチ
(注意:lsregister
の下にあります/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister
)。
現在、の出力を使用していますlsregister -dump | grep -E '^.*[ \\t]*path:[ \\t]+(\/.*)$' | grep -Eo '\/.*'
が、いくつかの問題があります。
.app
改行(UNIXで有効)を含むバンドル\n
は正しく処理されません(この問題は、適切なパーサーを作成することで修正できます)lsregister
奇妙なファイル名を正しく処理しません(たとえば、RTLマークを含む)。lsregister
名前にRTLマークが含まれているファイルを無視しているようです。必要に応じて、次のコマンドを実行して、名前にRTLが含まれるファイルを作成できます。これを行った後、それを明らかにし
lsregister -dump | grep ThisIsAWeird
ません。ただし、テキストファイルを右クリックして[プログラムから開く]に移動すると、LaunchServicesとFinderがそのファイルを引き続きサポートします。
LaunchServicesは任意のフォルダー内のアプリケーションバンドルを認識しており、これらのアプリも必要なため、他のディレクトリ内のすべてのファイルを単純に列挙する/Applications
ことはできません。
私が働かなかった他のアプローチ
どうやら、_LSFindApplications
私がする必要があることを正確に実行するというプライベートAPI関数がありますが、それを機能させることができず、インターネット上に非公式のドキュメントが見つかりませんでした。(それが存在することの証明nm /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/LaunchServices | grep __LSFindApplications$
:)
更新:system_profilerメソッドも機能していないようです
今まで私は@Anoopによって提案された方法が機能しますが、今日はまだより多くのバイナリsystem_profiler
を取得することがわかりました。lsregister
一部またはすべてのマシンで欠落しているものもありsystem_profiler
ますが、OS Xの別のインストールで外部ボリュームをマウントした場合にのみ欠落しているようです。私のマシンの1つでの出力に欠落しているsystem_profiler
(ただし存在している)もののリストを次に示します。lsregister
macos - ログイン時に Launch Services によって開始されたアプリまたはユーザーによって開始されたアプリを区別する方法はありますか?
Cocoa アプリは LSSharedFileList
、 のログイン項目のリストに自分自身を追加できます。これにより、ユーザーがログインしたときにアプリケーションを開始できるようになります。ただし、ユーザーがアプリケーションを開始したか、ログイン時にアプリを自動開始したかを確認する方法はありますか? あるケースではユーザー インターフェイスを別のケースで表示でき、UI を非表示にしてアプリをメニューバー アプリとしてバックグラウンドで実行できるため、これは便利です。
macos - 従来の Mac アプリと最新の Mac アプリが共存していると、バンドルされたドキュメントを最新のアプリにグローバルに関連付けることができません (Launch Services?)
2013 年 4 月 9 日更新これは以前の質問を完全に再投稿したものです。Launch Services、UTI、および廃止された作成者コードについて多くのことを学んだので、最初から質問したほうがよいと感じています。
問題の説明:
レガシー Mac 9.xx 用に設計されたアプリケーションがありますが、これはまだ Snow Leopard (Rosetta を使用) で実行されます。このアプリケーションはバンドルされたファイルを使用します。Snow Leopard 以降向けの新しいアプリを開発しました。問題は、現在使用している plist 構成に基づいて、Launch Services が新しいアプリを適切に関連付けないことです。何が間違っているのかを知る必要があります。
バンドルされたドキュメントを右クリックして GetInfo を選択すると、バンドルされたファイルをレガシー アプリまたは新しいアプリに関連付けることができ、期待どおりに機能します。これは、Snow Leopard がまだこの種の関連付けに Creator Code テクノロジを使用しているためだと思います。ファイル自体を古いレガシー アプリに関連付けるように指示し、[すべて変更] を押すと、Launch Services はそのタイプのすべてのファイルを正しく関連付け、期待どおりに動作します。ファイル自体を新しいアプリに関連付けるように指示し、[すべて変更] を選択すると、アプリは開きますが、ファイルは開きません。私が知る限り、起動サービスは動的 UTI をアプリに割り当てており、ファイルがクリックされたときに、OS は使用するアプリを認識していません。
Apple が新しい UTI 方法論でいくつかの設計ミスを犯した可能性があることを示唆しているように見える投稿をいくつか見つけました。ここの 1 つの投稿では、新しいアプリ pList の ExportedUTIs ディクショナリに文字列ファイル拡張子の配列を追加する方法を示しています。これにより、アプリは正しく機能しますが、問題は解決しません。ユーザーがファイルに任意の名前を付けることを許可すると、ファイル拡張子がどうなるかを配列で予測できなくなります。UTI コード、または OSType コードを機能させる方法で厳密に正しく動作するには、Launch Services が必要です。
新しいアプリが関連ファイルを開くことができないと判断したら、LanchServices.plist を開き、エントリを削除して、lsregister データベースを再起動する必要があります。次に、新しいアプリでファイルをもう一度開くことができます(「すべて変更」を押さずに関連付けることにより)。
アプリの plists 、バンドルされたドキュメントの plist 、および Launch Services エントリにいくつかの画像を添付しています。
どんな助けと私たちの指導も大歓迎です。
マイク
更新日: 2013 年 4 月 16 日
私が提供した UTI に関する投稿へのリンクには、RCDefault アプリと呼ばれるオープン ソース ソフトウェア アプリへのリンクも含まれています。このアプリは、UTI の選択、ファイル拡張子、OSType コード、およびファイルの種類に基づいて、APP を特定のファイルに関連付けます。奇妙なことに、このアプリは、plist で提供される UTI の構造に基づいて、ファイルをアプリに関連付けることができます。
これはすべて、この特定のシナリオでの Snow Leopard の起動サービスの単なるバグであり、Apple はこの時点でそれを無視することを選択した可能性はありますか (Snow をサポートしなくなったことを考慮して)?
objective-c - アプリケーションが実行されていない場合、GURL Apple イベントに応答する
カスタム登録済み URL プロトコルからの「GURL」(URL の取得) Apple イベントに応答するアプリケーションがあります。適切に登録されており、アプリケーションがすでに実行されている場合は正常に動作しますが、アプリケーションがまだ実行されていない場合は、アプリケーションを開始するだけで、API が示すように URL に応答しません。
外部ソースから開始されたプロセスに Xcode をすぐにアタッチする方法がよくわからないので、アプリケーションが URL を示す引数で開始されているかどうかわかりませんか? そうでない場合、アプリケーションが開始されるたびに GURL アップル イベントからアプリケーションが開始されたことを確認する方法はありますか?
次の方法でハンドラーを初期化しています。
c++ - アプリケーションが MAC OS X にインストールされているかどうかを確認する別の方法は?
Launch Services関数 LSFindApplicationForInfo() を使用して、アプリケーションがインストールされているかどうかを確認しています。
これは、ユーザーがアプリケーションをごみ箱に送信した場合を除いて、正常に機能します。このメソッドはまだごみ箱でそれを見つけますが、呼び出すことはできません。
アプリケーションが /Applications にインストールされているかどうかを確認する別の方法はありますか? または、LSFindApplicationForInfo() を呼び出すときに /Applications の下のみを参照するように指定できますか?
ios - Mac OS フレームワーク ヘッダー ファイル MachineExceptions.h エラー: 宣言は何も宣言していません
バックグラウンド
私はLSGetApplicationForURL
API を使用しようとしていますが、ここで非常に役立つ例を見つけました - How to get default mail client version on mac os x?
ただし、コードをコンパイルしようとすると、次のエラーが発生します。
/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/MachineExceptions.h:53: エラー: 宣言は何も宣言していません
53 行目あたりで MachineExceptions を開くと、ここで の宣言がいくつか見られます。unsignedwide
これは、 で定義されている型ですMacTypes.h
。これが Carbon Core フレームワークの一部であることがわかりました。
手始めに、コードには最上位のヘッダーのみを含めています (実際には、上記の例にあるサンプル コードをそのまま使用しています)。MachineException.h
そのため、他のヘッダー ファイルを含めたり、触れたりしていません。ただし、明らかに、最終的にこのエラーにつながるいくつかの依存関係があるようです。
私が試した/調査したことのいくつか:
- Carbon Core が 10.8 (私が使用しているバージョン) で非推奨になっていることがわかりました- https://developer.apple.com/library/mac/#releasenotes/General/CarbonCoreDeprecations/
その結果、
MacTypes.h
Carbon Coreフレームワークはかなり貧弱で、条件付きMacTypes.h
で /usr/include/ から含まれていました - 上記の「非推奨」ページの情報に従って、(Carbon Core フレームワークで) および MachineExceptions.h を編集
MacTypes.h
して、/usr/include から MacTypes を含めようとしました。 - ヘッダー ファイルをインクルードする順序を変更しました (私がこれを調査している間、他の人のために働いていました)。
- Makefile に CoreFoundation および ApplicationServices フレームワークを含めています (「-framework」オプションを使用)。
この問題を解決するために何時間も費やしてきたので、この問題に関するフィードバックは大歓迎です。ここにあるものが基本的/基本的なものである場合は、事前にお詫び申し上げます。私は Mac OS プログラミングに非常に慣れておらず、フレームワークがどのように配線されているか、またそれらを使用する方法を理解しようとしています。
ありがとう!