2013-07-21 84 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

添加com.apple.security.inherit享有的助手應用程序解決了這個問題對我來說。

當我試圖用NSTask啓動它時,我的幫助程序應用程序與Could not set sandbox profile data: Operation not permitted (1)一起崩潰。

從蘋果文檔:

如果您的應用程序採用與任的posix_spawn功能或NSTask類創建一個子進程,則可以配置子進程將繼承其父的沙箱。但是,使用子進程不能提供使用XPC服務所提供的安全性。

要啓用沙箱繼承,子目標必須使用剛好兩個應用程序沙箱的授權密鑰:com.apple.security.app的沙箱com.apple.security.inherit。如果您指定了任何其他App Sandbox權利,系統將中止子進程。但是,您可以通過iCloud和通知權限將其他功能授予子進程。

Xcode項目中的主應用程序不能爲繼承權利擁有YES值。

我希望這個解決方案有幫助。

+0

thx !!!!這有助於 –

+0

無子過程,主要應用程序得到崩潰這個問題因爲 – Swati

+0

謝謝!我使用NSTask並添加App Sandbox = NO權限救了我。 – iOSDec

0

我終於找到了導致這個問題的原因, 它試圖用NSTask啓動一個可執行文件來寫文件。 奇怪的是,這在某些情況下可以正常工作,如原文所述。 但爲了讓它在其他計算機上工作,我最終使用STPrivilegedTask解決了問題。