2016-11-02 3 views
0

У меня есть приложение 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]; 
} 

ответ

0

Я понял, что я делаю неправильно.

Прежде всего, IOServiceAddMatchingNotification для deviceDisconnected должен выглядеть следующим образом:

returnCode = IOServiceAddMatchingNotification(notifyPort, kIOTerminatedNotification, matchingDict, DeviceDisconnected, NULL, &portIterator); 

Во-вторых, функция DeviceDisconnected должна выглядеть следующим образом:

void DeviceDisconnected(void *refCon, io_iterator_t iterator) 
{ 
    kern_return_t returnCode = KERN_FAILURE; 
    io_object_t  usbDevice; 

    while ((usbDevice = ioIteratorNext(iterator))) 
    { 
     returnCode = IOObjectRelease(usbDevice); 

     if (returnCode != kIOReturnSuccess) 
     { 
      NSLog(@"Couldn't release raw device object: %08x.", returnCode); 
     } 
    } 

    [[NSNotificationCenter defaultCenter] postNotificationName:deviceDiconnectedNotification object:nil userInfo:nil]; 
}