La risposta di Julien Pilet ha funzionato per me. Tuttavia, per farlo rilanciare non costantemente l'applicazione quando il dispositivo è ancora collegato quando si chiude l'applicazione, ho dovuto:
- chiamata
xpc_set_event_stream_handler()
nella mia app delegato 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);
});
- aggiungi KeepAlive/false key/value pair al plist
- aggiungi
IOMatchLaunchStream/true
coppia chiave/valore al com.apple.device-attach
dict in plist. Questo è in aggiunta alla chiave IOMatchStream
già presente. Non certo perché che deve essere lì, ho trovato un riferimento ad esso qui: http://asciiwwdc.com/2013/sessions/702
Inoltre, non dimenticare di registrare il plist con il sistema utilizzando
launchctl load <path to your plist>
Si noti che questo sembra funzionare , ma non ottengo mai il messaggio NSLog dal gestore del flusso xpc.
assicurati che se segui questa rotta e non vuoi che il tuo processo avviato rimanga in esecuzione (cioè KeepAlive = false) che il tuo codice chiami xpc_set_event_stream_handler() altrimenti troverai la tua app rigenerata ogni 10 secondi in risposta al lo stesso evento di corrispondenza più e più volte. – rudy
Funziona sotto OS X 10.6? Sto ricevendo "la chiave LaunchEvents non riconosciuta". (Vedi http://stackoverflow.com/q/15397304/558639) –
C'è un modo per usarlo con gli script di shell lanciati da 'launchd' invece di un'app Xcode (ad esempio'/percorso/a/programma' è uno script di shell). Lo script della shell viene riavviato ogni 10 secondi e non riesco a trovare una forma alternativa di riga di comando 'xpc_set_event_stream_handler()' o un modo per rimuovere l'evento dallo stream. – romeovs