7

/Contents/Resources にある実行可能ファイルを起動する Mac OSX アプリケーションがあります。このアプリケーションは App Store でのリリースを意図していないため、サンドボックスを有効にしていません。

起動コード:

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 で実行すると、これはすべて正常に機能するということです。アプリケーションをデスクトップにエクスポートして実行する場合にも問題なく動作します。

ただし、アプリケーションを圧縮して Web サーバーにアップロードし、同じコンピューターにダウンロード (または別の 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

最初のアプリは正常に動作し、2 番目のアプリは実行可能ファイルを起動しません。一体何が起こっているのですか?同じアプリ、同じコンピューター、同じアクセス許可ですが、ダウンロードしたアプリは機能しません。

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

4

2 に答える 2

1

ファイルを書き込む NSTask で実行可能ファイルを起動しようとしたときに、この問題の原因がようやくわかりました。奇妙なことに、元の投稿で述べたように、これは場合によってはうまく機能します。しかし、他のコンピューターで動作させるために、問題を解決したSTPrivilegedTaskを使用することになりました。

于 2013-07-24T19:02:53.997 に答える