沙盒機制
- 每個應用都有自己獨立的存儲空間
- 應用不能翻過圍墻去訪問別的存儲空間
- 應用請求的數(shù)據(jù)都要進行權限檢查剥啤,如果不符合钮追,就不會被放行
ios app只能在自己的沙盒目錄下讀取文件,在沙盒中锄蹂,bundle container存放的是應用的bundle狼牺,而data container存放的是應用數(shù)據(jù)和用戶數(shù)據(jù)兩者,data container又會被細分成各個子目錄用于管理數(shù)據(jù)事示,應用也會有額外的container,比如說icloud container早像;下圖描述了一個應用中的沙盒目錄(圖片來自官方開發(fā)文檔)
ios app's sandbox
獲取模擬器沙盒目錄
有多重方法可以定位到沙盒目錄
- SimPholders 官方下載網(wǎng)址,裝完之后工具欄中多了個方方的圖標肖爵,點擊之后卢鹦,再點擊你要查看的應用名,就可以進入到應用的沙盒劝堪;或者到模擬器中選擇任個應用查看
- 在個人用戶名文件夾下的一個隱藏文件夾里冀自,中文叫資源庫,如何顯示隱藏的文件夾秒啦,可以在終端輸入
defaults write com.apple.finder AppleShowAllFiles -bool true
如果想取消熬粗,不顯示隱藏文件夾,在終端輸入
defaults write com.apple.finder AppleShowAllFiles -bool false
重新啟動Finder:鼠標單擊窗口左上角的蘋果標志->強制退出->Finder
雖然網(wǎng)上很多說是在/Application Support/iPhone Simulator/...余境,但是我的目錄地址就不是驻呐,所以覺著最保險的是還是在代碼里面敲上
NSString *directory = NSHomeDirectory();
NSLog(@"directory:%@",directory);
獲取到目錄地址再找
- 也可以在xcode中直接用命令行po NSTemporaryDirectory()
- 在Finder上點->前往->前往文件夾灌诅,輸入上述的目錄地址,就可以定位到了
獲取真機沙盒內(nèi)容
打開device
在xcode上部導航欄中選擇window->Devices
找到app,瀏覽沙盒目錄結構
在installed Apps一欄中找到app,雙擊可以查看含末;或者在選中app后猜拾,點擊下方設置按鈕中 Show Container,也可以瀏覽
查看具體文件
選中app后,在設置中選擇Download Container佣盒,下載文件后挎袜,右鍵選擇顯示包內(nèi)容即可看到文件內(nèi)容
目錄說明
目錄 | 介紹 |
---|---|
AppName.app | 應用的buddle,包括app和它內(nèi)部的資源肥惭。你不能往這個目錄中寫數(shù)據(jù)盯仪,為了防止你這樣干,在安裝的時候蜜葱,該目錄被重簽名 |
Documents/ | 用來存儲用戶建立或瀏覽生成的數(shù)據(jù)全景, 這些數(shù)據(jù)都是你愿意暴露給用戶的,itunes會自動備份這里面的文件 |
Library/ | 存放不是用戶數(shù)據(jù)笼沥,是你不希望暴露給用戶的蚪燕;ios通常建立 Application Support 和Caches 這2個子目錄娶牌,你也可以建立其他子目錄奔浅,除Caches中內(nèi)容其他會被itunes備份 |
Library/Caches | 存放緩存文件,iTunes不會備份此目錄诗良,此目錄下文件不會在應用退出刪除 |
tmp/ | 存放臨時文件汹桦,在app退出后,此目錄下文件會被清除鉴裹,不會被itunes備份 |
獲取到各個目錄
- 獲取沙盒根目錄
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"homeDirectory:%@", homeDirectory);
- 獲取document目錄
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [documentPaths objectAtIndex:0];
NSLog(@"documentPath:%@", documentPath);
- 獲取Library目錄
NSArray *libraryPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryPath = [libraryPaths objectAtIndex:0];
NSLog(@"libraryPath:%@", libraryPath);
- 獲取Cache目錄
NSArray *cachePaths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [cachePaths objectAtIndex:0];
NSLog(@"cachePath:%@", cachePath);
- 獲取Tmp目錄
NSString *tmpPath = NSTemporaryDirectory();
NSLog(@"tmpPath:%@", tmpPath);
- bundle路徑
NSString *bundlePath = [[NSBundle mainBundle] resourcePath];
NSLog(@"%@",bundlePath);
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
NSLog(@"%@",imagePath);