3

これが私のコードで、最初にアプリケーションを実行するとデバイスが検出されますが、実行後に新しいデバイスは検出されません。

//Just for testing
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
   [self detectUSB];
}

void detectUSB()
{
  //dictionary
  CFMutableDictionaryRef matchingDict = matchingDict = IOServiceMatching(kIOUSBDeviceClassName);

  //create notification
  IONotificationPortRef notificationObject; //notification object to listen
  mach_port_t masterPort = 0; //received from IOMasterPort
  notificationObject = IONotificationPortCreate(masterPort);

  //create run loop
  CFRunLoopSourceRef notificationRunLoopSource;

  //use notification obejct received from notificationPortCreate
  notificationRunLoopSource = IONotificationPortGetRunLoopSource(notificationObject);

  CFRunLoopAddSource(CFRunLoopGetCurrent(), notificationRunLoopSource, kCFRunLoopDefaultMode);

  IOServiceAddMatchingNotification(notificationObject,kIOFirstMatchNotification, matchingDict,isAttached,(__bridge void*)self,&iter );

  isAttached(NULL, iter);
}

void isAttached(void *refcon, io_iterator_t iterator) {

    io_service_t usbDevice;
    while((usbDevice = IOIteratorNext(iterator))) {
         io_name_t name; 
         IORegistryEntryGetName(usbDevice, name);
         printf("\tName:\t\t%s\n", (char *)name);

         CFNumberRef idProduct = (CFNumberRef)IORegistryEntrySearchCFProperty(usbDevice, kIOServicePlane, CFSTR("idProduct"), kCFAllocatorDefault, 0);
         uint16_t PID;
         CFNumberGetValue(idProduct, kCFNumberSInt16Type, (void *)&PID);
         printf("\tidProduct:\t0x%x\n", PID);

         IOObjectRelease(usbDevice);
         CFRelease(idProduct);
      }
   IOObjectRelease(iterator);
 }

さらに、USB ドライブの 1 つを抜いた場合、それをどのように検出すればよいですか? もう1つ追加しようかな

  IOServiceAddMatchingNotification(notificationObject,kIOFirstMatchNotification, matchingDict,isDetached,(__bridge void*)self,&iter );

isAttached関数の後?実際に追加したのですが、不正なアクセスエラーが発生します。これらの問題を処理する方法を教えていただけますか?ありがとう!!

4

1 に答える 1