2011-08-30 12 views
10

Devo implementare un'applicazione per Mac OS X. Nella mia domanda ho bisogno di fare due cose:Eseguire un'applicazione su Mac OS X quando è collegato un particolare tipo di dispositivo USB?

  1. Esegui/Apri di un'applicazione quando un particolare tipo di dispositivo USB è collegato al sistema.
  2. Leggere i dati da USB e caricarli su un server web.

Non ho molta esperienza nello sviluppo di Mac OS X. Qualcuno può suggerire i migliori documenti per raggiungere i miei obiettivi?

risposta

1

Dipende davvero dal tipo di applicazione che si sta guardando.

Sembra proprio non c'è modo di farlo in un modo simile a udev per esempio.

Per soluzioni controverse sarebbe:

  • scrivere un driver wrapper personalizzato per il vostro dispositivo
  • Usa libusb e hanno un demone per aspettare determinato dispositivo.

E in effetti si potrebbe scrivere un programma con libusb che gestirà questo tipo di compiti in base a un dato file di configurazione, che sarebbe anche cross-platform dal libusb supporta alcune piattaforme abbastanza.

4

A seconda del tipo di dispositivo, è possibile impostare un'applicazione per l'apertura automatica tramite le preferenze di iPhoto/Image Capture. Ciò funzionerà solo per una classe limitata di dispositivi, per un'applicazione già presente sul computer e richiederà la modifica manuale delle preferenze sul computer.

In generale, non è possibile eseguire automaticamente applicazioni arbitrarie su inserti CD/DVD/USB perché si tratta di un problema di sicurezza.

1

Potrebbe essere possibile impostare Azioni cartella per eseguire un comando sul montaggio. Ciò presuppone che il dispositivo monti sempre nello stesso posto, ovvero/Volumi/My \ Device/- se le periferiche sono state aggiunte o rimosse tra i supporti, il punto di montaggio potrebbe cambiare. È possibile ottenere ulteriori informazioni su Azioni cartella facendo clic con il pulsante destro del mouse su una directory e facendo clic su "Impostazione azioni cartella". Il trucco sarebbe quello di assicurarsi che il dispositivo monti sempre nello stesso posto.

In alternativa, è possibile utilizzare launchd per eseguire un comando su mount. This link può aiutare. Lingon è una grande app per editare i demoni.

In entrambi i casi, è possibile utilizzare la cartella Azione o demone per chiamare uno script semplice per afferrare il contenuto del dispositivo e caricarlo in qualsiasi momento.

19

È possibile utilizzare launchd. Prova man launchd e man launchd.plist.

Sembra che launchd può lavorare con gli eventi USB, anche se questa funzione è scarsamente documentata. L'ho trovato: man xpc_set_event_stream_handler

Ecco un esempio.Se si inserisce quanto segue in: ~/Library/LaunchAgents/com.example.plist, il programma dovrebbe avviarsi quando viene collegato 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

assicurati che se segui questa rotta e non vuoi che il tuo processo avviato rimanga in esecuzione (cioè KeepAlive = false) che il tuo codice chiami xpc_set_event_stream_handler() altrimenti troverai la tua app rigenerata ogni 10 secondi in risposta al lo stesso evento di corrispondenza più e più volte. – rudy

+0

Funziona sotto OS X 10.6? Sto ricevendo "la chiave LaunchEvents non riconosciuta". (Vedi http://stackoverflow.com/q/15397304/558639) –

+4

C'è un modo per usarlo con gli script di shell lanciati da 'launchd' invece di un'app Xcode (ad esempio'/percorso/a/programma' è uno script di shell). Lo script della shell viene riavviato ogni 10 secondi e non riesco a trovare una forma alternativa di riga di comando 'xpc_set_event_stream_handler()' o un modo per rimuovere l'evento dallo stream. – romeovs

2

La risposta di Julien Pilet ha funzionato per me. Tuttavia, per farlo rilanciare non costantemente l'applicazione quando il dispositivo è ancora collegato quando si chiude l'applicazione, ho dovuto:

  • chiamata xpc_set_event_stream_handler() nella mia app delegato 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); 
    }); 
  • aggiungi KeepAlive/false key/value pair al plist
  • aggiungi IOMatchLaunchStream/true coppia chiave/valore al com.apple.device-attach dict in plist. Questo è in aggiunta alla chiave IOMatchStream già presente. Non certo perché che deve essere lì, ho trovato un riferimento ad esso qui: http://asciiwwdc.com/2013/sessions/702

Inoltre, non dimenticare di registrare il plist con il sistema utilizzando

launchctl load <path to your plist> 

Si noti che questo sembra funzionare , ma non ottengo mai il messaggio NSLog dal gestore del flusso xpc.

+0

Da [documentazione] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/xpc_set_event_stream_handler.3.html): La chiave IOMatchLaunchStream deve essere presente ed essere un set booleano true per l'uso con XPC Events. Verrà filtrato dal resto del dizionario quando viene assegnato a IOKit in modo che corrisponda. Le ragioni di ciò sono storiche e non applicabili ad altri flussi di eventi. – Mitar