iOS 沙盒目錄結構及正確使用


前言:
處於安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下面的文件(也有例外,比如在用戶授權情況下訪問通訊錄,相冊等),這個規則展示了iOS系統的封閉性。在開發中常常需要數據存儲的功能,比如存取文件,歸檔解檔等。

一、沙盒目錄結構

每個APP的沙盒下面都有相似目錄結構,如圖(蘋果官方文檔):


Every App Is an Island

 

NSString *path = NSHomeDirectory();

上面的代碼得到的是應用程序目錄的路徑,在該目錄下有三個文件夾:Documents、Library、temp以及一個.app包!該目錄下就是應用程序的沙盒,應用程序只能訪問該目錄下的文件夾!!!

1、Documents 目錄:您應該將所有的應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據。該路徑可通過配置實現iTunes共享文件。可被iTunes備份。

2、AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由於應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啟動。

3、Library 目錄:這個目錄下有兩個子目錄:
Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄:用於存放應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。
可創建子文件夾。可以用來放置您希望被備份但不希望被用戶看到的數據。該路徑下的文件夾,除Caches以外,都會被iTunes備份。

4、tmp 目錄:這個目錄用於存放臨時文件,保存應用程序再次啟動過程中不需要的信息。該路徑下的文件不會被iTunes備份。

二、獲取各種文件目錄的路徑

獲取目錄路徑的方法:

// 獲取沙盒主目錄路徑
NSString *homeDir = NSHomeDirectory();
// 獲取Documents目錄路徑
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 獲取Library的目錄路徑
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
// 獲取Caches目錄路徑
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 獲取tmp目錄路徑
NSString *tmpDir =  NSTemporaryDirectory();

 

獲取應用程序程序包中資源文件路徑的方法:

NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

 

三、NSSearchPathForDirectoriesInDomains

NSSearchPathForDirectoriesInDomains方法用於查找目錄,返回指定范圍內的指定名稱的目錄的路徑集合。有三個參數:
directory NSSearchPathDirectory類型的enum值,表明我們要搜索的目錄名稱,比如這里用NSDocumentDirectory表明我們要搜索的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄。
domainMask NSSearchPathDomainMask類型的enum值,指定搜索范圍,這里的NSUserDomainMask表示搜索的范圍限制於當前應用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
expandTilde BOOL值,表示是否展開波浪線~。我們知道在iOS中~的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~”。

該值為NO:Caches目錄路徑~/Library/Caches
該值為YES:Caches目錄路徑
/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM