2012-09-26 2 views
9

Mac OS X Sandbox의 LSOpenApplication()에 의해 다른 응용 프로그램을 시작하고 싶습니다.Mac의 샌드 박스에서 다른 프로세스를 시작하는 방법은 무엇입니까?

물론 필자는 실행을위한 권한 파일에서 'com.apple.security.temporary-exception.files.absolute-path.read-write'에 행을 추가했습니다.

그러나 실행시 이전에 사용자가 실행하지 않았기 때문에 프로세스 xxxx가 "foo.app"를 시작하지 못하도록하는 오류를 콘솔에서 발생시킵니다. 프로세스를 수동으로 한 번 실행하면 오류없이 시작할 수 있습니다.

이전에 실행하지 않았더라도 어떻게 프로세스를 시작할 수 있습니까? 이것은 샌드 박싱과 관련이 있습니까?

+0

FSRef 대신 이름 (또는 번들 ID)으로 지정할 경우 허용됩니다. http://stackoverflow.com/a/7311283/30461 –

+0

감사합니다. 그러나 launchApplication 함수를 응용 프로그램 이름과 함께 사용하더라도 발동 할 수 없습니다. 아마도 대상 응용 프로그램은 OS X Lion 및 Mountain Lion에서 정상적으로 시작하기 전에 적어도 한번은 사용자가 시작한 경험이 필요할 수 있습니다. – noridon

답변

0

사용 osascript

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

감사합니다. 함수를 호출하는 대신 오스카 스크립트를 사용한다는 의미입니까? – noridon

+0

LSOpenApplication() 함수가 샌드 박스 응용 프로그램에서 작동하지 않는 이유를 알지 못합니다. 그러나 osascript가 작동합니다. –

14

다른 응용 프로그램을 시작할 수 원하는 결과를해야하는 아래 거의 조건이 있습니다. com.apple.security.temporary-exception.files.absolute-path.read-write는 LaunchServices와 관련하여 아무 것도 얻을 수 없으므로 해당 권한을 제거 할 수 있습니다.

샌드 박스 응용 프로그램은 실제로 하위 응용 프로그램을 실행할 수있는 범위가 상당히 제한되어 있습니다. 이는 다른 응용 프로그램을 시작하면 기술적으로 샌드 박스 모델을 위반하는 의도적 인 동작입니다. 사용 가능한 방법은 다음과 같습니다

  1. 응용 프로그램에서 XPC 서비스를 포함 launchd에 출시가 그것을 위해 당신이
  2. 을 출시 할 때 샌드 박스를 상속이 응용 프로그램의 원인이됩니다 NSTask를 통해 응용 프로그램을 실행할 수 있습니다
  3. 이름으로 응용 프로그램을 시작할 수 있지만 일반적으로 응용 프로그램이/응용 프로그램 폴더에있는 경우에만 작동합니다 (예 : - [NSWorkspace launchApplication :]
  4. ) 응용 프로그램을 포함하는 응용 프로그램을 시작할 수 있습니다 , 그러나 당신이 SMLoginItemSetEnabled()되었을 때만

나는 [NSWorkspace launchApplication :]과 거의 동일하기 때문에 osascript 호출이 작동한다고 말하고 싶습니다. 번들 식별자 나 절대/상대 경로를 허용하는 LS 호출 중 아무 것도 작동하지 않습니다.

+1

감사합니다. XPC 서비스에서 시작하는 데 성공했습니다! – noridon

+0

MacAppStore에 제출하지 않으려 고 XPC 서비스를 샌드 박싱하지 않는 한 계속 작동해야합니다. 앱 스토어에 제출하는 경우 XPC 서비스를 샌드 박스로 강제 전송하게됩니다. – rudy

관련 문제