I'm trying to use an XPC Service for inter-process communication. I've added an XPC service target to my project, and then when I try doing a xpc_connection_send_message
I get EXC_BAD_INSTRUCTION
. As far as I can tell, I am correctly initializing and starting the connection.
serviceConnection = xpc_connection_create("com.foo.bar.MyService", dispatch_get_main_queue());
xpc_connection_set_event_handler(serviceConnection, ^(xpc_object_t event) {
xpc_type_t type = xpc_get_type(event);
if (type == XPC_TYPE_ERROR) {
if (event == XPC_ERROR_CONNECTION_INTERRUPTED) {
// The service has either cancaled itself, crashed, or been
// terminated. The XPC connection is still valid and sending a
// message to it will re-launch the service. If the service is
// state-full, this is the time to initialize the new service.
}
else if (event == XPC_ERROR_CONNECTION_INVALID) {
// The service is invalid. Either the service name supplied to
// xpc_connection_create() is incorrect or we (this process) have
// canceled the service; we can do any cleanup of appliation
// state at this point.
NSLog(@"Uh oh, connection invalid");
xpc_release(serviceConnection);
serviceConnection = nil;
//xpc_release(stack);
//stack = NULL;
}
else {
NSLog(@"Unknown XPC error.");
}
}
});
xpc_connection_resume(serviceConnection);
and then to send the message
xpc_object_t message = xpc_data_create(NULL, 0);
....
xpc_connection_send_message(serviceConnection, message);
Is there anything I'm missing here? Is it somehow failing to find and connect to the service?
message
must be of typeXPC_TYPE_DICTIONARY
, so if I replacexpc_object_t message = xpc_data_create(NULL, 0)
withxpc_object_t message = xpc_dictionary_create(NULL, NULL, 0);
it works! – Schoenman xpc_main
or whatever it usually has "running OS specific help docs". Loads of people overlook these as they rarely change, but things like XPC etc. change regularly :) – Microscope