IOCreatePlugInInterfaceForService returns 神秘错误

IOCreatePlugInInterfaceForService returns mysterious error

我正在尝试在新的 Swift 4.0 Mac 应用程序(而不是 iOS)中使用一些旧的 IOKit 功能。我创建了一个桥接 header 以使用现有的 Objective C 第三方框架 DDHidLib,我目前在 Xcode 9.

中工作

尝试为 USB 游戏手柄创建插件接口的代码在 IOCreatePlugInInterfaceForService 上失败,return出现 non-zero 错误。

真正奇怪的是,我有一个在以前版本的 Xcode 中创建的较旧的应用程序,它使用相同的框架并且在新的 Xcode 9 中打开后可以正常工作。这个以前的项目是仍然 Swift 为相同的 Obj-C 框架使用桥接 header。我已经检查了构建设置并尝试使所有内容匹配,但我得到了相同的结果;旧应用程序有效,但任何新应用程序均无效。

有没有办法:找出构建中的确切差异 settings/compilers 以查看难以捉摸的差异,或者进入 IOCreatePlugInInterfaceForService IOKit 方法以查看可能导致错误的原因return在一个项目中被编入但在另一个项目中未被编入?

编辑:这是失败的方法:

- (BOOL) createDeviceInterfaceWithError: (NSError **) error_; {
io_name_t className;
IOCFPlugInInterface ** plugInInterface = NULL;
SInt32 score = 0;
NSError * error = nil;
BOOL result = NO;

mDeviceInterface = NULL;

NSXReturnError(IOObjectGetClass(mHidDevice, className));
if (error)
    goto done;

NSXReturnError(IOCreatePlugInInterfaceForService(mHidDevice, kIOHIDDeviceUserClientTypeID,kIOCFPlugInInterfaceID,&plugInInterface,&score));
if (error)
    goto done;

//Call a method of the intermediate plug-in to create the device interface
NSXReturnError((*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), (LPVOID) &mDeviceInterface));
if (error)
    goto done;

result = YES;

done:
    if (plugInInterface != NULL)
    {
        (*plugInInterface)->Release(plugInInterface);
    }
    if (error_)
        *error_ = error;
    return result;
}

在有效的旧版本中,IOCreatePlugInInterfaceForService 始终 return 值为 0。在所有无效的版本中,return 值似乎始终为 -536870210。此函数中的 mHidDevice 是设备的 io_object_t 句柄。

EDIT2:这是设备的 IORegistryExplorer 页面

如果 IOCreatePlugInInterfaceForService 末尾的循环出于某种原因以 haveOne == false 完成,则看起来会返回 kIOReturnNoResources。也许 Start() 返回 false 因为另一个进程或驱动程序已经具有独占访问权限?我会在 IORegistryExplorer 中检查设备有哪些客户端。

经过几周的摸索,终于设法解决了这个问题。新的 Xcode 9 使用应用程序沙盒基本上阻止在新应用程序中默认访问 USB、蓝牙、相机和麦克风等。一旦我关闭它,它就会恢复到预期的行为。

很高兴最终答案如此简单,但令人失望的是 Xcode 没有提供更具描述性的错误消息或响应,让用户知道他们实际上是在阻止自己访问所需的系统部分.

当应用程序试图访问 MacOS 10.14 及更高版本上的相机或蓝牙时,也会发生此错误。权限应由用户明确授予(弹出 window),或通过安全和隐私。应用程序应检查权限,如 所示。