2012-09-26 20 views
9

Vorrei avviare un'altra applicazione di LSOpenApplication() in Sandbox su Mac.Come avviare un altro processo in sandbox su Mac?

Ovviamente, ho aggiunto una riga in "com.apple.security.temporary-exception.files.absolute-path.read-write" in un file di autorizzazioni per l'avvio.

Tuttavia, quando si avvia, console sputa fuori un errore che non consente al processo xxxx di avviare "foo.app" perché non è stato avviato in precedenza dall'utente. È in grado di avviarsi senza errori dopo aver avviato manualmente il processo una volta.

Come posso avviare il processo anche se non lo si avvia in precedenza? Non vi è alcuna relazione con il sandboxing?

+0

Se si specifica per nome (o forse ID fascio) anziché FSRef è accettabile, provare: http://stackoverflow.com/a/7311283/30461 –

+0

Grazie. Ma non è stato possibile avviarne nemmeno se si utilizza invece la funzione launchApplication con il nome dell'applicazione. Probabilmente, l'applicazione di destinazione potrebbe aver bisogno di avere un'esperienza avviata dall'utente almeno una volta in precedenza per il lancio normalmente su OS X Lion e Mountain Lion. – noridon

risposta

0

Usa osascript

osascript -e 'tell application "foo" to open' 
+0

Grazie Parag. Significa l'uso di osascript invece di chiamare una funzione? – noridon

+0

Non so perché la funzione LSOpenApplication() non funzioni nell'applicazione Sandbox. ma osascript funzionerà. –

14

Ci sono poche condizioni in cui sarete in grado di lanciare un'altra applicazione e avere il risultato desiderato. com.apple.security.temporary-exception.files.absolute-path.read-write non ti guadagna nulla in relazione a LaunchServices in modo da poter rimuovere tale autorizzazione.

Come applicazione in modalità sandbox, si è abbastanza limitati in ciò che è possibile eseguire in sub-avvio, si tratta di un comportamento intenzionale poiché l'avvio di un'altra applicazione è tecnicamente una violazione del modello sandbox. le modalità disponibili sono:

  1. includere un servizio XPC nell'applicazione ed avere lancio launchd per voi
  2. è possibile eseguire un'applicazione tramite NSTask, che farà sì che questa applicazione per ereditare la vostra sandbox quando ha lanciato
  3. è possibile avviare un'applicazione per nome, anche se da ciò che ho visto generalmente funziona solo se l'applicazione si trova nella cartella/Applicazioni, ovvero - [NSWorkspace launchApplication:]
  4. è possibile avviare un'applicazione che racchiuda l'app , ma solo se sei stato SMLoginItemSetEnabled()

Direi che la chiamata di osascript funziona perché ha circa lo stesso effetto di - [NSWorkspace launchApplication:]. nessuna delle chiamate LS che accettano identificatori di bundle o percorsi assoluti/relativi funzioneranno.

+1

Grazie! Riuscito a lanciare da XPC Services! – noridon

+0

che dovrebbe funzionare fino a quando non si intende inoltrare a MacAppStore e non eseguire il sandboxing del servizio XPC. Se si sta effettuando l'invio all'app store, verrà forzato l'utente a eseguire la sandbox nel servizio XPC. – rudy

Problemi correlati