iOS系統在安全性上的一大亮點就是沙盒。
每個iOS應用SDK都被限制在沙盒中,我們可以把沙盒當成一個設置了僅當前SDK可以訪問的文件夾,蘋果對沙盒有以下幾條限制:
應用程序可以在自己的沙盒中運行,但不能訪問任何其他應用程序的沙盒。
應用程序間不能共享數據。
禁止應用程序讀寫沙盒以外的文件夾。
沙盒根目錄中有四個文件夾:
AppName.app
Documents
Library
tmp
iTunes在與iPhone同步時,備份所有的Documents和Library文件。
iPhone在重啟時,丟棄所有的tmp文件。
一、以下從存放內容、是否會被iTunes同步兩個方面來分別描述沙盒中四個文件夾的功能情況:
1. AppName.app
①存放內容
這是應用程序的程序包目錄,包含了應用程序本身的數據、資源文件、可執行文件等等。程序啟動以后,會根據需要從該目錄中動態的加載代碼或者資源到內存(懶加載:lazy loading)。
注意:AppName.app目錄是只讀的。為了防止被篡改,應用在安裝的時候會將該目錄簽名。非越獄情況下,該目錄中的內容是無法更改的;如果更改了目錄內容,對應的簽名就會發生改變,會導致應用程序無法啟動。
②是否會被iTunes同步
否
2. Documents
①存放內容
我們可以將應用程序的數據文件保存在該目錄下。不過這些數據類型僅限于不可再生的數據,可再生的數據文件應該存放在Library/Cache目錄下
②是否會被iTunes同步
是
3. Documents/Inbox
①存放內容
該目錄用來保存由外部應用請求當前應用程序打開的文件。
比如:應用A向系統注冊了幾種可打開的文件格式,應用B中有一個A支持的格式的文件F,并申請調用應用A打開文件F。由于F當前是在應用B的沙盒中,我們知道,沙盒機制使不允許應用A訪問應用B沙盒中的文件,因此蘋果的解決方案是將文件F拷貝一份到應用A的Documents/Inbox目錄下,再讓應用A打開文件F。
②是否會被iTunes同步
是
4. Library
①存放內容
蘋果建議用來存放默認設置或者其他狀態信息。
②是否會被iTunes同步
是,但除了Caches子目錄
5. Library/Caches
①存放內容
主要是緩存文件,用戶使用過程中緩存都可以保存在這個目錄中。上面提到過,Documents目錄用于保存不可再生的文件,那么這個目錄就用于保存那些可再生的文件,比如網絡請求數據。鑒于此,應用程序通常還需要負責刪除這些文件。
②是否會被iTunes同步
否
6. Library/Preferences
①存放內容
應用程序的偏好設置文件。我們使用NSUserDefaults的設置數據都會保存到該目錄下的一個plist文件中。
②是否會被iTunes同步
是
7. tmp
①存放內容
主要存放各種臨時文件,保存應用再次啟動時不需要的文件。而且,當應用不再需要這些文件時應該主動將其刪除,因為該目錄下的東西隨時有可能被系統清理掉,目前已知的一種可能清理的原因是系統磁盤存儲空間不足的時候。
②是否會被iTunes同步
否
二、獲取沙盒路徑
1. 獲取沙盒主目錄路徑
NSString *homePath = NSHomeDirectory();
2. 獲取Documents路徑
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
3. 獲取Library路徑
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
4. 獲取Caches路徑
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
5. 獲取tmp路徑
NSString *tmpDir = NSTemporaryDirectory();