Mac OS X 10.7以降をターゲットにしている場合は、IPCにMachサービス接続を使用してXPCを使用できます。
サーバーでMachサービスを作成し、新しい接続を受け入れるイベントハンドラーを設定して、接続を再開します。
xpc_connection_t conn = xpc_connection_create_mach_service( "com.yourname.product.service", dispatch_get_main_queue(), XPC_CONNECTION_MACH_SERVICE_LISTENER );
xpc_connection_set_event_handler( conn, ^( xpc_object_t client ) {
xpc_connection_set_event_handler( client, ^(xpc_object_t object) {
NSLog( @"received message: %s", xpc_copy_description( object ) );
xpc_object_t reply = xpc_dictionary_create_reply( object );
xpc_dictionary_set_string( reply, "reply", "Back from the service" );
xpc_connection_t remote = xpc_dictionary_get_remote_connection( object );
xpc_connection_send_message( remote, reply );
} );
xpc_connection_resume( client );
}) ;
xpc_connection_resume( conn );
これは、イベントループのあるCocoaアプリで実行されていると思います。イベントループがない場合は、実行中のイベントループがあることを確認する必要があります(NSRunloop
、、dispatch_main()
...)
クライアントでは、フラグなしでMachサービス接続を作成しXPC_CONNECTION_MACH_SERVICE_LISTENER
、イベントハンドラーを設定して、再開します。その後、サーバーにメッセージを送信して、その回答を受け取ることができます。
xpc_connection_t conn = xpc_connection_create_mach_service( "com.yourname.product.service", NULL, 0 );
xpc_connection_set_event_handler( conn, ^(xpc_object_t object) {
NSLog( @"client received event: %s", xpc_copy_description( object ) );
});
xpc_connection_resume( conn );
xpc_object_t message = xpc_dictionary_create( NULL, NULL, 0 );
xpc_dictionary_set_string( message, "message", "hello world" );
xpc_connection_send_message_with_reply( conn, message, dispatch_get_main_queue(), ^(xpc_object_t object) {
NSLog( @"received reply from service: %s", xpc_copy_description( object ));
});
dispatch_main();
これが機能するためには、クライアント(おそらくあなたの場合はコマンドラインツール)もこれが機能するためにイベントループを実行する必要があることに注意してください。私の例では、それはdispatch_main()
です。これは最初は不便に思えるかもしれませんが、それは必要であり、それだけの価値があります。
また、私のサンプルコードは、本当に必要なすべてのエラー処理を見逃していることに注意してください。
XPC APIはプレーンCであるため、C、C ++、Objective-Cから使用できます。ブロックをサポートするコンパイラを使用するだけで済みます。