【理解】 iOS沙箱(sandbox)機制(一)
1、IOS沙箱機制
IOS應用程式只能在為該改程式建立的檔案系統中讀取檔案,不可以去其它地方訪問,此地區被成為沙箱,所以所有的非代碼檔案都要儲存在此,例像,表徵圖,聲音,映像,屬性列表,文字檔等。
1.1、每個應用程式都有自己的儲存空間
1.2、應用程式不能翻過自己的圍牆去訪問別的儲存空間的內容
1.3、應用程式請求的資料都要通過許可權檢測,假如不合格話,不會被允許存取。
通過這張圖只能從表層上理解sandbox是一種安全體系,應用程式的所有操作都要通過這個體系來執行,其中核心內容是:sandbox對應用程式執行各種操作的許可權限制。
2、開啟模擬器沙箱目錄
下面看看模擬器的沙箱檔案夾在mac電腦上的什麼位置。
檔案都在個人使用者名稱檔案夾下的一個隱藏檔案夾裡,中文叫資產庫,他的目錄其實是Library。
2.1 方法1、可以設定顯示隱藏檔案,然後在Finder下直接開啟。設定查看隱藏檔案的方法如下:開啟終端,輸入命名
顯示Mac隱藏檔案的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隱藏Mac隱藏檔案的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
輸完單擊Enter鍵,退出終端,重新啟動Finder就可以了 重啟Finder:按一下滑鼠視窗左上方的蘋果標誌-->強制退出-->Finder-->
現在能看到資產庫檔案夾了。
開啟資產庫後找到/Application Support/iPhone Simulator/檔案夾。這裡面就是模擬器的各個程式的沙箱目錄了。
2.2 方法2、這種方法更方便,在Finder上點->前往->前往檔案夾,輸入/Users/username/Library/Application Support/iPhone Simulator/ 前往。
username這裡寫你的使用者名稱。
3、目錄結構
預設情況下,每個沙箱含有3個檔案夾:Documents, Library 和 tmp。因為應用的沙箱機制,應用只能在幾個目錄下讀寫檔案
Documents:蘋果建議將程式中建立的或在程式中瀏覽到的檔案資料儲存在該目錄下,iTunes備份和恢複的時候會包括此目錄
Library:儲存程式的預設設定或其它狀態資訊;
Library/Caches:存放快取檔案,iTunes不會備份此目錄,此目錄下檔案不會在應用退出刪除
tmp:提供一個即時建立臨時檔案的地方。
iTunes在與iPhone同步時,備份所有的Documents和Library檔案。
iPhone在重啟時,會丟棄所有的tmp檔案。
我們建立一個IosSandbox的項目來展開沙箱和檔案讀寫等操作的練習。
建立後找到模擬器上對應的目錄,
這是目錄全展開了。
這是上面提到的三個目錄 :Documents、Library、tmp
1、擷取程式的Home目錄
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString*path=[pathsobjectAtIndex:0]; NSLog(@"path:%@",path); 列印結果:
[cpp]view plaincopy 2012-06-1714:00:06.098IosSandbox[3536:f803]/Users/rongfzh/Library/ApplicationSupport/iPhoneSimulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2
那在真機上的目錄有是怎麼樣的呢?我們看看
2012-06-17 14:25:47.059 IosSandbox[4281:f803]/var/mobile/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2
可見,真機上的目錄是/var/mobile/Applications/這個目錄下的,和模擬器不一樣。這個是Home目錄,其他的子目錄和模擬器一樣。
2、擷取document目錄NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString*path=[pathsobjectAtIndex:0]; NSLog(@"path:%@",path); 列印結果 2012-06-1714:00:06.099IosSandbox[3536:f803]path:/Users/rongfzh/Library/ApplicationSupport/iPhoneSimulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Documents 3、擷取Cache目錄 NSArray*paths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES); NSString*path=[pathsobjectAtIndex:0]; NSLog(@"%@",path); 列印結果
2012-06-1714:03:50.431IosSandbox[3628:f803]/Users/rongfzh/Library/ApplicationSupport/iPhoneSimulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library/Caches
4、擷取Library目錄 NSArray*paths=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES); NSString*path=[pathsobjectAtIndex:0]; NSLog(@"%@",path); 列印結果 2012-06-1714:07:17.544IosSandbox[3733:f803]/Users/rongfzh/Library/ApplicationSupport/iPhoneSimulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library 5、擷取Tmp目錄 NSString*tmpDir=NSTemporaryDirectory(); NSLog(@"%@",tmpDir); 列印結果 2012-06-1714:08:07.824IosSandbox[3782:f803]/var/folders/g7/246bh79130zblw0yjjtc55cw0000gn/T/ 6、寫入檔案 NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString*docDir=[pathsobjectAtIndex:0]; if(!docDir){ NSLog(@"Documents目錄未找到"); } NSArray*array=[[NSArrayalloc]initWithObjects:@"內容",@"content",nil]; NSString*filePath=[docDirstringByAppendingPathComponent:@"testFile.txt"]; [arraywriteToFile:filePathatomically:YES];
註:我們在真機上也運行一下,把檔案寫入,下一步從真機上把內容讀取出來。
寫入輸入 array ,裡面是兩個字串,一會我們讀出來列印。
寫入我們在程式沙箱目錄下看到檔案 testFile.txt
開啟檔案看到的內容是這樣的,是個xml格式的plist檔案,資料格式儲存了內容。
7、讀取檔案NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString*docDir=[pathsobjectAtIndex:0]; NSString*filePath=[docDirstringByAppendingPathComponent:@"testFile.txt"]; NSArray*array=[[NSArrayalloc]initWithContentsOfFile:filePath]; NSLog(@"%@",array); 列印結果:
把上面的檔案解析後,把內容列印出來了。
2012-06-1714:14:46.249IosSandbox[3918:f803]( "\U5185\U5bb9", content )