2011-08-30 3 views
10

Necesito implementar una aplicación Mac OS X. En mi aplicación necesito hacer dos cosas:¿Desea ejecutar una aplicación en Mac OS X cuando se conecta un tipo particular de dispositivo USB?

  1. Ejecutar/Abrir una aplicación cuando un tipo particular de dispositivo USB está conectado al sistema.
  2. Lea los datos del USB y cárguelo en un servidor web.

No tengo mucha experiencia en el desarrollo de Mac OS X. ¿Puede alguien sugerirme los mejores documentos para alcanzar mis objetivos?

Respuesta

1

Realmente depende del tipo de aplicación que está buscando.

Parece que no hay forma de hacerlo de manera similar a udev por ejemplo.

Para soluciones controvertidas serían:

  • escribir un controlador envoltorio personalizado para su dispositivo
  • Uso libusb y tienen un demonio que esperar cierto dispositivo.

Y, de hecho, se podría escribir un programa con libusb que se encargará de este tipo de tareas en función de un archivo de configuración dada, que sería también multiplataforma desde libusb soporta un par de plataformas bastante.

4

Según el tipo de dispositivo, es posible que pueda configurar una aplicación para que se abra automáticamente a través de las preferencias de iPhoto/Image Capture. Eso funcionará solo para una clase limitada de dispositivos, para una aplicación ya presente en la computadora y requerirá cambiar manualmente las preferencias en la computadora.

En general, no hay forma de ejecutar automáticamente aplicaciones arbitrarias en la inserción de CD/DVD/USB porque es un problema de seguridad.

1

Puede configurar Acciones de carpeta para ejecutar un comando en el montaje. Esto supondría que el dispositivo siempre se monta en el mismo lugar, es decir,/Volumes/My \ Device/- si se agregaron o eliminaron periféricos entre montajes, el punto de montaje puede cambiar. Puede obtener más información sobre las Acciones de carpeta haciendo clic con el botón derecho en un directorio y haciendo clic en "Configuración de las acciones de la carpeta". El truco sería asegurarse de que el dispositivo siempre se monte en el mismo lugar.

O bien, puede utilizar launchd para ejecutar un comando en el montaje. This link puede ayudar. Lingon es una gran aplicación para editar daemons.

De cualquier forma, puede usar la Acción de Carpeta o daemon para llamar a un script simple para tomar el contenido del dispositivo y cargarlo donde desee.

19

Puede usar launchd. Prueba man launchd y man launchd.plist.

Parece que launchd puede funcionar con eventos USB, aunque esta función está poco documentada. Lo encontré en: man xpc_set_event_stream_handler

Aquí hay un ejemplo.Si coloca lo siguiente en: ~/Library/LaunchAgents/com.example.plist, su programa debería comenzar cuando se conecta un dispositivo 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

simplemente asegúrate de que si realizas esta ruta y no quieres que el proceso iniciado se mantenga activo (es decir, KeepAlive = falso) tu código llama a xpc_set_event_stream_handler(); de lo contrario, verás que tu aplicación se reagrupa cada 10 segundos en respuesta a mismo evento coincidente una y otra vez. – rudy

+0

¿Funciona esto bajo OS X 10.6? Obtengo "LaunchEvents clave no reconocida". (Consulte http://stackoverflow.com/q/15397304/558639) –

+4

¿Hay alguna manera de usar esto con los scripts de shell que se inician desde 'launchd' en lugar de con una aplicación Xcode (por ejemplo,'/path/to/program' es un guion de shell). El script de shell se está relanzando cada 10 segundos y no puedo encontrar una alternativa de línea de comandos de 'xpc_set_event_stream_handler()' ni ninguna forma de eliminar el evento de la transmisión. – romeovs

2

La respuesta de Julien Pilet funcionó para mí. Sin embargo, para conseguirlo para relanzar no constantemente la aplicación cuando el dispositivo está todavía conectado al cerrar la aplicación, que tenía que:

  • llamada xpc_set_event_stream_handler() en mi aplicación delegado 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); 
    }); 
  • agregue el par clave/valor KeepAlive/false al plist
  • agregue IOMatchLaunchStream/true par clave/valor al com.apple.device-attach dict en el plist. Esto es adicional a la clave IOMatchStream que ya está allí. No sé por qué eso tiene que estar allí, encontré una referencia a él aquí: http://asciiwwdc.com/2013/sessions/702

Tampoco se olvide de registrar el plist con el sistema usando

launchctl load <path to your plist> 

Tenga en cuenta que esto parece funcionar , pero nunca recibo el mensaje NSLog del controlador de flujo xpc.

+0

De [documentación] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/xpc_set_event_stream_handler.3.html): se requiere que la clave IOMatchLaunchStream esté presente y sea un conjunto booleano verdadero para usar con XPC Events. Se filtrará del resto del diccionario cuando se le dé a IOKit para que coincida. Las razones para esto son históricas y no se aplican a otras transmisiones de eventos. – Mitar

Cuestiones relacionadas