如果您的目标是 Mac OS X 10.7 和更高版本,您可以使用 XPC 为您的 IPC 使用 Mach 服务连接。
在您的服务器上创建 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()
, ...)
在您的客户端中,您还可以创建一个不带XPC_CONNECTION_MACH_SERVICE_LISTENER
标志的 Mach 服务连接,设置一个事件处理程序,然后恢复它。之后,您可以将消息发送到您的服务器并接收它的答案:
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。您只需要使用支持块的编译器。