2013-07-21 25 views
6

/Contents/Resourcesにある実行可能ファイルを起動するMac OSXアプリケーションがあります。 アプリケーションはApp Storeでリリースされる予定ではないため、サンドボックスがオンになっていません。NSTaskで実行可能ファイルを起動する - サンドボックスの問題?

起動コード:

toolPath = [[[NSBundle mainBundle] pathForResource:@"myexecutable" ofType:@""] copy]; 
task = [[NSTask alloc] init]; 
[task setLaunchPath: toolPath]; 
pipe = [[NSPipe alloc] init]; 
[task setArguments:[NSArray arrayWithObjects:@"-someArg", someVariable, nil]]; 
file = [[NSFileHandle alloc] initWithFileDescriptor:[pipe fileHandleForReading].fileDescriptor]; 
[task setStandardOutput: stderrPipe]; 
[task launch]; 

事がある - Xcodeで実行しているときに、このすべてが正常に動作します。 アプリケーションをデスクトップにエクスポートして実行すると、正常に動作します。

しかし、アプリケーションを圧縮してウェブサーバーにアップロードしてから、同じコンピュータ(または別のMacにドロップボックス)にダウンロードすると、タスクは起動しなくなります。私はシステムコンソールなどで何のエラーも受けない。

私はこの問題についていくつか調査し、OSXが新しいアプリケーションを「隔離された」特別なアクセス権としてマークすることを発見しました。 Xcodeのから自分のアプリケーションをエクスポートした後、実行可能に

権限:だから私は、ダウンロードしたアプリとエクスポートのアプリとの違いを調べた。この時点で

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

アプリが正常に動作し、実行ファイルが起動されるからボタンをクリックします。

、サーバにアップロードされたアプリケーション、ダウンロードをビュンした後、解凍し、そしてアプリケーションを開くと「このアプリケーションは、インターネットからダウンロードした」対話受諾:私はプッシュしたときに何も起こりません。この時点で

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 
    com.apple.quarantine  26 

を私のアプリのボタン。

私は、全体のアプリでxattr -rd com.apple.quarantineを実行する場合、検疫通知が削除されます。

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

をしかし、実行はまだ起動されないです!

/内容量/ MacOSの:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/コンテンツ/リソース:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

そして、ダウンロードした上で、私は今、私のデスクトップアプリケーションに次の権限を持っているこの時点で

私がxattr -rdを使ったアプリ:

/コンテンツ/ MacOS:

-rwxr-xr-x 1 Username staff 407728 21 Jul 16:31 appName 

/コンテンツ/リソース:

-rwxr-xr-x 1 Username staff 65724 21 Jul 16:31 executableName 

最初のアプリが正常に動作し、もう一つは、実行可能ファイルを起動することはありません。一体何が起こっているの?それは、同じコンピュータ上で、同じアクセス許可を持つ同じアプリですが、ダウンロードされたものだけでは機能しません。

この問題は、異なるコンピュータ上のすべてのOSXバージョンで発生します。

答えて

5

は私のために、この問題を解決しました。

NSTaskで起動しようとしたときに、私のヘルパーアプリがCould not set sandbox profile data: Operation not permitted (1)でクラッシュしていました。アップルのドキュメントから

は:

あなたのアプリがposix_spawn機能やNSTaskクラスのいずれかで作成された子プロセスを採用した場合は、その親のサンドボックスを継承するために、子プロセスを設定することができます。しかし、子プロセスを使用しても、XPCサービスを使用することで得られるセキュリティは提供されません。 com.apple.security.app-サンドボックスcom.apple.security.inherit

は、子ターゲットはちょうど二つのAppサンドボックスの資格キーを使用する必要があり、サンドボックスの継承を有効にするには。他のApp Sandbox資格を指定すると、システムは子プロセスを中止します。ただし、iCloudと通知のエンタイトルメントを使用して、子プロセスに他の機能を与えることはできます。

Xcodeプロジェクトのメインアプリケーションは、継承資格のためにYES値を持つことはできません。

この解決策が役立ちます。

+0

thx !!!!それは –

+0

の子プロセスを手伝ってくれましたが、このアプリの主なアプリはクラッシュしました。 – Swati

+0

ありがとうございました!私はNSTaskを使用していて、App Sandbox = NO資格を追加すると私を救った。 – iOSDec

0

最後に、この問題の原因を見つけました。 ファイルを書き込むNSTaskで実行可能ファイルを起動しようとしたときに、この問題が発生しました。 奇妙なことに、元の投稿に記載されているように、これはうまく機能する場合もあります。 しかし、他のコンピュータで動作させるために、私はSTPrivilegedTaskを使って問題を解決しました。ヘルパーアプリにcom.apple.security.inherit資格を追加

関連する問題