沙盒文件目錄
在iOS系統(tǒng)的安全機制,每個APP都有自己的文件目錄,且只能訪問自己的文件目錄。該機制被稱為沙盒機制。
沙盒文件結(jié)構(gòu)如下

3222019-b95d9fe54290b315.png
最上面的bundle container目錄為APP程序的安裝目錄,在安裝后為不可修改狀態(tài)。
中間的data container目錄為APP數(shù)據(jù)存儲目錄,保存APP運行時需要的數(shù)據(jù)。
最下面的iCloud container目錄為云存儲目錄,當APP需要iCloud云存儲時可以進行訪問。
data container目錄介紹
發(fā)中最常用到的是data container目錄,系統(tǒng)在安裝APP時就為用戶創(chuàng)建了幾個固定的目錄供編程人員使用。初始化時的目錄結(jié)構(gòu)如下
- Documents
保存用戶創(chuàng)建的文檔文件的目錄,用戶可以通過文件分享分享該目錄下的文件。在iTunes和iCloud備份時會備份該目錄。建議保存你希望用戶看得見的文件。 - Library
蘋果不建議在該目錄下保存任何用戶相關(guān)數(shù)據(jù),而是保存APP運行需要的修改數(shù)據(jù),當然用戶可以根據(jù)自己的實際需要進行保存。
該目錄下默認有兩個子目錄,為Caches、Preferences。根據(jù)文檔還有另外兩個系統(tǒng)預(yù)存放文件的子目錄,分別是Application Support、Frameworks。用戶還可以自己根據(jù)需要創(chuàng)建相應(yīng)的目錄。該目錄下除Caches目錄外,在iTunes和iCloud備份時會備份除Caches目錄外的其他所有目錄。四個目錄的預(yù)定義如下:
Cache:建議保存數(shù)據(jù)緩存使用。在用戶的磁盤空間已經(jīng)使用完畢時有可能刪除該目錄下的文件,在APP使用期間不會刪除,APP沒有運行時系統(tǒng)有可能進行刪除。需要持久化的數(shù)據(jù)建議不要保存在該目錄下,以免系統(tǒng)強制刪除。
Preferences:用戶偏好存儲目錄,在使用NSUserDefaults或者CFPreferences接口保存的數(shù)據(jù)保存在該目錄下,編程人員不需要對該目錄進行管理。在iTunes和iCloud備份時會備份該目錄。
Application Support:建議用來存儲除用戶數(shù)據(jù)相關(guān)以外的所有文件,如游戲的新關(guān)卡。在iTunes和iCloud備份時會備份該目錄。
Frameworks:用來保存動態(tài)庫的文件夾,在iOS系統(tǒng)中已不能使用,該目錄可以忽略。 - tmp
蘋果建議該目錄用來保存臨時使用的數(shù)據(jù),編程人員應(yīng)該在數(shù)據(jù)長時間內(nèi)不使用時主動刪除該目錄下的文件,在APP沒有運行期間,系統(tǒng)可能刪除該目錄下的文件。在iTunes和iCloud備份時不會備份該目錄。
綜上所述,我們保存文件可以保存在Application Support或者Documents目錄之下,臨時緩存文件則可根據(jù)需要保存到tmp和Cache目錄下面,由于tmp和Cache目錄有可能被系統(tǒng)刪除,所有不能保存重要的文件數(shù)據(jù)。
除系統(tǒng)推薦的目錄之外,用戶也可以自己創(chuàng)建目錄,也可以在推薦的目錄下創(chuàng)建子目錄進行管
- 目錄路徑獲取
//沙盒根目錄
NSString *homePath = NSHomeDirectory();
//document目錄
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//library目錄
NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject;
//caches目錄
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
//application support目錄
NSString *applicationSupportPath = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES).firstObject;
//preference目錄
NSString *preferencePath = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES).firstObject;
//tem目錄
NSString *temPath = NSTemporaryDirectory();