У меня есть приложение Cocoa, которое необходимо уведомлять, когда устройство подключено или отключено от USB-порта. Я могу заставить обратный вызов DeviceConnected работать, но функция DeviceDisconnected не вызывается при отключении USB-устройства.Auto-detect USB Device Connect/Disconnect
Ниже мой код:
+ (void)listenForUSBEvents
{
io_iterator_t portIterator = 0;
CFMutableDictionaryRef matchingDict = IOServiceMatching(kIOUSBDeviceClassName);
IONotificationPortRef notifyPort = IONotificationPortCreate(kIOMasterPortDefault);
CFRunLoopSourceRef runLoopSource = IONotificationPortGetRunLoopSource(notifyPort);
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode);
CFRetain(matchingDict);
kern_return_t returnCode = IOServiceAddMatchingNotification(notifyPort, kIOMatchedNotification, matchingDict, DeviceConnected, NULL, &portIterator);
if (returnCode == 0)
{
DeviceConnected(nil, portIterator);
}
returnCode = IOServiceAddMatchingNotification(notifyPort, kIOMatchedNotification, matchingDict, DeviceDisconnected, NULL, &portIterator);
if (returnCode == 0)
{
DeviceDisconnected(nil, portIterator);
}
}
@end
void DeviceConnected(void *refCon, io_iterator_t iterator)
{
kern_return_t returnCode = KERN_FAILURE;
io_object_t usbDevice;
while ((usbDevice = IOIteratorNext(iterator)))
{
io_name_t name;
returnCode = IORegistryEntryGetName(usbDevice, name);
if (returnCode != KERN_SUCCESS)
{
return;
}
[[NSNotificationCenter defaultCenter] postNotificationName:deviceConnectedNotification object:nil userInfo:nil];
}
}
void DeviceDisconnected(void *refCon, io_iterator_t iterator)
{
[[NSNotificationCenter defaultCenter] postNotificationName:deviceDiconnectedNotification object:nil userInfo:nil];
}