一、什么是沙盒(SandBox)
1、每一個iOS應(yīng)用程序都會為自己創(chuàng)建一個文件系統(tǒng)目錄(相當(dāng)于一個文件夾),這就是沙盒。
這里需要注意的就是應(yīng)用程序每運行一次,沙盒文件名稱就會發(fā)生改變。
2、應(yīng)用程序沙盒路徑
點擊桌面空白處==>點擊前往==>同時按住Alt鍵==>選中資源庫==>如下操作就可以找到該應(yīng)用程序的沙盒路徑了。
二、什么是沙盒機制
1、iOS中的沙盒機制是一種安全體系。
2、它規(guī)定了應(yīng)用程序只能在為該應(yīng)用程序創(chuàng)建的文件夾(沙盒)內(nèi)訪問文件,不可以訪問其他沙盒內(nèi)的內(nèi)容(在iOS8之后已經(jīng)部分開始訪問)。
3.所有的非代碼文件都保存在這個地方,比如圖片、聲音、屬性列表(plist)、sqlite數(shù)據(jù)庫和文本文件等。
特點
- 每個應(yīng)用程序的活動范圍都限定在自己的沙盒里
- 不能隨意跨越自己的沙盒去訪問別的應(yīng)用程序沙盒中的內(nèi)容(在iOS8之后已經(jīng)部分開始訪問)。
- 應(yīng)用程序向外請求或接收數(shù)據(jù)都需要經(jīng)過權(quán)限認(rèn)證,例如定位、麥克風(fēng)、相冊等訪問權(quán)限。
三、應(yīng)用程序的沙盒目錄
應(yīng)用程序的沙盒目錄下會有三個文件夾Documents、Library、tmp
- Documents:????????????????????????????????????????????????????????????????????????保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù),iTunes不會自動備份該目錄。
- Library:存儲程序的默認(rèn)設(shè)置和其他狀態(tài)信息,iTunes會自動備份該目錄。
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下的文件不會再應(yīng)用退出后刪除,一般存放體積比較大,不是特別重要的資源。
Library/Preferences:保存應(yīng)用的所有偏好設(shè)置,iOS的settings應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息,iTunes會自動備份該目錄。 - tmp:保存應(yīng)用運行時的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除,應(yīng)用沒有運行時,系統(tǒng)也有可能清除該目錄下的文件,iTunes不會自動備份該目錄。iphone重啟時,該目錄下的文件會被刪除,為了安全起見,我們不會把數(shù)據(jù)存放到tem中。
四、如何獲取沙盒路徑、Documents目錄、 Library目錄、tmp目錄
- 獲取沙盒路徑
//沙盒的主路徑
NSString* homePathString=NSHomeDirectory();
- 獲取Documents目錄
//documents路徑
//第一個參數(shù):要找尋的目標(biāo)文件
//第二個參數(shù):查找的范圍(要找尋的目標(biāo)文件夾的父級文件夾)
//第三個參數(shù):文件路徑是否展開
NSArray* documentsArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentPath=documentsArray.firstObject;
- 獲取Library目錄
//Library路徑
NSArray* libraryArray=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString* libraryPath=libraryArray.firstObject;
NSLog(@"libraryPath---%@",libraryPath);
//caches路徑
NSArray* cacheArray=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* cachesPath=cacheArray.firstObject;
NSLog(@"cachesPath----%@",cachesPath);
//preference路徑
NSString* preferencePath=[libraryPath stringByAppendingString:@"/preferences"];
NSLog(@"preferencePath----%@",preferencePath);
- 獲取tmp目錄
//tmp路徑
NSString* tmpPath=NSTemporaryDirectory();
五、簡單對象的讀取操作
1、NSString的寫入
#pragma mark------文件的寫入
-(void)writeToFile{
//將一段字符串寫入documents文件夾中
NSString* documentsPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//在上面的路徑下創(chuàng)建一個文件路徑用來盛放文字
NSString* txtPath=[documentsPath stringByAppendingPathComponent:@"string.txt"];
//將文字寫入文件中,當(dāng)文字寫入文件的時候,如果文件不存在,系統(tǒng)會先創(chuàng)建,在寫入;如果存在,直接寫入。新的內(nèi)容會將原來的內(nèi)容覆蓋掉
NSString* contentStr=@"我是文本內(nèi)容";
//寫入操作
//第一個參數(shù):文件路徑
//第二個參數(shù):原子性 YES:在寫入過程中會產(chǎn)生一個臨時文件,當(dāng)內(nèi)容寫入完整的時候,才會將內(nèi)容移動到目標(biāo)文件中 NO:直接在目標(biāo)文件上操作,不產(chǎn)生臨時文件,有可能損壞目標(biāo)文件
//第三個參數(shù):字符串的編碼格式
//第四個參數(shù):如果寫入出問題,這里會產(chǎn)生一個錯誤日志,一般不需要錯誤日志,直接賦值為nil
//error對象用來保存錯誤日志
NSError* error=nil;
BOOL isSuccsess=[contentStr writeToFile:txtPath atomically:YES encoding:(NSUTF8StringEncoding) error:&error];
//只知道寫入的結(jié)果,沒有失敗過程描述
if (isSuccsess) {
NSLog(@"成功");
}else{
NSLog(@"失敗");
}
}
運行后會在documents文件下顯示此文本,在這里我們也可以將文本格式改為.plist,它就會以xml格式存在。無論文本的后綴名是什么,我們都可以用文本編輯的方式打開,所以有時候,png不一定是圖片,也有可能是文本或其他格式。
屏幕快照 2016-12-07 下午8.54.32.png
屏幕快照 2016-12-07 下午9.00.12.png
2、NSString的讀取
#pragma mark------文件的讀取
-(void)readFile{
//要讀取文件的路徑
NSString* docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString* txtPath=[docPath stringByAppendingPathComponent:@"string.txt"];
//讀取文件
NSString* readStr=[NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"我是讀出來的---%@",readStr);
}
同理,其他類型的數(shù)據(jù)寫入和讀取的時候都是類似的,只是方法不同而已,下面是幾種數(shù)據(jù)寫入和讀取的方法
屏幕快照 2016-12-07 下午9.14.28.png
3、相對于以上幾種NSData會比較特殊些,例如圖片的寫入
#pragma mark------圖片的寫入
-(void)imgWriteToFile{
//document路徑
NSArray* pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//在上面的路徑下創(chuàng)建一個文件路徑用來盛放圖片
NSString* docPath=pathArray.firstObject;
NSString* imgPath=[docPath stringByAppendingString:@"/333.png"];
//圖片寫入
//將圖片轉(zhuǎn)換為NSData類型
UIImage* img=[UIImage imageNamed:@"10.JPG"];
NSData* imgData=UIImageJPEGRepresentation(img, 1.0);
[imgData writeToFile:imgPath atomically:YES];
}
屏幕快照 2016-12-07 下午9.20.24.png
以上幾種方法均要在ViewDidLoad中調(diào)用才可以實現(xiàn)