我正在尝试在 macOS 上以编程方式卸载/弹出 USB 设备。
使用 IOkit 我尝试注册到 IOServiceMatching(kIOUSBInterfaceClassName)
并迭代所有设备,对于每个设备,我尝试获取 BSD 名称并从那里开始:
IORegistryEntrySearchCFProperty(usbDevice,kIOServicePlane,CFSTR(kIOBSDNameKey),kCFAllocatorDefault,kIORegistryIterateRecursively);
但我发现在基于 Intel 的设备上注册表搜索不起作用。
我有供应商 ID、产品 ID 等。
所以我的问题:
- 有其他选择吗?
- 有我可以使用的系统调用吗?
- 也许有不同的方法并且不使用 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/