原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713 出於安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下麵的文件(也有例外,比如系統通訊錄能在用戶授權的情況下被第三方應用訪問),這個規則把iOS系統的封閉性展現 ...
原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713
出於安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下麵的文件(也有例外,比如系統通訊錄能在用戶授權的情況下被第三方應用訪問),這個規則把iOS系統的封閉性展現的淋漓盡致。
一、沙盒中幾個主要的目錄
每個沙盒下麵都有相似的目錄結構,如下圖所示(出自蘋果官方文檔): 每個應用的沙盒目錄都是相似的,主要包含圖中所示的4個目錄:1、MyApp.app
①存放內容 該目錄包含了應用程式本身的數據,包括資源文件和可執行文件等。程式啟動以後,會根據需要從該目錄中動態載入代碼或資源到記憶體,這裡用到了lazy loading的思想。 ②整個目錄是只讀的 為了防止被篡改,應用在安裝的時候會將該目錄簽名。非越獄情況下,該目錄中內容是無法更改的;在越獄設備上如果更改了目錄內容,對應的簽名就會被改變,這種情況下蘋果官網描述的後果是應用程式將無法啟動,我沒實踐過。 ③是否會被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文件中,這就是所謂的寫道plist中! ②是否會被iTunes同步 是 7、tmp ①存放內容 各種臨時文件,保存應用再次啟動時不需要的文件。而且,當應用不再需要這些文件時應該主動將其刪除,因為該目錄下的東西隨時有可能被系統清理掉,目前已知的一種可能清理的原因是系統磁碟存儲空間不足的時候。 ②是否會被iTunes同步 否 二、獲取主要目錄路徑的方式1、沙盒目錄
NSLog(@"%@",NSHomeDirectory());輸出結果:
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A
2、tmp
NSLog(@"%@",NSTemporaryDirectory());
輸出結果:
/private/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/tmp/
3、Myapp.app
NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
輸出結果:
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/PhoneCall.app
4、Documents
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [paths objectAtIndex:0]; NSLog(@"%@",path);
輸出結果:
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/Documents
這裡用到的NSSearchPathForDirectoriesInDomains方法需要解釋下,其聲明如下:
FOUNDATION_EXPORT NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);該方法用於返回指定範圍內的指定名稱的目錄的路徑集合。有三個參數:
- directory
- domainMask
- expandTilde