iOS --- 關於SandBox機制及檔案讀寫的幾種方式
阿新 • • 發佈:2019-02-11
iOS中的SandBox(沙盒)機制是一種安全體系,它規定了APP只能在為該APP建立的資料夾內讀取檔案,不可以訪問其他地方的內容。所有的非程式碼檔案都儲存在這個地方,比如圖片、聲音、屬性列表和文字檔案等。即:
- 每個應用程式都在自己的沙盒內
- 不能隨意跨越自己的沙盒去訪問別的應用程式沙盒的內容
- 應用程式向外請求或接收資料都需要經過許可權認證
SandBox
預設情況下,每個APP的SandBox中有三個資料夾: Documents, Library和tmp, 該APP只能在這三個目錄下進行檔案的讀寫操作.
獲取SandBox的路徑:
let home: String = NSHomeDirectory()
- Documents: Apple建議將APP中建立的或瀏覽到的檔案資料儲存在此, iTunes會將其備份.
- Library: 儲存APP的預設設定或其他狀態資訊, iTunes會將其備份.
- Library/Preferences: APP的偏好設定檔案, 可使用NSUserDefaults來獲取和設定.
- Library/Cached: 存放快取檔案, 該目錄中檔案不會在APP退出時刪除. 而iTunes不會備份該目錄.
- tmp: 建立臨時檔案的地方.
獲取各個路徑的方式如下:
// 使用NSSearchPathForDirectoriesInDomains來獲取SandBox中目錄的全路徑
let paths: Array = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as Array!
print("paths : \(paths)")
let documentsPath: String = paths[0] as String!
print("documents : \(documentsPath)")
let library: String = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true )[0]
print("library : \(library)")
let preferencs: String = NSSearchPathForDirectoriesInDomains(.PreferencePanesDirectory, .UserDomainMask, true)[0]
print("preferencs : \(preferencs)")
let caches: String = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)[0]
print("caches : \(caches)")
NSBundle
NSBundle包含了APP打包的所有檔案, 如其中Info.plist檔案包含了APP的基本資訊。
// 獲取Info.plist檔案
let infoPath: String = NSBundle.mainBundle().pathForResource("Info", ofType: "plist") as String!
// 讀取Dictionary格式的內容
infos = NSMutableDictionary(contentsOfFile: infoPath) as NSMutableDictionary!
// 獲取CFBundleName資訊
let bundleName: String = infos["CFBundleName"] as! String
print(bundleName)
對NSBundle中檔案寫入內容的方式與其他檔案一樣。見下文。
一般載入xib檔案也是通過NSBundle來獲取:
var nibs: [AnyObject] = NSBundle.mainBundle().loadNibNamed("testNib", owner: nil, options: nil)
var testNib: UIView = nibs.last as! UIView
檔案讀寫
檔案讀寫是非常基本的一種操作,iOS中常用contentsOfFile,writeToFile等類似的方法實現。
首先獲取檔案路徑:
let docPath: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
let filePath: String = docPath.stringByAppendingString("/filename")
在SandBox的Documents目錄下找到filename檔案,如沒有則新建一個。
讀檔案
讀取String:
var content = String(contentsOfFile: filePath, encoding: NSUTF8StringEncoding)
var content = String(data: NSData(contentsOfFile: filePath)!, encoding: NSUTF8StringEncoding)!
讀取NSArray, NSDictionary, NSData:
var array = NSArray(contentsOfFile: filePath)
var dict = NSDictionary(contentsOfFile: filePath)
var data = NSData(contentsOfFile: filePath)
讀取圖片:
let imagePath: String = NSBundle.mainBundle().pathForResource("Image", ofType: "jpg") as String!
var image: UIImage = UIImage(contentsOfFile: imagePath)!
// 通過NSData來讀取
var data: NSData = NSData(contentsOfFile: imagePath)!
image = UIImage(data: data)!
讀取網路圖片:
var url: NSURL = NSURL(string: "http://imgphoto.gmw.cn/attachement/jpg/site2/20151010/eca86bd9dc471782b9ff28.jpg")!
data = NSData(contentsOfURL: url)!
image = UIImage(data: data)!
寫檔案
寫入String:
try "testing content again".writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
// 通過NSData方式寫入String
var data = NSMutableData()
data.appendData("testing content".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)
data.writeToFile(filePath, atomically: true)
寫入NSArray, NSDictionary, NSData:
array.writeToFile(filePath, atomically: true)
dict.writeToFile(filePath, atomically: true)
data.writeToFile(filePath, atomically: true)
儲存圖片
儲存圖片通常使用NSData的格式向檔案中寫入。
let docPath: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
imagePath = docPath.stringByAppendingString("/testImage.jpg")
data.writeToFile(imagePath, atomically: true)
image = UIImage(contentsOfFile: imagePath)!
data = NSData(data: UIImagePNGRepresentation(image)!)
// UIImageJPEGRepresentation(image, 1.0) // JPEG比PNG格式壓縮更多
var imagePath2: String = docPath.stringByAppendingString("/testImage2.png")
data.writeToFile(imagePath2, atomically: true)
image = UIImage(contentsOfFile: imagePath2)!