В коде, который работал, по крайней мере, совсем недавно, как в macOS 10.13, IOHIDManagerCopyDevices
возвращает NULL, когда он должен найти устройство в macOS 10.14.6.
IOHIDManagerRef mgr = IOHIDManagerCreate( NULL, kIOHIDManagerOptionNone );
if (mgr != NULL)
{
IOHIDManagerOpen( mgr, kIOHIDManagerOptionNone );
IOHIDManagerSetDeviceMatchingMultiple( mgr, (CFArrayRef) @[
@{ @(kIOHIDDeviceUsagePageKey): @(kHIDPage_GenericDesktop),
@(kIOHIDDeviceUsageKey): @(kHIDUsage_GD_Joystick)
},
@{ @(kIOHIDDeviceUsagePageKey): @(kHIDPage_GenericDesktop),
@(kIOHIDDeviceUsageKey): @(kHIDUsage_GD_GamePad)
}
] );
CFSetRef deviceSet = IOHIDManagerCopyDevices( mgr );
NSLog(@"Device set %@", deviceSet);
}
Не знаюдумаю, что IOHIDManagerOpen
вызов должен быть необходим, но я пробовал его и без него. Информация о системе показывает игровую панель под шиной USB 2.0. Проблема возникает, когда я не использую изолированную программную среду, поэтому я не думаю, что это проблема с правами, как в Как получить список устройств HID в приложении Swift / Cocoa? . Но я попытался включить песочницу и проверить право USB, и это не помогло.
Если вместо показанного IOHIDManagerSetDeviceMatchingMultiple
вызова я вызываю IOHIDManagerSetDeviceMatching
с пустым словарем, то получаюнабор из полдюжины устройств, но не тот, который я ищу.
После еще нескольких испытаний похоже, что код работает в Catalina, но не в Mojave, с точно таким же оборудованием,Так что, возможно, это ошибка Apple.