Macos 连接特定类型的USB设备时,是否在Mac OS X上执行应用程序?
我需要实现一个MacOSX应用程序。在我的应用程序中,我需要做两件事:Macos 连接特定类型的USB设备时,是否在Mac OS X上执行应用程序?,macos,usb,Macos,Usb,我需要实现一个MacOSX应用程序。在我的应用程序中,我需要做两件事: 当特定类型的USB设备连接到系统时,执行/打开应用程序 从USB读取数据并将其上载到web服务器 我在Mac OS X开发方面没有太多经验。是否有人可以推荐实现我目标的最佳文档?取决于您可以通过iPhoto/Image Capture首选项将应用程序设置为自动打开的设备类型。这只适用于有限类别的设备,适用于计算机上已经存在的应用程序,并且需要手动更改计算机上的首选项 一般来说,无法在CD/DVD/USB insert上自动运
我在Mac OS X开发方面没有太多经验。是否有人可以推荐实现我目标的最佳文档?取决于您可以通过iPhoto/Image Capture首选项将应用程序设置为自动打开的设备类型。这只适用于有限类别的设备,适用于计算机上已经存在的应用程序,并且需要手动更改计算机上的首选项
一般来说,无法在CD/DVD/USB insert上自动运行任意应用程序,因为这是一个安全问题。您可以设置文件夹操作以在装载时运行命令。这将假定设备始终装载在同一位置,即/Volumes/My\device/-如果在装载之间添加或删除了外围设备,装载点可能会发生变化。右键单击目录并单击“文件夹操作设置”,可以了解有关文件夹操作的更多信息。诀窍是确保设备始终安装在同一位置 或者,您可以使用在mount上运行命令。也许会有帮助。是一个伟大的应用程序来编辑守护进程
无论哪种方式,您都可以使用文件夹操作或守护进程调用一个简单的脚本来获取设备的内容,并将其上传到您喜欢的任何地方 这实际上取决于您正在查看的应用程序类型 看起来确实没有办法以与之类似的方式来做 以乌代夫为例 两种可能的解决办法是:
- 为您的设备编写自定义包装驱动程序
- 使用并让守护进程等待特定设备
这也是跨平台的,因为libusb支持很多平台。您可以使用launchd。试一试人工发射和人工发射 launchd似乎可以处理USB事件,尽管该功能的文档很少。 我发现它在: 这里有一个例子。如果将以下内容放入:
~/Library/LaunchAgents/com.example.plist
,则程序应在连接USB设备时启动
标签
com.example.program
程序参数
/路径/到/程序
发射口
com.apple.iokit.matching
com.apple.device-attach
idProduct
1234
idVendor
1337
IOProviderClass
电子设备
IOMatchLaunchStream
朱利安·皮莱的回答对我很有用。但是,为了让它在关闭应用程序时,在设备仍然连接的情况下不经常重新启动应用程序,我必须:
- 在我的应用程序委托中调用
xpc\u set\u event\u stream\u handler()
:applicationdFinishLaunching
xpc\u set\u event\u stream\u处理程序(“com.apple.iokit.matching”,NULL,^(xpc\u object\u t event){
//每个事件都将key XPC\u event\u key\u NAME设置为
//是您在launchd.plist中为事件指定的名称。
const char*name=xpc\u dictionary\u get\u string(事件,xpc\u事件\u键\u名称);
//IOKit事件将IORegistryEntryNumber作为有效负载。
uint64\u t id=xpc\u dictionary\u get\u uint64(事件,“IOMatchLaunchServiceID”);
//使用IOKit重建您感兴趣的节点
//API。
NSLog(@“接收到的事件:%s:%llu”,名称,id);
});
- 将KeepAlive/false键/值对添加到plist
- 将
键/值对添加到plist中的IOMatchLaunchStream/true
dict。这是对已有的com.apple.device attach
键的补充。我不知道为什么会在那里,我在这里找到了它的参考:IOMatchStream
launchctl load <path to your plist>
launchctl加载
请注意,这似乎是可行的,但我从未从xpc流处理程序中获得NSLog消息。只要确保如果您按照此路线运行,并且不希望启动的进程保持运行(即KeepAlive=false),那么代码将调用xpc\u set\u event\u stream\u handler()否则,你会发现你的应用程序每10秒就会被重新启动一次,以一次又一次地响应相同的匹配事件。这在OS X 10.6下有效吗?我得到“启动钥匙不被识别”。(请参阅)是否有一种方法可用于从
launchd
启动的shell脚本,而不是Xcode应用程序(例如/path/to/program
是shell脚本)。shell脚本每10秒重新启动一次,我找不到命令行替代形式xpc\u set\u event\u stream\u handler()
,也找不到任何从流中删除事件的方法。@romeovs发现了这个神奇的实用程序,它将调用xpc\u set\u event\u stream\u handler从队列中删除事件,然后调用所需的应用程序。允许我使用launchd而不是Xcode应用程序。请访问github.com/snosrap/xpc_set_event_stream_handler,了解最先找到此帖子的所有其他人,并了解字段值应该是什么(productID、vendorID、IOProviderClass),以及如何修复每10秒重新运行的脚本,从:IOMatchLaunchStream键必须存在,并且必须是布尔值,设置为true才能用于XPC事件。当提供给IOKit进行匹配时,它将从字典的其余部分中过滤出来。原因