Почему IOHIDManagerCopyDevices возвращает значение NULL? - PullRequest
0 голосов
/ 15 октября 2019

В коде, который работал, по крайней мере, совсем недавно, как в 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.

...