問題タブ [nsxpcconnection]
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 サービス (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 を単純に一緒に使用できないのでしょうか?
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 メソッド呼び出しのブロック応答でオブジェクトをプロキシとして返す方法について、明確なチュートリアルを提供してくれる人はいますか?
objective-c - XPC を使用したマルチ ユーザー コア データ
こんにちは、
これは私の最初の投稿です。これがどこかに回答されている場合は、ご容赦ください (検索しました)。
問題: システム上の複数のユーザー アカウント間で 1 つの Core Data データベースを共有する必要がある Cocoa アプリがあります。
アイデア: ユーザーからの要求を処理するデーモンを作成して (ユーザー特権の境界を越えるため)、Core Data からデータを保存/取得します。アプリケーションで使用される共有管理オブジェクト コンテキストを作成し、その MOC を NSXPCConnection を介してデーモンに渡します。デーモンには、完全に実現された Core Data Stack があります。次に、アプリで作成された MOC を、デーモンによって作成された MOC の子として設定できます。保存を押して完了ですか?
質問: これでも機能しますか? これは単なるばかげた考えですか?他の解決策は何ですか?NSManagedObjectContext は NSCoder プロトコルに準拠していますが、XPC で使用するには、サブクラス化して NSSecureCoding プロトコルに準拠させる必要がありますか? また、ManagedObject サブクラスが NSXPConnection で使用する NSSecureCoder プロトコルに準拠していることを確認する必要がありますか? コンテキストをすべて捨てて、管理対象オブジェクトを送信するだけでよいと思います。
NSXPCConnection がポインターを使用する代わりにオブジェクトをコピーすると仮定していますか? これは正しいです?また、オブジェクトは完全に実現されたオブジェクトとしてコード化/デコードされ、障害が発生しないため、おそらくパフォーマンスを念頭に置く必要があります。これは正しいです?
よろしくお願いいたします。
objective-c - XPC経由で任意の構造体を渡す方法はありますか?
Cocoa アプリがデータベース サーバーと通信できるようにしたいと考えています。アプリのサンドボックス設計の原則に従って、DB 通信を XPC サービスに分割することは理にかなっています。
XPC サービスはステートレスであると想定されているため、接続情報 ( MySQL 接続ハンドルなど) を含む構造体をメイン アプリで保持し、必要に応じて XPC サービスに渡す必要があります。ただし、ハンドルは不透明なタイプであり、XPC サービスではサポートされていないようです。基本的な算術/ロジック/コレクション タイプのみが許可されています。
XPC サービスに渡すことができるように、接続ハンドル (または他の不透明な型) をボックス化する方法はありますか?
objective-c - launchd がプロセスを強制終了するときに、XPC 割り込みハンドラーが呼び出されますか?
interruptionHandler
状態ブロックのドキュメントNSXPCConnection
:
リモート プロセスが終了またはクラッシュした場合に呼び出される割り込みハンドラ。
ただし、Daemons and Services Programming Guideには次のように記載されています。
XPC サービスは、launchd によって管理されます。launchd は、必要に応じて起動し、クラッシュした場合は再起動し、アイドル状態の場合は (SIGKILL を送信して) 終了します。これは、応答を必要とするメッセージの処理中にサービスがクラッシュした場合を除き、サービスを使用するアプリケーションに対して透過的です。その場合、launchd によってサービスが再起動されるまで、アプリケーションは XPC 接続が無効になったことを確認できます。
アイドル状態であるために XPC プロセスが強制終了された場合、 でコールバックを取得できますinterruptionHandler
か? または、メッセージの処理中にアプリがクラッシュした場合にのみコールバックを取得しますか? このテスト ケースはシミュレートできないように思われるので質問します。残念ながら、XPC サービスのライフサイクルは非常にブラック ボックスです。
macos - XPC を使用して Cocoa WebView レンダリングを並列化する
私の Cocoa アプリは、生成された Web ページの多数のバッチを同時にレンダリングする必要があります。WebKit WebView のレンダリングはメイン スレッドに制限されているため、GCD を使用してアプリケーションのプロセス内でこれを行うことはできません。そのため、ある種のプロセス間ソリューションの使用を検討しています。
NSXPCConnection
サンドボックスとうまく連携し、使用する必要があるすべての Core Foundation タイプを透過的にプロキシするため、当然の選択です。ただし、サービスごとに単一のプロセスしか作成しないようです。これにより、メインスレッドの制限が別のプロセスに移動され、複数のレンダリング要求を並列化できなくなります。xpc_connection_create
おそらく C API (など)を使用して、同じサービスに対して複数のプロセスをフォークするように XPC システムを説得する方法はありますか?
この時点で、XPCServices
名前の異なる多数の同一のバンドルを作成し、並列レンダリング要求の特定のバッチでアイドル状態になっているバンドルに接続することを検討していますが、それはばかげているようです。
macos - XPC ヘルパー アプリからメイン アプリケーションにメッセージを送信する方法は?
XPC サービスを作成し、メイン アプリケーションからメッセージを送信して XPC サービスと通信することに成功しました。しかし、私が知りたいのは、XPC サービスからメイン アプリケーションへの通信を開始できるかどうかです。Appleのドキュメントによると、XPC は双方向です。誰かが例を挙げて正しい方向に向けることができれば幸いです。
ご注意ください、
- XPC をメイン アプリケーションから起動したい。
- メインアプリケーションから XPC と通信します。
- イベントが発生すると、XPC はメイン アプリケーションにメッセージを送信する必要があります。
最初の 2 つは成功しましたが、3 番目のリソースは見つかりませんでした。
ありがとう。:)