Câu trả lời của Julien Pilet có hiệu quả đối với tôi. Tuy nhiên, để làm cho nó không ngừng relaunch ứng dụng khi thiết bị vẫn còn kết nối khi đóng ứng dụng, tôi phải:
- gọi
xpc_set_event_stream_handler()
trong ứng dụng của tôi đại biểu 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);
});
- thêm cặp khóa/giá trị KeepAlive/false vào plist
- thêm
IOMatchLaunchStream/true
cặp khóa/giá trị vào số com.apple.device-attach
dict trong plist. Đây là ngoài khóa IOMatchStream
đã có. Bạn không chắc chắn lý do tại sao mà đã có mặt ở đó, tôi thấy một tham chiếu đến nó ở đây: http://asciiwwdc.com/2013/sessions/702
Cũng đừng quên đăng ký plist với hệ thống sử dụng
launchctl load <path to your plist>
Lưu ý rằng điều này dường như làm việc , nhưng tôi chưa bao giờ nhận được thông điệp NSLog từ trình xử lý luồng xpc.
chỉ cần đảm bảo rằng nếu bạn đi tuyến đường này và không muốn quá trình khởi chạy của bạn tiếp tục chạy (tức là KeepAlive = false) mã của bạn gọi xpc_set_event_stream_handler() nếu không bạn sẽ thấy ứng dụng của mình được respawned cứ sau 10 giây để phản hồi cùng một sự kiện trùng khớp lặp đi lặp lại. – rudy
Tính năng này có hoạt động dưới OS X 10.6 không? Tôi nhận được "LaunchEvents chính không được công nhận". (Xem http://stackoverflow.com/q/15397304/558639) –
Có cách nào để sử dụng điều này với các kịch bản shell được khởi chạy từ 'launchd' thay vì một ứng dụng Xcode (ví dụ:'/path/to/program' là một kịch bản lệnh shell). Kịch bản lệnh shell sẽ được khởi chạy lại sau mỗi 10 giây và tôi không thể tìm thấy biểu mẫu thay thế dòng lệnh 'xpc_set_event_stream_handler()' hoặc bất kỳ cách nào để xóa sự kiện khỏi luồng. – romeovs