objective-c - 如何以编程方式在 macOS 上查找挂载/弹出 USB 设备?

标签 objective-c macos usb iokit block-device

我正在尝试在 macOS 上以编程方式卸载/弹出 USB 设备。 使用 IOkit 我尝试注册到 IOServiceMatching(kIOUSBInterfaceClassName)并迭代所有设备,对于每个设备,我尝试获取 BSD 名称并从那里开始:

IORegistryEntrySearchCFProperty(usbDevice,kIOServicePlane,CFSTR(kIOBSDNameKey),kCFAllocatorDefault,kIORegistryIterateRecursively); 

但我发现在基于 Intel 的设备上注册表搜索不起作用。

我有供应商 ID、产品 ID 等。

所以我的问题:

  1. 有其他选择吗?
  2. 有我可以使用的系统调用吗?
  3. 也许有不同的方法并且不使用 IoKit?

谢谢

我尝试使用 Iokit 注册: IOServiceMatching(kIOUSBHostDeviceClassName)IOServiceMatching(kIOUSBInterfaceClassName);IOServiceMatching(kIOUSBDeviceClassName);

最佳答案

首先,USB本身并没有“弹出”的概念。挂载、卸载、弹出等都是存储设备/卷概念,而USB大容量存储设备只是您可以执行这些操作的存储设备的一种类型。

因此,您需要查看磁盘仲裁框架,特别是 DADiskEject function用于弹出。 I/O Kit 和磁盘仲裁对象之间存在一定的映射,但并非所有 DADisk 对象都一定有相应的 I/O Kit 对象,因为它们也存在于 APFS 快照卷、网络挂载等中. 如果通过 I/O Kit 查找设备是自然的(例如,因为您对特定供应商+产品 ID 对感兴趣),那么您可以轻松找到 IOMedia 对象对应的 DADisk 使用DADiskCreateFromIOMedia .

要在 I/O Kit 注册表中搜索 USB 设备,use one of the documented matching dictionary formats .

例如,类似:

            @{
                @kIOProviderClassKey: @kIOUSBHostDeviceClassName,
                @kUSBVendorID : @1234,
                @kUSBProductID: @5678,
            }

关于objective-c - 如何以编程方式在 macOS 上查找挂载/弹出 USB 设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74589867/

相关文章:

ios - 在 iPhone objective-c 上的 AVPlayer 中添加字幕

objective-c - 循环遍历 NSMutableDictionary

ios - 应用程序在发布版本中崩溃但在调试中不崩溃

objective-c - OS X 上的推送 View 动画

objective-c - 使应用程序适用于 ios 3.0

ios - 从另一台 Mac 在 iDevices 上测试应用程序

swift - 将 CGDisplayStream 与队列一起使用

c++ - C/C++ USB 驱动器事件

ios - 将触摸事件从 Mac OSX 应用程序发送到 USB 连接的 iPhone

linux - 在树莓派中禁用以太网