La respuesta de Julien Pilet funcionó para mí. Sin embargo, para conseguirlo para relanzar no constantemente la aplicación cuando el dispositivo está todavía conectado al cerrar la aplicación, que tenía que:
- llamada
xpc_set_event_stream_handler()
en mi aplicación delegado applicationDidFinishLaunching
:
xpc_set_event_stream_handler("com.apple.iokit.matching", NULL, ^(xpc_object_t event) {
// Every event has the key XPC_EVENT_KEY_NAME set to a string that
// is the name you gave the event in your launchd.plist.
const char *name = xpc_dictionary_get_string(event, XPC_EVENT_KEY_NAME);
// IOKit events have the IORegistryEntryNumber as a payload.
uint64_t id = xpc_dictionary_get_uint64(event, "IOMatchLaunchServiceID");
// Reconstruct the node you were interested in here using the IOKit
// APIs.
NSLog(@"Received event: %s: %llu",name,id);
});
- agregue el par clave/valor KeepAlive/false al plist
- agregue
IOMatchLaunchStream/true
par clave/valor al com.apple.device-attach
dict en el plist. Esto es adicional a la clave IOMatchStream
que ya está allí. No sé por qué eso tiene que estar allí, encontré una referencia a él aquí: http://asciiwwdc.com/2013/sessions/702
Tampoco se olvide de registrar el plist con el sistema usando
launchctl load <path to your plist>
Tenga en cuenta que esto parece funcionar , pero nunca recibo el mensaje NSLog del controlador de flujo xpc.
simplemente asegúrate de que si realizas esta ruta y no quieres que el proceso iniciado se mantenga activo (es decir, KeepAlive = falso) tu código llama a xpc_set_event_stream_handler(); de lo contrario, verás que tu aplicación se reagrupa cada 10 segundos en respuesta a mismo evento coincidente una y otra vez. – rudy
¿Funciona esto bajo OS X 10.6? Obtengo "LaunchEvents clave no reconocida". (Consulte http://stackoverflow.com/q/15397304/558639) –
¿Hay alguna manera de usar esto con los scripts de shell que se inician desde 'launchd' en lugar de con una aplicación Xcode (por ejemplo,'/path/to/program' es un guion de shell). El script de shell se está relanzando cada 10 segundos y no puedo encontrar una alternativa de línea de comandos de 'xpc_set_event_stream_handler()' ni ninguna forma de eliminar el evento de la transmisión. – romeovs