2011-08-30 70 views

回答

1

这真的取决于你在看什么样的应用程序。

它看起来像有没有办法做到这一点类似的方式来 的udev例如。

争议的解决办法是:

  • 编写自定义包装驱动程序为您的设备
  • 使用libusb,有一个守护进程等待一定的设备。

而事实上,一个可以写程序的libusb将根据给定的配置文件, 这也将是跨平台的,因为的libusb支持相当多的平台上处理这样的任务。

4

根据设备的类型,您可以将应用程序设置为通过iPhoto/Image Capture首选项自动打开。这仅适用于有限类别的设备,对于已经存在于计算机上的应用程序,并且需要手动更改计算机上的偏好设置。

一般来说,没有办法在CD/DVD/USB插件上自动运行任意应用程序,因为这是一个安全问题。

1

您可以设置文件夹操作以在挂载上运行命令。这将假定设备始终安装在相同的位置,即/ Volumes/My \ Device/- 如果在两个安装之间添加或拆除了外围设备,安装点可能会更改。您可以通过右键单击目录并单击“文件夹操作设置”来了解有关文件夹操作的更多信息。诀窍是确保设备始终安装在同一个地方。

或者,您可能可以使用launchd在挂载上运行命令。 This link可能会有所帮助。 Lingon是一个很棒的应用程序来编辑守护进程。

无论哪种方式,您可以使用文件夹操作或守护程序调用一个简单的脚本来获取设备的内容,并将其上传到哪里都可以。

19

您可以使用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> 
+1

只是确保如果你走这条路线,并且不希望你启动的程序继续运行(即KeepAlive = false),那么你的代码会调用xpc_set_event_stream_handler(),否则你会发现你的应用程序每隔10秒就会重新生成一次以响应一遍又一遍的相同匹配事件。 – rudy

+0

这是否在OS X 10.6下工作?我收到“LaunchEvents密钥未被识别”。 (请参阅http://stackoverflow.com/q/15397304/558639) –

+4

有没有一种方法可以使用此脚本从'launchd'而不是Xcode应用程序启动的shell脚本(例如'/ path/to/program'一个shell脚本)。 shell脚本每10秒重新启动一次,我无法找到一个命令行替代形式'xpc_set_event_stream_handler()'或任何方式从流中删除事件。 – romeovs

2

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); 
    }); 
  • 向plist添加KeepAlive/false键/值对
  • IOMatchLaunchStream/true键/值对添加到plist中的com.apple.device-attach字典。除此之外,还有IOMatchStream密钥。不知道为什么有在那里,我发现了一个参考这里:http://asciiwwdc.com/2013/sessions/702

也不要忘记使用

launchctl load <path to your plist> 

注意,这似乎工作系统中注册的plist ,但我从来没有从xpc流处理程序获取NSLog消息。

+0

从[documentation](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/xpc_set_event_stream_handler.3.html):IOMatchLaunchStream键必须存在并且是布尔集为了与XPC事件一起使用。当给IOKit进行匹配时,它会从字典的其余部分中过滤掉。其原因是历史性的,不适用于其他事件流。 – Mitar

相关问题