我需要实现一个Mac OS X应用程序。在我的应用程序中,我需要做两件事:当特定类型的USB设备连接时,在Mac OS X上执行应用程序?
- 当特定类型的USB设备连接到系统时执行/打开应用程序。
- 从USB读取数据并将其上传到Web服务器。
我没有在Mac OS X开发了丰富的经验。任何人都可以请建议最好的文件,以达到我的目标?
我需要实现一个Mac OS X应用程序。在我的应用程序中,我需要做两件事:当特定类型的USB设备连接时,在Mac OS X上执行应用程序?
我没有在Mac OS X开发了丰富的经验。任何人都可以请建议最好的文件,以达到我的目标?
这真的取决于你在看什么样的应用程序。
它看起来像有没有办法做到这一点类似的方式来 的udev例如。
争议的解决办法是:
而事实上,一个可以写程序的libusb将根据给定的配置文件, 这也将是跨平台的,因为的libusb支持相当多的平台上处理这样的任务。
根据设备的类型,您可以将应用程序设置为通过iPhoto/Image Capture首选项自动打开。这仅适用于有限类别的设备,对于已经存在于计算机上的应用程序,并且需要手动更改计算机上的偏好设置。
一般来说,没有办法在CD/DVD/USB插件上自动运行任意应用程序,因为这是一个安全问题。
您可以使用launchd。试试man launchd和man launchd.plist。
似乎launchd可以使用USB事件,即使此功能记录不完善。 我发现它:man xpc_set_event_stream_handler
下面是一个例子。如果将以下内容放入:~/Library/LaunchAgents/com.example.plist
,则应在USB设备连接时启动程序。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.program</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/program</string>
</array>
<key>LaunchEvents</key>
<dict>
<key>com.apple.iokit.matching</key>
<dict>
<key>com.apple.device-attach</key>
<dict>
<key>idProduct</key>
<integer>1234</integer>
<key>idVendor</key>
<integer>1337</integer>
<key>IOProviderClass</key>
<string>IOUSBDevice</string>
<key>IOMatchLaunchStream</key>
<true/>
</dict>
</dict>
</dict>
</dict>
</plist>
Julien Pilet的回答为我工作。然而,为了得到它不经常重新启动应用程序时关闭应用程序时,该设备仍连接,我只好:
xpc_set_event_stream_handler()
在我的应用程序委托applicationDidFinishLaunching
:xpc_set_event_stream_handler("com.apple.iokit.matching", NULL, ^(xpc_object_t event) {
// Every event has the key XPC_EVENT_KEY_NAME set to a string that
// is the name you gave the event in your launchd.plist.
const char *name = xpc_dictionary_get_string(event, XPC_EVENT_KEY_NAME);
// IOKit events have the IORegistryEntryNumber as a payload.
uint64_t id = xpc_dictionary_get_uint64(event, "IOMatchLaunchServiceID");
// Reconstruct the node you were interested in here using the IOKit
// APIs.
NSLog(@"Received event: %s: %llu",name,id);
});
IOMatchLaunchStream/true
键/值对添加到plist中的com.apple.device-attach
字典。除此之外,还有IOMatchStream
密钥。不知道为什么有在那里,我发现了一个参考这里:http://asciiwwdc.com/2013/sessions/702也不要忘记使用
launchctl load <path to your plist>
注意,这似乎工作系统中注册的plist ,但我从来没有从xpc流处理程序获取NSLog消息。
从[documentation](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/xpc_set_event_stream_handler.3.html):IOMatchLaunchStream键必须存在并且是布尔集为了与XPC事件一起使用。当给IOKit进行匹配时,它会从字典的其余部分中过滤掉。其原因是历史性的,不适用于其他事件流。 – Mitar
只是确保如果你走这条路线,并且不希望你启动的程序继续运行(即KeepAlive = false),那么你的代码会调用xpc_set_event_stream_handler(),否则你会发现你的应用程序每隔10秒就会重新生成一次以响应一遍又一遍的相同匹配事件。 – rudy
这是否在OS X 10.6下工作?我收到“LaunchEvents密钥未被识别”。 (请参阅http://stackoverflow.com/q/15397304/558639) –
有没有一种方法可以使用此脚本从'launchd'而不是Xcode应用程序启动的shell脚本(例如'/ path/to/program'一个shell脚本)。 shell脚本每10秒重新启动一次,我无法找到一个命令行替代形式'xpc_set_event_stream_handler()'或任何方式从流中删除事件。 – romeovs