我一直在尝试在添加或删除特定 USB 设备时收到通知。我已阅读“从应用程序访问硬件”文档并有一个基本的演示应用程序,主要基于该文档中提供的代码。
它在第一次添加或删除设备时工作,但之后我的回调永远不会被调用。我不明白为什么?谁能发现我哪里出错了?
(xcode 项目,如果你想测试) http://monkeyfood.com/testIOKitNOtificaiton.zip
谢谢。
//
// AppDelegate.m
// testIOKitNotification
//
// Created by Diggory Laycock on 23/07/2012.
// Copyright (c) 2012 MonkeyFood.com. All rights reserved.
//
#import "AppDelegate.h"
@implementation AppDelegate
// Arduino USB info
#define matchVendorID 0x2341
#define matchProductID 0x0043
#pragma mark -
#pragma mark C Callback functions
#pragma mark -
void usbDeviceAppeared(void *refCon, io_iterator_t iterator){
NSLog(@"Matching USB device appeared");
}
void usbDeviceDisappeared(void *refCon, io_iterator_t iterator){
NSLog(@"Matching USB device disappeared");
}
@synthesize window = _window;
#pragma …Run Code Online (Sandbox Code Playgroud) 我正在快速做一个MAC应用程序,我能够在NSView上预览相机现在我想改变亮度/对比度/白平衡和所有相机相关的设置.
我正在使用AVFoundation框架预览相机,我有滑块来更改值,如何更改所有这些设置与用户值.
这个AVFondations如何与IOKit链接..我发现一个UVCCamera控件链接改变手动相机控制,我可以使用这种格式???
在另一个网站我发现了
'IOKit - 与内核和硬件通信的低级框架.Apple建议不要直接使用这个框架,并将其从AppStore中拒绝.
谢谢
最近遇到这个问题很头疼,我已经在这个问题上花了一个星期,但还是失败了。希望你能帮我把这块石头踢开,非常感谢。
我的问题:我们公司为iPhone生产USB存储设备,实际上这个存储设备中有一个SDCard。现在,我们要开发一个 Mac 应用程序来更新此存储设备的固件。但每次我的存储设备连接到Mac时,苹果会自动安装它,我总是失败,kIOReturnExclusiveAccess调用时USBInterfaceOpen。
我也尝试写一个无代码的kext来增加探测分数,但它仍然不起作用。我不知道是我走错了路,还是在编写无代码 kext 时出现了一些错误,例如,写了一些错误的 IOClass、错误的包 ID。
我的无代码 kext info.plist 是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>14E46</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleIdentifier</key>
<string>com.mophie.MyDriverTest3</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MyDriverTest3</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.3</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>6E35b</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>14D125</string>
<key>DTSDKName</key>
<string>macosx10.10</string>
<key>DTXcode</key>
<string>0640</string>
<key>DTXcodeBuild</key>
<string>6E35b</string>
<key>IOKitPersonalities</key>
<dict>
<key>MyDriverTest3</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.iokit.IOUSBFamily</string>
<key>IOClass</key>
<string>IOService</string>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>bcdDevice</key>
<string>256</string>
<key>idProduct</key>
<integer>4369</integer>
<key>idVendor</key>
<integer>6631</integer>
</dict>
</dict> …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来验证 macOS 应用程序,以允许该应用程序将用户的 Mac 从睡眠状态唤醒。
我知道我可以使用与此处提供的代码类似的代码来安排电源事件以唤醒计算机。
当我运行IOPMSchedulePowerEvent代码时,下面代码中“result”的值为(IOReturn) result = -536870207。
IOReturn result = IOPMSchedulePowerEvent(CFBridgingRetain(someCFDate), NULL, CFSTR(kIOPMAutoWake));
Run Code Online (Sandbox Code Playgroud)
在进行了一些挖掘并在此论坛帖子上找到了有类似问题的人之后,我非常有信心我的问题的根源在于需要对应用程序进行身份验证以允许它从睡眠中唤醒用户的 Mac。我发现了一些本地认证的苹果文档的位置,但它似乎仍然没有完全解决我的问题。
因此,简而言之,我如何为应用程序提供从睡眠中唤醒 Mac 所需的身份验证?
编辑:我一直在研究这个问题,我认为我一直在取得良好的进展。
首先,我得到它的原因是kIOReturnNotPrivileged你必须在 Xcode 中以 root 身份运行应用程序。这可以通过通过 Product > Scheme > Edit Scheme 编辑调试方案并将“Debug Process as”选项更改为“Root”来实现。
将应用程序设置为以 root 身份运行,我能够正确安排电源事件以使我的机器进入睡眠状态并在规定的时间唤醒它。
如果您的应用程序被沙盒化并以 root 身份运行,那么 Xcode 8.3 中似乎还会出现一些其他问题。我将创建另一个帖子来问这个问题。
我想知道是否有任何方法可以检测 macOS 系统上是否正在使用麦克风。
我想以编程方式实现这一目标。代码片段或一些开始参考将不胜感激
我已经阅读过有关 CoreAudio 的内容,该 API 是否足够,或者我应该更深入地了解并从 IOKit 开始?
提前致谢
我正在维护一个用于访问 USB 设备的库,该库将自身注册为 HID 设备,并使 Mac 应用程序能够执行各种漂亮的操作(GPIO、I2C 等)。该库可以在这里找到:
https://github.com/codemercs-com/io-warrior-mac
由于我将项目升级到 MacOS 10.13 SDK,IOServiceGetMatchingServices() 在从回调调用时返回 nil 迭代器对象DeviceAdded,但不返回错误代码。
我的假设是,自从我在 2002 年左右最初编写这个库以来,IOKit 中的某些内容已经发生了根本性的变化。
我正在注册我的“设备插入”回调,如下所示:
result = IOServiceAddMatchingNotification(gNotifyPort,
kIOFirstMatchNotification, matchingDict,
IOWarriorAdded, NULL, &gIOWarriorAddedIter);
Run Code Online (Sandbox Code Playgroud)
当插入受支持的设备时,确实会调用此回调,但是当我随后调用 IOServiceGetMatchingServices 时,迭代器为零,或者,当其他设备已连接时,仅包含这些设备,而不包含新插入的设备。
io_iterator_t IOWarriorFindHIDDevices ()
{
CFMutableDictionaryRef hidMatchDictionary = IOWarriorSetUpHIDMatchingDictionary ();
// Set up matching dictionary to search the I/O Registry for HID devices we are interested in. Dictionary reference is NULL if error.
if (NULL == hidMatchDictionary) {
PrintErrMsg ("Couldn't create a matching dictionary.");
return 0; …Run Code Online (Sandbox Code Playgroud) 编辑: 在做出一些重要的新发现并且这个问题还没有任何答案之后,我对这个问题进行了大量编辑。
从历史上看/AFAIK,在关闭显示模式下保持 Mac 唤醒并且不满足Apple 的要求,只有使用内核扩展(kext) 或以 root 身份运行的命令才有可能。然而,最近我发现必须有另一种方式。我真的可以使用一些帮助来弄清楚如何在(100% 免费,无 IAP)沙盒 Mac App Store (MAS) 兼容应用程序中使用它。
我已经确认其他一些 MAS 应用程序能够执行此操作,并且看起来它们可能正在写入YES名为clamshellSleepDisabled. 或者可能还有其他一些技巧导致键值设置为 YES?我在IOPMrootDomain.cpp 中找到了这个函数:
void IOPMrootDomain::setDisableClamShellSleep( bool val )
{
if (gIOPMWorkLoop->inGate() == false) {
gIOPMWorkLoop->runAction(
OSMemberFunctionCast(IOWorkLoop::Action, this, &IOPMrootDomain::setDisableClamShellSleep),
(OSObject *)this,
(void *)val);
return;
}
else {
DLOG("setDisableClamShellSleep(%x)\n", (uint32_t) val);
if ( clamshellSleepDisabled != val )
{
clamshellSleepDisabled = val;
// If clamshellSleepDisabled is reset to 0, reevaluate if
// …Run Code Online (Sandbox Code Playgroud) 我正在将无代码 KEXT 迁移到无代码 DEXT。我观看了 WWDC 视频并阅读了 Apple 开发者网站上的大量信息。我遇到的困难不是找到要做什么,而是找到如何开始。带有示例项目的不错的教程会有所帮助。
在我的无代码 KEXT 中,对于 4 个独立的设备,每个设备都有 IOUSBDevice 和 IOUSBInterface 的 IOKitPersonalities。KEXT 允许我将我的设备与我的“驱动程序”相匹配,这样 Apple HID 驱动程序就不会抓住它们。我希望在无代码 DEXT 中做相同或类似的事情。
到目前为止,我已经在应用程序中创建了一个名为 MyUsbDriver 的 DriverKit 目标(用于 DriverKit.framework),并添加了 USBDriverKit.framework。这会向我的项目添加一个文件夹 MyUsbDriver,其中包含文件 MyUsbDriver.cpp、MyUsbDriver.iig、Info.plist 和 MyUsbDriver.entitlements。这是我的问题:
看起来 IOService 的默认子类适用于 USB - 这与 KEXT 中的 IOClass 相同。真的吗?
DEXT 世界中的 IOUSBHostInterface 是否等同于 KEXT 世界中的 IOUSBInterface?
IOUSBHostDevice 是否等同于 IOUSBDevice?
对于无代码 DEXT,我需要对 .cpp 或 .iig 执行任何操作吗?我的大部分工作不是要在 plist 和 entitlements 文件中完成吗?
我的 MyUsbDriver 目标的框架和库中是否需要 USBDriverKit.framework?
我在哪里可以找到如何完成此迁移的合适示例?
任何帮助将不胜感激。
更新:
使用答案中的示例和其他链接,我能够得到一些东西。我确实有一个“Doh”时刻:我最初的测试项目类型是命令行工具,但我永远无法嵌入 DEXT。我几乎只是手工编辑了 pbxproj 文件。然而,在查看 Scott Knight 的原始示例 USBApp …
我知道如何将数据发送到 DriverKit 并返回一些值,即应用程序调用和驱动程序从应用程序IOConnectCallStructMethod()填充。OSDatastructureOutput
在我的应用程序中,它使用IOConnectCallAsyncScalarMethod()kext 来sendAsyncResult64()让应用程序知道传入的事件。但是,该方法sendAsyncResult64()在 DriverKit 中不可用。
我看到AsyncCompletion看起来像解决方案,但不知道如何实现它。有人知道该怎么办吗?感谢任何建议!
我是 Apple DriverKit SDK 的新手,我不清楚如何注册我的设备驱动程序,以便它可以作为操作系统中的相机使用。我是否必须在 IOService 的 Start 函数中注册流函数?我在互联网上搜索答案,但找不到。
我需要从自定义 USB 摄像头读取数据,然后通过自定义驱动程序使其可用。
你们有人能帮我吗?
iokit ×10
macos ×8
driverkit ×3
cocoa ×2
kernel ×2
avfoundation ×1
camera ×1
core-audio ×1
core-media ×1
driver ×1
microphone ×1
objective-c ×1
swift ×1
usb ×1