दोनों ब्रायन और डैनियल महान सुराग है कि मुझे सही जवाब खोजने में सहायता मिली है, लेकिन सामान उन्होंने सुझाव दिया बस थोड़ा सा था। यहां बताया गया है कि मैंने समस्या को हल करने का अंत कैसे किया।
ब्रायन बजाय सीरियल नंबर के लिए एक की एक प्रक्रिया आईडी के लिए एक एप्पल घटना वर्णनकर्ता प्राप्त करने के लिए कोड के बारे में सही था:
// 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];
समस्या यह है कि अगर आपको लगता है कि वर्णनकर्ता से -int32Value
ले, एक 0 का मान वापस कर दिया जाता है (यानी कोई प्रक्रिया आईडी नहीं।) मुझे नहीं पता कि ऐसा क्यों होता है: सिद्धांत रूप में, pid_t
और SInt32
दोनों पूर्णांक पर हस्ताक्षर किए गए हैं।
इसके बजाय, आप बाइट मूल्यों (जो थोड़ा endian जमा हो जाती है) और उन्हें एक प्रक्रिया आईडी में कास्ट करने की जरूरत है:
pid_t pid = *(pid_t *)[[pidDescriptor data] bytes];
उस बिंदु से, यह चल रहा है प्रक्रिया के बारे में जानकारी पाने के लिए सीधा है:
NSRunningApplication *runningApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:pid];
NSString *bundleIdentifer = [runningApplication bundleIdentifier];
इसके अलावा, keySenderPIDAttr
का उपयोग करने का डैनियल के सुझाव कई मामलों में काम नहीं करेगा। हमारी नई सैंडबॉक्स वाली दुनिया में, वहां संग्रहीत मूल्य /usr/libexec/lsboxd
के लिए प्रक्रिया आईडी होने की संभावना है, जिसे लॉन्च सर्विसेज सैंडबॉक्स डिमन के रूप में भी जाना जाता है, न कि ईवेंट की उत्पत्ति वाले ऐप की प्रक्रिया आईडी।
इस समाधान के लिए ब्रायन और डैनियल को धन्यवाद के लिए धन्यवाद!
वैकल्पिक रूप से आप प्रेषक को देखे बिना इसे पीआईडी पर प्राप्त करने के लिए keySenderPIDAttr का उपयोग कर सकते हैं और इसे समन्वयित कर सकते हैं: [[event विशेषताDescriptorForKeyword: keySenderPIDAttr] int32Value] – danielpunkass