1、iOS沙盒機制原理
iOS應用程序只能在該程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。
1.1、每個應用程序都有自己的存儲空間
1.2、應用程序不能翻過自己的圍牆去訪問別的存儲空間的內容
1.3、應用程序請求的數據都要通過權限檢測,假如不符合條件的話,不會被放行。
通過這張圖只能從表層上理解sandbox是一種安全體系,應用程序的所有操作都要通過這個體系來執行,其中核心內容是:sandbox對應用程序執行各種操作的權限限制。
2.獲取應用軟件沙盒sandbox方法:
通過在iOS程序viewDidLoad中打印NSString *path = NSHomeDirectory(); 然后在Finder中前往該打印出的路徑,即可看到該程序的沙盒sandbox.
例如:/Users/wujia121/Library/Developer/CoreSimulator/Devices/3FDEE527-D4DB-492F-9490-1D04AF9559A8/data/Containers/Data/Application/82A190D8-C6F2-444F-90A5-17B051CC0021
(可見sandbox保存在Mac用戶文件夾下,而SDK保存在Xcode包content中)
3.iphone沙盒模型的有四個文件夾:
分別是 documents,Library,tmp,app包。 手動保存的文件在documents文件里,NSUserdefaults保存的文件在tmp文件夾里。
1、Documents 目錄:一般需要持久的數據都放在此目錄中,可以在當中添加子文件夾,iTunes備份和恢復的時候,會包括此目錄。您應該將所有de應用程序數據文件寫入到這個目錄下。這個目錄用於存儲用戶數據或其它應該定期備份的信息。
2、Library 目錄:這個目錄下有兩個子目錄:Caches 和 Preferences
Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.
Caches 目錄:用於存放應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。
3、tmp 目錄:這個目錄用於存放臨時文件,當iOS設備重啟時,文件會被自動清除。
4、AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序的本身。由於應用程序必須經過簽名,所以您在運行時不能對這個目錄中的內容進行修改,否則可能會使應用程序無法啟動。(Xcode 6以后似乎.app不保存在沙盒中)
4.獲取Sandbox下各文件夾路徑的方法:
//1. 沙盒根目錄/
NSString *homePath = NSHomeDirectory();
NSLog(@"homePath:%@",homePath);
//2. 沙盒/Documents/
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"docPath:%@",docPath);
//3. 沙盒/Library/
NSString *libPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"libPath:%@",libPath);
//3.1 沙盒/Library/Preferences
//NSString *preferPath = [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) firstObject];
//此方法獲取路徑是沙盒/Library/PreferencePanes並不存在這樣的路徑,想要訪問Preferences文件夾,需要拼接路徑。或者直接使用NSUserDefaults便可以在Preferences文件夾下創建plist文件。
NSString *preferPath = [libPath stringByAppendingPathComponent:@"Preferences"];
NSLog(@"preferPath:%@",preferPath);
//3.2 沙盒/Library/Cache
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"cachePath:%@",cachePath);
//4. 沙盒/tmp
NSString *tmpPath = NSTemporaryDirectory();
NSLog(@"tmpPath:%@",tmpPath);
//5. 打印xx.app位置
NSLog(@".appPath:%@",[[NSBundle mainBundle] bundlePath]);//打印app安裝包的在模擬器/手機上的位置(~users/Application文件夾下)
真機打印結果:
homePath: /var/mobile/Containers/Data/Application/849F64A3-BE4A-44FE-A789-6790A77E567A docPath: /var/mobile/Containers/Data/Application/849F64A3-BE4A-44FE-A789-6790A77E567A/Documents libPath: /var/mobile/Containers/Data/Application/849F64A3-BE4A-44FE-A789-6790A77E567A/Library preferPath: /var/mobile/Containers/Data/Application/849F64A3-BE4A-44FE-A789-6790A77E567A/Library/Preferences cachePath: /var/mobile/Containers/Data/Application/849F64A3-BE4A-44FE-A789-6790A77E567A/Library/Caches tmpPath: /private/var/mobile/Containers/Data/Application/849F64A3-BE4A-44FE-A789-6790A77E567A/tmp/ .appPath: /private/var/mobile/Containers/Bundle/Application/429B6769-6D90-4782-844C-CA95E8B28166/打印程序的沙盒地址2015.10.app
5.沙盒路徑截圖: