iOS沙盒機制
沙盒機制
不好意思,我又一次來到了你們的世界,其實我是拒絕的,但是我的無法忍受內(nèi)心的躁動!額我TMD的在說什么胡話,bug改的腦子都壞了吧.回到正題今天要給大家分享的是iOS的沙盒機制.
先來看一張?zhí)O果官方文檔的圖吧.
1. 我們從這張圖可以看到,我們的每個應(yīng)用都分為Bundle Container和Data Container和iCloud Container三個文件,今天我們主要研究的是Data Container.可以看到三個目錄我們是否感覺非常熟悉,一個是Documents,一個是Library,一個是Temp文件. 2. 先不介紹這三個文件了,先學(xué)習(xí)一下沙盒機制吧.iOS應(yīng)用程序只能在改程序所創(chuàng)建的文件系統(tǒng)中讀取文件,不可以去訪問其他應(yīng)用的文件.此區(qū)域就成為沙盒.可以理解為一個密不透風(fēng)的盒子,你只能在這個盒子當(dāng)中讀取文件和存入文件,不能存到隔壁老王家的沙盒中.這些文件可以保存非代碼的文件,比如:圖像,圖標(biāo),聲音,映像,屬性列表,文本文件等. 3. 每個應(yīng)用程序都有自己的存儲空間,每個應(yīng)用程序不能翻過自己的圍墻去訪問別的存儲空間的內(nèi)容,應(yīng)用請求的數(shù)據(jù)都要通過權(quán)限檢測,假如沒有通過,就不能請求該文件的數(shù)據(jù).
通過下面的圖來看一下蘋果的沙盒機制吧.
通過這張圖只能從表層上理解sandbox是一種安全體系,應(yīng)用程序的所有操作都要通過這個體系來執(zhí)行,其中核心內(nèi)容是:sandbox對應(yīng)用程序執(zhí)行各種操作的權(quán)限限制。
沙盒目錄
剛才我們已經(jīng)看過了沙盒的目錄了,包含document,library,Temp三個文件,這三個文件一般是不可見的,有兩種方式可以查找文件的具體目錄:
1.1 可以設(shè)置顯示隱藏文件,然后在Finder下直接打開。設(shè)置查看隱藏文件的方法如下:打開終端,輸入命名 顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false 輸完單擊Enter鍵,退出終端, 重新啟動Finder就可以了重啟Finder:鼠標(biāo)單擊窗口左上角的蘋果標(biāo)志-->強制退出-->Finder--> 現(xiàn)在能看到資源庫文件夾了。
1.2 這種方法更方便,在Finder上點->前往->前往文件夾,輸入/Users/username/Library/Application Support/iPhone Simulator/ 前往。userName使用你的用戶名
如果你看了和我這張效果圖一樣的文件目錄層級,證明你已經(jīng)找到了沙盒文件的目錄.
沙盒文件各自的作用
documents:蘋果建議將程序中建立的活在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下,還有ituns備份的資料也放在該文件下.
library:存儲程序的默認(rèn)設(shè)置和其他信息.
library/Caches:存放緩存的文件,可以存儲一些緩存數(shù)據(jù).
library/Preferences:存放一些偏好設(shè)置等文件.
tmp:提供一個臨時創(chuàng)建文件的地方,在退出程序后刪除.
沙盒文件的操作
獲取程序的home目錄
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@", homeDirectory);
獲取document目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
獲取Cache目錄?
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
獲取Library目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
獲取Tmp目錄
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"%@", tmpDir);
寫入文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@"Documents 目錄未找到");
}
NSArray *array = [[NSArray alloc] initWithObjects:@"內(nèi)容",@"content",nil];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
[array writeToFile:filePath atomically:YES];
讀取文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
NSLog(@"%@", array);
使用NSFileManager進(jìn)行文件操作
在我這次做epub3于都器的時候遇到一個問題,就是使用af3.1.0后,af會將文件直接保存到document文件下,但是我想早document目錄下的用戶目錄下的用戶名目錄下的bookId目錄下保存文件,但是不知道到底怎么在document下創(chuàng)建子文件夾,最后通過查找資料和查看蘋果官方文檔最終完成了下載到指定文件目錄下.temp也類似,自己可以下去自己研究在這不做解釋.
保存文件到指定文件
NSString* filePath = [LQEpubFileManager getFilePathWithUserId:userId fileName:bookId];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError* error;
BOOL isSuccess = [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error];
NSString *path;
if (isSuccess == YES) {
? ? ?path = [filePath stringByAppendingPathComponent:response.suggestedFilename];
}
return [NSURL fileURLWithPath:path];
獲取目錄列所有文件名
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory%@",documentsDirectory);
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *myDirectory = [[documentsDirectory stringByAppendingPathComponent:@"weiqi"]stringByAppendingPathComponent:@"12306"];
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil]; NSLog(@"%@",file);
NSArray *files = [fileManage subpathsAtPath: myDirectory ];
NSLog(@"%@",files);
刪除文件
[fileManager removeItemAtPath:fileName error:nil];
總結(jié)
沙盒機制保證了我們每一個應(yīng)用程序的安全性,只能訪問自己沙盒文件下的文件.NSFileManager幫助哦我們很好的管理沙盒文件下的文件.對文件進(jìn)行操作使用NSFileManager操作沙盒文件十分簡單.今天就總結(jié)到這里.
本人聯(lián)系方式:qq:513961360
email:513961360@qq.com
也可以加我們的qq群希望能與朋友們一起聊天和學(xué)習(xí).群里還有很多iOS開發(fā)者,幫助我們解決問題,并且同時學(xué)習(xí).
qq群號:580284575