I have code to set up notification for USB device add/remove using XCode 4.3.3 on OS X 10.7.4. For a USB device with myVid and myPid, it is pretty boilerplate:
// Global declarations somewhere near the top of the file.
IONotificationPortRef g_notificationPort= NULL;
io_object_t g_notification= 0;
io_iterator_t g_iteratorAdded= 0;
.
.
.
- (BOOL)setupDeviceNotification
{
// Set up matching dictionary.
NSMutableDictionary* matchingDictionary= (NSMutableDictionary*)IOServiceMatching(kIOUSBDeviceClassName);
[matchingDictionary setObject:[NSNumber numberWithLong:myVid] forKey:[NSString stringWithUTF8String:kUSBVendorID]];
[matchingDictionary setObject:[NSNumber numberWithLong:myPid] forKey:[NSString stringWithUTF8String:kUSBProductID]];
// Create a run loop source for the notification object.
g_notificationPort= IONotificationPortCreate(kIOMasterPortDefault);
CFRunLoopSourceRef notificationRunLoopSource= IONotificationPortGetRunLoopSource(g_notificationPort);
CFRunLoopAddSource(CFRunLoopGetCurrent(), notificationRunLoopSource, kCFRunLoopDefaultMode);
// Set up a notification callback for device addition on first match.
kern_return_t kRet= IOServiceAddMatchingNotification(g_notificationPort, kIOFirstMatchNotification, (CFMutableDictionaryRef)matchingDictionary, deviceAddedCallback, (void*)self, &g_iteratorAdded);
// Rudimentary error handling.
if(KERN_SUCCESS != kRet)
{
[matchingDictionary release];
return FALSE;
}
// Arm the notification and check for existing devices.
[self deviceWasAdded:g_iteratorAdded];
return TRUE;
}
This code works well, and when a device is added, I use IOServiceAddInterestNotification using the IONotificationPortRef and store the io_object_t that is set in a global object.
Upon analyzing this code to do a little refactoring (making the globals into object variables in the class), I realized I am never calling IONotificationPortDestroy on my IONotificationPortRef object. Should I call it? Also, I am not doing anything with the io_object_t that is assigned in IOServiceAddInterestNotification - is there any cleanup required there?
OK, one thing I have found after poking around in a lot of Apple documentation is that I should really do an IOObjectRelease on the io_object_t that is the notification. I found a couple of references to it, but the easiest is in the document "User-Mode USB Device Arbitration" on the Apple Developer site.