Necesito escribir un servicio Mach con el que puedan hablar tanto mi aplicación como un complemento del sistema, uso la API de NSMachPort para crear un nuevo puerto y luego lo registro con NSMachBootstrapServer :
- (void) run { NSMachPort *serverPort = (NSMachPort *)[NSMachPort port]; [serverPort setDelegate:self]; [serverPort scheduleInRunLoop:NSRunLoop.currentRunLoop forMode:NSDefaultRunLoopMode]; [NSMachBootstrapServer.sharedInstance registerPort:serverPort name:@"com.example.MyApp"]; [NSRunLoop.currentRunLoop run]; } Clang se queja de que NSMachBootstrapServer ha quedado obsoleto:
warning: 'NSMachBootstrapServer' is deprecated: first deprecated in macOS 10.13 - Use NSXPCConnection instead ¿Cómo se usa NSXPCConnection para reemplazar la funcionalidad de NSMachBootstrapServer al escribir un servicio mach que no es XPC?
Eso es cierto: la clase NSMachBootstrapServer y la mayoría de sus clases complementarias están obsoletas en macOS 10.13 High Sierra.
En macOS 10.14 Mojave y superior, debe usar una API
NSXPCConnection, esa es la parte del móduloFoundation. Se describe en el archivo de encabezadoNSXPCConnection.h. Por el momento consta de las cuatro clases principales:
Así es como se ve un proceso de conexión XPC:
Y como puede ver en una imagen, debe implementar un oyente.
Así es como se vería un fragmento de código Swift con un oyente:
let listener = NSXPCListener(machServiceName: "Name-of-Sample.Helper") listener.delegate = delegate listener.resume() RunLoop.current.run()Así es como se vería un fragmento de código Obj-C con un oyente:
self.listener = [[NSXPCListener alloc] initWithMachServiceName:@"Name-of-Sample.Helper"]; self.listener.delegate = self; [self.listener resume]; [[NSRunLoop currentRunLoop] run];Si observa esta publicación , descubrirá cómo implementar correctamente todos los objetos necesarios de XPC Connection .
y...
Si observa esta publicación , también descubrirá cómo se puede usar con un servicio Mach (hay un enlace de GitHub) .