問題タブ [xpc]
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.
objective-c - XPC または MACH を介して OSX でサービスを起動するように話しかける
サードパーティの開発者が XPC または Mach を介して起動エージェントやデーモンと対話する方法があるかどうか疑問に思っていました。私の理解では、サードパーティは XPC の辞書形式を知っているか、Mach の .defs ファイルにアクセスできる必要があります。これらのいずれかは、プリインストールされている起動サービスで利用できますか? そうでない場合、コードを介してサービスと対話する他の方法はありますか?
ipc - XPC が XPC サービスのプロセスを作成しない
XPC サービスを作成しようとしていますが、サービスが作成されていないようです。サービスのメイン メソッドで最初に行うことは、サービスが実行を開始するかどうかを確認できるように、syslog を呼び出すことです。これらのログ メッセージがログに表示されることはありません。
すべてのバンドル識別子、実行可能ファイル名、およびバンドル階層を確認しましたが、まだサービスが作成されていないようです。アプリケーションで、メッセージを作成して XPC サービス接続経由で送信した直後に、イベント ハンドラーが XPC_ERROR_CONNECTION_INVALID エラーで呼び出されます。C ベースの XPC API を使用しています。
少なくとも XPC サービスが確実に作成されるようにするために他にできることはありますか?
launchd - Launchd で起動された特権ヘルパーを終了する
私のアプリ (Cocoa) には、 Nathan de Vries によるSMJobBlessXPC サンプル コードSMJobBless
をモデルにした、 を使用してインストールされる特権ヘルパー ツール (C) が含まれています。エクスポートされた Mach XPC 接続への接続試行で正常に起動します。ここまでは順調ですね。
私が理解できないのは、後でそのプロセスを終了する方法です。私のアプリケーションが終了すると、ヘルパー ツールはもはやビジネスを実行していません。しかし、私はそれを終了する方法を一生理解できません。
XPC イベントのハンドラーからの呼び出しexit(0)
は効果がないようです。おそらく、プロセスではなく現在のスレッドexit
を終了するドキュメントの状態が原因です。私の関数は次のようになります。main
戻らないことはわかっdispatch_main
ているので、それと関係がある可能性がありますが、プロセスを正常に終了させる方法がいくつかあるはずです。を使用するように切り替える必要がありCFRunLoop
ますか?
結果として、プロセスが途中で終了しないようにするにはどうすればよいですか? ヘルパー ツールまたはメイン アプリのいずれかが、終了する適切なタイミングを正確に認識します。ジョブが開始されると、終了するまで実行し続けますか? 私はlaunchdのライフサイクル管理について少し曖昧であり、(私が見つけることができる) launchd.plist(5)
.
objective-c - 同じ XPC サービス (NSXPCConnection) の複数のインスタンスの実行
NSXPCConnection
Foundation.framework (など)にある XPC API を使用して、同じ XPC サービスの複数のインスタンスを実行することはできますか? ドキュメントは、この問題について多くの洞察を提供していません。
編集:簡単なテストを行ったところ、2 つの XPC 接続を作成したにもかかわらず、サービスのインスタンスが 1 つしか実行されていないようです。別のインスタンスを実行させる方法はありますか?
objective-c - nSXPCConnectionを介してxpc_object_tを渡します
XPCサービスプログラミングは初めてで、XPCサービスで作成されたIOSurfaceをホストアプリケーションと共有しようとしています。NSXPCConnection APIを使用して単純なホストとサービスをセットアップできます。次に、IOSurfaceをホストに渡すために次の2つのメソッド( IOSurfaceAPI.hにあります)を使用することになっていると思います。
NSXPCConnection APIを使用してxpc_object_tを渡す方法はありますか、またはC API(xpc.hで定義されている)を使用する必要がありますか?
objective-c - NSXPCConnection と xpc C API を混在させる
ラッパーを使用して XPC サービスを操作していNSXPCConnection
ますが、Objective-C ラッパーはIOSurfaceRef
オブジェクトを処理できないため、xpc.h で定義された C API への直接関数呼び出しを行いたいと考えています。しかし、基になる参照を取得する方法が見つかりませんxpc_connection_t
(NSXPCConnection.h で確認できるように、必要な参照になる可能性のあるプライベート ivar が呼び出され_xconnection
ています)。それとも、Objective-C ラッパーと C API を単純に一緒に使用できないのでしょうか?
macos - XPC は MAS にサンドボックス化を必要としますか?
サンドボックス化されたアプリがあります。
このアプリには、サンドボックス化されていない XPC サービスがあります。
Mac App Store に提出できるようにするには、XPC サービスもサンドボックス化する必要がありますか?
xcode - フレームワークの単一のコピーを複数のバンドルと共有する
アプリケーションで使用されているフレームワークに加えて、アプリケーションバンドル内に含まれているいくつかのXPCサービスがあります。すべてのバンドルを、アプリケーションのFrameworksフォルダー内に含まれるフレームワークの単一のコピーにリンクするにはどうすればよいですか(フレームワークをすべてのバンドルにコピーするのではありません)?すべてのサービスとアプリケーションはサンドボックス化されているため、XPCサービスがサンドボックスの外部にあるため、メインのアプリバンドルのフレームワークにアクセスできるかどうかはわかりません。
objective-c - NSXPCConnection はプロキシによってオブジェクトを渡します
Daemons and Services Programming Guidesは、応答ブロック パラメーターとしても、開いている XPC 接続を介してプロキシ オブジェクトを返すことが可能であると述べています。
プロキシによるオブジェクトの受け渡し
ほとんどの場合、オブジェクトをコピーして接続の反対側に送信することは理にかなっています。ただし、これは常に望ましいとは限りません。特に:
クライアント アプリケーションとヘルパーの間でデータの 1 つのインスタンスを共有する必要がある場合は、オブジェクトをプロキシで渡す必要があります。オブジェクトがアプリケーション内の他のオブジェクトのメソッドを呼び出す必要があり、そのメソッドを接続を介して渡すことができない、または渡したくない場合 (ユーザー インターフェイス オブジェクトなど)、プロキシによってオブジェクトを渡す必要があります。可能)、またはその目的のために特別に作成したリレー オブジェクト。プロキシによるオブジェクトの受け渡しの欠点は、パフォーマンスが大幅に低下することです (オブジェクトへのすべてのアクセスでプロセス間通信が必要になるため)。このため、オブジェクトをコピーして渡すことができない場合にのみ、オブジェクトをプロキシで渡す必要があります。
初期接続の remoteObjectInterface プロパティを構成した方法と同様に、追加のプロキシ オブジェクトを構成できます。まず、プロキシによってメソッドに渡す必要があるパラメータを特定し、次にそのオブジェクトのインターフェイスを定義する NSXPCInterface オブジェクトを指定します。
最初の質問は、プロキシによって渡されるオブジェクトをどのように定義する必要があるかということです。NSXPCProxyCreatingプロトコルに準拠したオブジェクトとして? remoteObjectProxy と remoteObjectProxyWithErrorHandler: メソッドを実装する必要がありますか?
以下に例を示しますが、それは私にはまったくわかりません。特に、パラメーターをプロキシとしてホワイトリストに登録するには、NSXPCInterface メソッド (setInterface:forSelector:argumentIndex:ofReply:) をどこで呼び出す必要があるかわかりません: XPC サービス コードまたはホストで?
メソッドの最初のパラメーターはパラメーター 0 で、その後にパラメーター 1 が続きます。
この場合、このコードはメソッド自体のパラメーターの 1 つのホワイトリストを変更しているため、ofReply パラメーターに値 NO が渡されます。メソッドの応答ブロックのパラメーターのクラスをホワイトリストに登録する場合は、代わりに YES を渡します。
質問は、XPC メソッド呼び出しのブロック応答でオブジェクトをプロキシとして返す方法について、明確なチュートリアルを提供してくれる人はいますか?