本文會比較全面的介紹iOS App沙盒模型的文件夾及其使用場景,以及通過swift取得這些文件夾的方法
iOS 中的沙盒機制(SandBox)是一種安全體系。
每個 iOS 應用程序都有一個單獨的文件系統(存儲空間),而且只能在對應的文件系統中進行操作,此區域被稱為沙盒。所有的非代碼文件都要保存在此,例如屬性文件 plist、文本文件、圖像、圖標、媒體資源等。
1、Documents 目錄:您應該將所有de應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該定期備份的信息。用戶自己保存的文件在documents文件裡
2、AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由於應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啟動。
3、Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄:用於存放應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。
4、tmp 目錄:這個目錄用於存放臨時文件,保存應用程序再次啟動過程中不需要的信息。
補充1:對於上述描述可以這樣舉例理解,一個記事本應用,用戶寫的東西需要保存起來,這些東西是用戶自行生成的,則需要放在 Documents 目錄裡。一個新聞應用,如果需要從服務器下載東西展示給用戶看,下載的東西就放在 Library/Caches 目錄裡。蘋果審核對這個要求很嚴格,主要原因是 iCloud 的同步問題。
補充2:如果想知道真機或者模擬器 App 沙盒路徑,可通過在項目中執行下述代碼打印獲取:
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.NSDocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentPath = paths[0]
letpaths =NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory,NSSearchPathDomainMask.UserDomainMask,true)
let cachePath= paths[0]
程序包(NSBundle)
iOS 應用都是通過 bundle 進行封裝的,可以狹隘地將 bundle 理解為上述沙盒中的 AppName.app 文件。在 Finder 中,會把 bundle 當做一個文件顯示從而防止用戶誤操作導致程序文件損壞,但其實內部是一個目錄,包含了圖像、媒體資源、編譯好的代碼、nib 文件等,這個目錄稱為 main bundle。
Cocoa 提供了 NSBundle 類封裝了 bundle 操作。
通過NSBundle可以獲取各種資源文件,注意在Build Phases - Copy Bundle Rresources下面需要有這個資源文件,有些類型的文件不會自動加在這裡
let path = NSBundle.mainBundle().pathForResource("20160504182134006", ofType: "pcm")
例子:
var fm: NSFileManager = NSFileManager.defaultManager()
if !fm.fileExistsAtPath(self.dataFilePath()) {
//下面是對該文件進行制定路徑的保存
fm.createDirectoryAtPath(self.dataFilePath(), withIntermediateDirectories: true, attributes: nil, error: nil)
//取得一個目錄下得所有文件名
var files: [AnyObject] = fm.subpathsAtPath(self.dataFilePath())
//讀取某個文件
var data: NSData = fm.contentsAtPath(self.dataFilePath())
//或者
var data: NSData = NSData.dataWithContentOfPath(self.dataFilePath())
}