2012-09-26 39 views
9

私はLSOpenApplication()の別のアプリケーションをMacのSandboxで起動したいと考えています。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で正常に起動するために、以前に少なくとも1回以前に体験を開始する必要があります。 – noridon

答えて

0

使用osascript

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

ありがとうParag。それは、関数を呼び出すのではなく、オスカスクリプトを使うことを意味しますか? – noridon

+0

LSOpenApplication()関数がSandboxアプリケーションで動作しない理由を知りません。オスカスクリプトは機能します。 –

14

あなたが別のアプリケーションを起動して、望ましい結果を持ってできるようになりますその下で非常にいくつかの条件があります。 com.apple.security.temporary-exception.files.absolute-path.read-writeは、LaunchServicesに関して何も得られないため、そのエンタイトルメントを削除できます。

サンドボックスアプリケーションでは、実際にサブミットできるものがかなり限られています。これは、別のアプリケーションの起動が技術的にサンドボックスモデルに違反しているため、意図的な動作です。あなたに利用できる方法があります。

  1. アプリケーションでXPCサービスを含め、launchdの打ち上げを持っていることのためにあなたあなたが
  2. を立ち上げたときに、あなたのサンドボックスを継承するために、このアプリケーションが発生しますNSTask、を介してアプリケーションを実行することができます
  3. 名前でアプリケーションを起動することはできますが、これは通常、アプリケーションが/ Applicationsフォルダにある場合にのみ機能します。 - [NSWorkspace launchApplication:]
  4. あなたのアプリケーションを囲むアプリケーションを起動できますあなたがSMLoginItemSetEnabled()だった場合にのみ

オスカスクリプトの呼び出しは、[NSWorkspace launchApplication:]とおおよそ同じであるため、うまく動作します。バンドル識別子または絶対/相対パスを受け入れるLS呼び出しのどれも動作しません。

+1

ありがとう! XPCサービスからの立ち上げに成功しました! – noridon

+0

MacAppStoreに提出するつもりはなく、XPCサービスをサンドボックス化していない限り動作します。あなたがアプリストアに投稿している場合は、XPCサービスをサンドボックスに強制します。 – rudy

関連する問題