1、沙盒機制介紹
iOS 中的沙盒機制(SandBox)是一種安全體系。每個 iOS 應用程序都有一個單獨的文件系統(存儲空間),而且只能在對應的文件系統中進行操作,此區域被稱為沙盒。所有的非代碼文件都要保存在此,例如屬性文件 plist、文本文件、圖像、圖標、 媒體資源等。
2、沙盒目錄結構
通常情況下,每個沙盒包含以下目錄及文件:
- /AppName.app 應用程序的程序包目錄。由於應用程序必須經過簽名,所以不能在運行時對這個目錄中的內容進行修改,否則會導致應用程序無法啟動。
- /Documents/ 保存應用程序的重要數據文件和用戶數據文件等。iTunes 同步時會備份該目錄。
- /Library/Caches 保存應用程序使用時產生的支持文件和緩存文件,還有日志文件最好也放在這個目錄。iTunes 同步時不會備份該目錄。
- /Library/Preferences 保存應用程序的偏好設置文件(使用 NSUserDefaults 類設置時創建,不應該手動創建)。
- /tmp/ 保存應用運行時所需要的臨時數據,iphone 重啟時,會清除該目錄下所有文件。
目錄結構如下圖所示:

補充1:對於上述描述可以這樣舉例理解,一個記事本應用,用戶寫的東西需要保存起來,這些東西是用戶自行生成的,則需要放在 Documents 目錄里。一個新聞應用,如果需要從服務器下載東西展示給用戶看,下載的東西就放在 Library/Caches 目錄里。蘋果審核對這個要求很嚴格,主要原因是 iCloud 的同步問題。
補充2:如果想知道真機或者模擬器 App 沙盒路徑,可通過在項目中執行下述代碼打印獲取:let homeDir = NSHomeDirectory() as Stringprintln(homeDir)
3、獲取沙盒中各目錄路徑
// 1、獲取沙盒根目錄let homeDir = NSHomeDirectory() as String// 2、獲取 Documents 目錄let docDirs = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArraylet docDir = docDirs[0] as String// 3、獲取 Caches 目錄let cachesDirs = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true) as NSArraylet cachesDir = cachesDirs[0] as String// 4、獲取 Library 目錄let libDirs = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true) as NSArraylet libDir = libDirs[0] as String// 5、獲取 tmp 目錄let tmpDir = NSTemporaryDirectory() as String
4、NSFileManager
使用 fileManager 可以對沙盒中的目錄、文件進行操作。
// 1、獲取 Documents 目錄let docDirs = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArraylet docDir = docDirs[0] as String// 2、初始化 fileManagerlet fileManager = NSFileManager.defaultManager()// 3、使用 fileManager 創建目錄let testDir = docDir + "/test"fileManager.createDirectoryAtPath(testDir, withIntermediateDirectories: true, attributes: nil, error: nil)// 4、使用 fileManager 創建文件let testFile1 = testDir + "/test1.txt"let testFile2 = testDir + "/test2.txt"fileManager.createFileAtPath(testFile1, contents: nil, attributes: nil)fileManager.createFileAtPath(testFile2, contents: nil, attributes: nil)// 5、使用 fileManager 獲取目錄下的文件名var files = fileManager.subpathsAtPath(testDir)// 6、使用 fileManager 刪除文件fileManager.removeItemAtPath(testFile1, error: nil)
上述代碼最終目錄結果如下圖所示:

5、程序包(NSBundle)
iOS 應用都是通過 bundle 進行封裝的,可以狹隘地將 bundle 理解為上述沙盒中的 AppName.app 文件。在 Finder 中,會把 bundle 當做一個文件顯示從而防止用戶誤操作導致程序文件損壞,但其實內部是一個目錄,包含了圖像、媒體資源、編譯好的代碼、nib 文件等,這個目錄稱為 main bundle。
Cocaoa 提供了 NSBundle 類封裝了 bundle 操作。
// 獲取應用程序的 main bundlevar mainBundle = NSBundle.mainBundle()// 使用 main bundle 獲取資源路徑var testFilePath = mainBundle.pathForResource("logo", ofType: "png")
6、結語
文章最后更新時間:2015年4月2日09:53:39。參考資料如下:
About Files and Directories
NSFileManager Class Reference
NSBundle Class Reference
