Sia Brian e Daniel fornito ottimi indizi che mi ha aiutato a trovare la risposta giusta, ma la roba hanno suggerito era solo un po 'fuori. Ecco come ho finito per risolvere il problema.
Brian era corretta per il codice per ottenere un descrittore di Apple Event per un ID di processo, invece di quello per il numero di serie:
// get the process id for the application that sent the current Apple Event
NSAppleEventDescriptor *appleEventDescriptor = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
NSAppleEventDescriptor* processSerialDescriptor = [appleEventDescriptor attributeDescriptorForKeyword:keyAddressAttr];
NSAppleEventDescriptor* pidDescriptor = [processSerialDescriptor coerceToDescriptorType:typeKernelProcessID];
Il problema è che se si prende il -int32Value
da quel descrittore, un viene restituito il valore 0 (ovvero nessun ID di processo). Non ho idea del perché questo accada: in teoria, sia pid_t
sia SInt32
sono interi con segno.
Invece, è necessario per ottenere i valori di byte (che vengono memorizzati little endian) e gettarli in un ID di processo:
pid_t pid = *(pid_t *)[[pidDescriptor data] bytes];
Da quel punto, è semplice per ottenere le informazioni relative al processo in esecuzione:
NSRunningApplication *runningApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
NSString *bundleIdentifer = [runningApplication bundleIdentifier];
Inoltre, il suggerimento di Daniel di utilizzare keySenderPIDAttr
non funziona in molti casi. Nel nostro nuovo mondo sandbox, il valore memorizzato è probabilmente l'id di processo per /usr/libexec/lsboxd
, noto anche come il daemon della sandbox di Servizi di avvio, non l'ID di processo dell'app che ha originato l'evento.
Grazie ancora a Brian e Daniel per l'aiuto che ha portato a questa soluzione!
In alternativa, è possibile utilizzare keySenderPIDAttr per ottenere il diritto al PID senza cercare il mittente e forzarlo: [[event attributeDescriptorForKeyword: keySenderPIDAttr] int32Value] – danielpunkass