1、APP沙盒目錄結構簡介
首先奉上蘋果官方文件:
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html
在iOS系統的安全機制,每個APP都有自己的檔案目錄,且只能訪問自己的檔案目錄。該機制被稱為沙盒機制。
沙盒檔案結構如下:
最上面的bundle container目錄為APP程式的安裝目錄,在安裝後為不可修改狀態。(用於存放程式原始檔,上架前經過數字簽名,上架後不能修改)
中間的data container目錄為APP資料儲存目錄,儲存APP執行時需要的資料。
最下面的iCloud container目錄為雲端儲存目錄,當APP需要iCloud雲端儲存時可以進行訪問。
2、data container目錄介紹
開發中最常用到的是data container目錄,系統在安裝APP時就為使用者建立了幾個固定的目錄供程式設計人員使用。初始化時的目錄結構如下:
※Documents
儲存使用者建立的文件檔案的目錄,使用者可以通過檔案分享分享該目錄下的檔案。在iTunes和iCloud備份時會備份該目錄。建議儲存你希望使用者看得見的檔案。(不能用於存放快取檔案,否則上架不通過)
※Library
蘋果不建議在該目錄下儲存任何使用者相關資料,而是儲存APP執行需要的修改資料,當然使用者可以根據自己的實際需要進行儲存。
該目錄下預設有兩個子目錄,為Caches、Preferences。根據文件還有另外兩個系統預存放檔案的子目錄,分別是Application Support、Frameworks。使用者還可以自己根據需要建立相應的目錄。該目錄下除Caches目錄外,在iTunes和iCloud備份時會備份除Caches目錄外的其他所有目錄。四個目錄的預定義如下:
Cache:建議儲存資料快取使用。在使用者的磁碟空間已經使用完畢時有可能刪除該目錄下的檔案,在APP使用期間不會刪除,APP沒有執行時系統有可能進行刪除。需要持久化的資料建議不要儲存在該目錄下,以免系統強制刪除。
Preferences:使用者偏好儲存目錄,在使用NSUserDefaults或者CFPreferences介面儲存的資料儲存在該目錄下,程式設計人員不需要對該目錄進行管理。在iTunes和iCloud備份時會備份該目錄。
Application Support:建議用來儲存除使用者資料相關以外的所有檔案,如遊戲的新關卡。在iTunes和iCloud備份時會備份該目錄。
Frameworks:用來儲存動態庫的資料夾,在iOS系統中已不能使用,該目錄可以忽略。
※tmp
蘋果建議該目錄用來儲存臨時使用的資料,程式設計人員應該在資料長時間內不使用時主動刪除該目錄下的檔案,在APP沒有執行期間,系統可能刪除該目錄下的檔案。在iTunes和iCloud備份時不會備份該目錄。
綜上所述,我們儲存檔案可以儲存在Application Support或者Documents目錄之下,臨時快取檔案則可根據需要儲存到tmp和Cache目錄下面,由於tmp和Cache目錄有可能被系統刪除,所有不能儲存重要的檔案資料。
除系統推薦的目錄之外,使用者也可以自己建立目錄,也可以在推薦的目錄下建立子目錄進行管理。
3、目錄路徑獲取
獲取路徑方法如下:
//沙盒根目錄
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();