/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 バージョンで発生します。