Ответ Жюльена Пилета сработал для меня. Однако, чтобы заставить его не перезапускать приложение постоянно, когда устройство все еще подключено при закрытии приложения, мне пришлось:
- вызов
xpc_set_event_stream_handler()
в моем приложении делегата 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);
});
- добавление пары KeepAlive / false key / value к списку
- добавьте пару
IOMatchLaunchStream/true
ключ / значение к com.apple.device-attach
в списке. Это в дополнение к клавише IOMatchStream
, которая уже есть. Не уверен, почему это должно быть там, я нашел ссылку на это здесь: http://asciiwwdc.com/2013/sessions/702
Также не забудьте зарегистрировать plist в системе, используя
launchctl load <path to your plist>
Обратите внимание, что это похоже на работу, но я никогда не получаю сообщение NSLog от обработчика потока xpc.