The NSXPCConnection API
NSPXCConnection API はFoundation frameworkの一部であり、NSPXCConnection.hに記述されている。このファイルは次のような構成になっている
- NSXPCConnection--2つのプロセス間で相互通信を表現するクラス。アプリケーションおよびヘルパーサービスは双方で少なくともひとつのコネクションオブジェクトを持つ
- NSXPCInterface--コネクションに対して想定されるプログラマブルな処理を記述するクラス(どのクラスでコネクションを使って情報を送信するか、どのオブジェクトをむき出しにしておくか、など)
- NSXPCListener--XPC受け入れのためのリスナークラス。ヘリパーは必ず一つはこのリスナーを持っていなくてはならない。またリスナーはデリゲートとしてNSXPCListenerDelegateプロトコルをアサインする
- NSXPCListenerEndPoint--一意に決まったNSXPCListenerインスタンスに対してNSXPCConnectionによるリモートプロセスを送るためのクラス。これにより、プロセスはダイレクト通信チャネルを互いには見えないプロセス間に確立することができる。
The XPC Services API
CベースのXPCサービスAPIは主に2つのパーツで構成されている:
- xpc.h -- プロパティリストオブジェクトの作成と操作そして、デーモンがメッセージを返信するためのAPI群
このAPIはlibSystemレベルに位置するため、Core Foundationに依存することができない。また、すべてのCFタイプがプロセスバウンダリをまたいで共有できるわけではない。XPCはファイルディスクリプタのようなストレージフォーマットに則ってデザインされているのでCFPropertyListでは処理できないようなコネクションタイプをサポートしている。XPCはIPCフォーマットにしたがって設計されている。
これらの理由により、XPC APIは実践的にプロセス間通信を行うプリミティブに対してのみサポートしている自身のコンテナを使用している。
いくつかの複雑な型はXPCを使って通信することもできるが、それらはxpc.hには登場しない。たとえば、IOSurfaceCreateXPCObjectとIOSurfaceLookupFromXPCObject関数ではIOSurfaceオブジェクトをXPCサービスを投げ合うことで通信することができる。
- connection.h -- XPCにつなぐためのAPI群。
コネクションはvirtual endpointである。つまりサービスバイナリのインスタンスが実行されていてもいなくても関係がない。このサービスバイナリは都度ローンチされる。
コネクションはXPCメッセージの一部を送ることもできる。ゆえに、XPCサービス間でコネクションを投げる事もできる。
Creating the Service
XPCサービスはメインバンドル内のContents/XPCServiceディレクトリ内に位置するバンドルである。このXPCサービスバンドルはひとつのinfo.plistファイルと、実行バイナリ、サービスに必要なすべてのリソースを含む。
XCodeでXPCサービスを作るには次のようにする。
- XPCサービステンプレートを使ってプロジェクトに新しいターゲットを加える
- Copy Files phase をアプリケーションのビルドセッティングに加える。XPCサービスのバイナリ(例えば、com.example.foo-service.xpc)をCopy Files phase[ Wrapper][Contents/XPCServices]に加える
ここで間違えてた。。。示されたとおりにして、Product->Attach Processで自作のXPCが見つかった。デバッグもできるようになったので、これにて一旦全訳終了。
プロトコル設計あたりでまた戻ってきそうだけど、とりあえず。。。
[おまけ]
Attach Processで見つからない場合の対処、もしくはXPCが起動しているか確認する方法
$ sudo launchctl list | grep [作ったXPCのサービス名]
で確認する。
ちょっとくらいは緩いのかと思ってたんだけど、XPCにしても、XPC自身のSandbox(App相当)を求められて、審査に通らない。。。う~~~ん、Appleに直接聞いたら藪蛇になりそうだし、この問題はちょっと放置。
返信削除