2013-06-28 26 views
1

我在寫一個可以運行沙箱或不運行的應用程序。如果應用程序在沙箱中運行,應用程序如何能夠靜靜地告訴它?

我喜歡讓我的代碼獨立於我以後是否將其編碼爲沙箱,也就是說,我希望在我的代碼中(或在構建環境中)有一個常量,我必須更改我的代碼才能知道無論它是否爲沙箱而建。

當然,我需要在我的代碼中使用不同的API,具體取決於應用程序是否被沙箱化。

所以,我喜歡在我的應用程序中有動態檢測它是否在沙箱中運行的代碼。我喜歡在控制檯日誌中沒有收到消息的情況下執行此操作。即,試圖訪問沙箱中無法訪問的文件不是一個好的解決方案,因爲這會導致日誌條目反過來會刺激我的應用程序的用戶,因爲認爲有問題。

回答

1

我現在找到了一個更簡單的把戲:

我得到的路徑選項文件夾。如果它看起來是這樣的,我在沙盒:

/Users/<user>/Library/Containers/<bundle_id>/Data/Library/Preferences 

這足以滿足我的需求,我只是想避免看到控制檯封郵件。如果蘋果改變了道路,我的測試失敗了,那麼最糟糕的是我會看到關於拒絕操作的控制檯信息。我可以忍受這一點。

+2

另請參閱[這個答案](/ a/12178610)。 – theory

+0

你如何獲得路徑? – vy32

0

如上所述,沙盒應用程序是代碼簽名的。您可以通過命令行調用'codesign'來檢查是否存在此問題。

因此,如果您的程序可以調出該命令行用: -

codesign -d --entitlements :- <path to executable> 

檢索該命令的輸出,並搜索字符串: -

com.apple.security.app-sandbox 

如果字符串存在,正在運行的可執行文件被沙箱化。在應用程序啓動時,在初始化函數中執行一次此操作,並存儲一個標誌,然後可以稍後再進行測試。

------- EDITED ----------------

我沒有測試它自己,但對面this article,其中包括代碼來檢查出來如果應用程序是沙盒。完整的代碼可以在github上找到​​。

---- EDIT 2 --------------

我終於檢查代碼中aforementioned article,可以確認它按預期工作。

+0

當然,也有非沙盒的代碼可能會使用代碼簽名的可執行文件或庫。 – tml

0

我用這個:

// Determine if an application is running in sandboxed mode 
func IsSandboxed() -> Bool { 
    let dir = NSHomeDirectory() 
    let bundleName: String = NSBundle.mainBundle().bundleIdentifier as String! 
    if dir.containsString("Library/Containers/" + bundleName) { 
     return true 
    } 
    return false 
} 
相關問題