IOCreatePlugInInterfaceForService返回神秘错误

时间:2018-02-16 17:34:26

标签: swift xcode macos usb iokit

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

尝试为usb游戏手柄创建插件接口的代码落在IOCreatePlugInInterfaceForService上,返回非零错误。

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

有没有办法要么:找出构建设置/编译器中的确切差异,看看难以捉摸的差异是什么,或者进入IOCreatePlugInInterfaceForService IOKit方法,看看可能导致错误返回的原因是什么项目但不是另一个?

编辑:这是失败的方法:

- (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始终返回值0.在所有不起作用的版本中,返回值似乎始终为-536870210。此函数中的mHidDevice是设备的io_object_t句柄。

EDIT2:这是设备的IORegistryExplorer页面

Here is the IORegistryExplorer page for the device

3 个答案:

答案 0 :(得分:2)

最后设法解决了这个问题,经过数周的搔痒。新的Xcode 9使用app沙盒基本上可以防止在新应用中访问USB,蓝牙,相机和麦克风等。一旦我将其关闭,它就会恢复到预期的行为。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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