私はNSDistributedNotifications
を使用して、これを1つのアプリで、さらに10.7でも処理することができます。これは損失の可能性があるため、ハンドシェイクを行う必要があります(つまり、ack
の通知とタイムアウトが発生した場合の再送信が含まれます)。このアプローチの副作用は、複数のクライアントが稼動している場合(特に高速ユーザー切り替えの場合)、すべてのクライアントが通知を受信することです。このアプリの特別なケースでは良いことだ。また、実装が非常に簡単です。
別のアプリでは、2つのFIFOを使用します。サーバーは一方に書き込み、他方から読み取ります。クライアントは反対のことを行います。もちろん、同じことを達成するためにネットワークソケットを使用することもできます。私はFIFOを好む傾向があります。なぜなら、ネットワークソケットをロックダウンする必要はないからです。
つまり、launchd下で分散オブジェクトを使用してどのような問題が発生していますか?あなたは10.7の問題を見ていますか(これはlaunchdコンテキストの周りのルールを変更しました)?
ポートにアクセスしたときにlaunchdを使用してデーモンを遅延ロードする(これが通常の方法です)。あなたはlaunchdaemonの代わりにlaunchagentを使うことを考えましたか?
EDIT:
ああ...ブートストラップサーバ。はい。彼らと話すためには、正しいブートストラップコンテキストで物事を実行する必要があります。ログインセッションのブートストラップコンテキストは、windowserver
プロセスに根ざしています。 LaunchDaemonsは異なるコンテキストで実行されるため、ログインセッションと直接通信することはできません。いくつかの背景読み:私はlaunchctl bsexec
を使用せずに、正しいコンテキストにプロセスを取得するためにとにかくを認識していないです
。 Launchdには技術的にAPIがありますが(launchctlはAPIを使用しています)、十分に文書化されていません。 opensource.apple.comからsourceを引き出すことができます。
あなたがNSDistributedObject
のままであっても、可能ならばブートストラップサービス以外のものを使用しようとします。私が言及したように、私は他のツールを使い、NSDistributedObject
を避ける傾向があります。私の意見では、RESTがSOAPより優れているのと同じ理由で、単純なプロトコルが通常リモートオブジェクトよりも優れています。 (YMMV)
分散オブジェクトでは、[NSMachBootstrapServer sharedInstance]に接続を登録していました。しかし、私のアプリケーションとデーモンのためにこの関数から返されたオブジェクトは異なっていました。デーモンを起動するためにsudoだけを使用するまではうまくいきましたが、sudo launchctlでの作業は停止しました。あなたは何かを提案できますか? –