2014-06-24 13 views
6

Tôi có một số AppleEventDescriptor nơi tôi cần nhận mã nhận dạng gói của ứng dụng gửi. Sự kiện Apple chứa typeProcessSerialNumber có thể bị ép buộc thành ProcessSerialNumber.Lấy NSRunningApplication bằng cách sử dụng ProcessSerialNumber

Vấn đề là GetProcessPID() được tán thành trong 10,9, và có vẻ như không bị xử phạt cách để có được một pid_t có thể được sử dụng để nhanh chóng một NSRunningApplication sử dụng -runningApplicationWithProcessIdentifier:.

Tất cả các tùy chọn khác mà tôi đã tìm thấy tất cả đều hoạt động trong Processes.h và cũng không còn được dùng nữa.

Tôi có thiếu điều gì đó hoặc tôi có phải sống với cảnh báo không dùng nữa này không?

Trả lời

6

Cả Brian và Daniel cung cấp manh mối tuyệt vời mà đã giúp tôi tìm ra câu trả lời đúng, nhưng những thứ mà họ đề nghị chỉ là một chút. Đây là cách tôi giải quyết vấn đề.

Brian đã đúng về mã để có được một mô tả của Apple tổ chức sự kiện cho một id quá trình thay vì một cho số serial:

// 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]; 

Vấn đề là nếu bạn dành -int32Value từ mô tả rằng, một giá trị của 0 được trả về (tức là không có id tiến trình.) Tôi không biết tại sao điều này xảy ra: theo lý thuyết, cả hai số pid_tSInt32 là các số nguyên đã ký.

Thay vào đó, bạn cần phải nhận được các giá trị byte (được lưu trữ little endian) và quăng vào một quá trình id:

pid_t pid = *(pid_t *)[[pidDescriptor data] bytes]; 

Từ thời điểm đó, nó đơn giản để có được thông tin về các tiến trình đang chạy:

NSRunningApplication *runningApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:pid]; 
NSString *bundleIdentifer = [runningApplication bundleIdentifier]; 

Ngoài ra, đề xuất của Daniel về sử dụng keySenderPIDAttr sẽ không hoạt động trong nhiều trường hợp. Trong thế giới sandboxed mới của chúng tôi, giá trị được lưu trữ ở đó có thể là id quá trình cho /usr/libexec/lsboxd, còn được gọi là trình khởi chạy hộp cát Launch Services, không phải là id quá trình của ứng dụng khởi tạo sự kiện.

Cảm ơn Brian và Daniel vì đã giúp giải pháp này!

3

Bạn có thể sử dụng của Apple mô tả sự kiện cưỡng chế để dịch các bộ mô tả ProcessSerialNumber thành một mô tả pid_t như vậy:

NSAppleEventDescriptor* processSerialDescriptor = [myEvent attributeDescriptorForKeyword:keyAddressAttr]; 
NSAppleEventDescriptor* pidDescriptor = [processSerialDescriptor coerceToDescriptorType:typeKernelProcessID]; 
pid_t pid = [pidDescriptor int32Value]; 
+2

Hoặc bạn có thể sử dụng keySenderPIDAttr để nhận ngay tại PID mà không cần tra cứu người gửi và nén nó: [[event attributeDescriptorForKeyword: keySenderPIDAttr] int32Value] – danielpunkass

Các vấn đề liên quan