您好,登錄后才能下訂單哦!
IOS中的沙盒機制(SandBox)是一種安全體系,它規定了應用程序只能在為該應用創建的文件夾內讀取文件,不可以訪問其他地方的內容。所有的非代碼文件都保存在這個地方,比如圖片、聲音、屬性列表和文本文件等。
1.每個應用程序都在自己的沙盒內
2.不能隨意跨越自己的沙盒去訪問別的應用程序沙盒的內容
3.應用程序向外請求或接收數據都需要經過權限認證
查看模擬器的沙盒文件夾在Mac電腦上的存儲位置,首先,這個文件夾是被隱藏的,所以要先將這些文件顯示出來,打開命令行:
顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
然后重新啟動Finder,點擊屏幕左上角蘋果標志——強制退出——選擇Finder然后點擊重新啟動,這個時候在重新打開Finder就可以看到被隱藏的文件了。
還有一種比較簡單的辦法就是直接點擊Finder圖標右鍵——前往文件夾——輸入/Users/your username/Library/Application Support/iPhone Simulator/ ,然后確認就可以了。your username是你本機的用戶名
然后按下圖進入相應的文件夾,就可以到模擬器的沙盒文件目錄了:
接著進入一個模擬器版本,我這里是5.1
然后可以看到Applications下面存放的就是模擬器中所裝的開發的應用程序,隨便進入一個后可以看到,一個沙盒中包含了四個部分,如圖所示:
分別是
.app文件:這個就是可運行的應用文件,
Documents:蘋果建議將程序中創建的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄;
Library:存儲程序的默認設置或其它狀態信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除;
Library/Preferences:?
tmp:創建和存放臨時文件的地方,但不需要持久化,在應用關閉后,該目錄下的數據將刪除,也可能系統在程序不運行的時候清除。
注意:這里很容易和bundle混淆在一起,下面根據自己的一點理解說明二者的區別:
bundle :生成 iOS 應用程序時,Xcode 將它捆綁成一個包。捆綁包 (bundle) 是文件系統中的一個目錄,它將相關資源成組在一個地方。一個 iOS 應用程序捆綁包中,含有其可執行文件和支持資源文件(如應用程序圖標、圖像文件和已本地化的內容)。
A bundle(包裹、捆、束) is a directory with a standardizedhierarchical structure that holds executable code and the resources used by that code.
所以可以將整個應用程序其實就可以看做一個bundle。
沙箱的概念和bundle沒直接關系,沙箱只是說明程序資源與外界隔離
這個問題對于新手來說很容易理解錯誤
下面通過一個簡單的例子說明一下bundle和sandbox。
//新建的plist文件是在應用程序中的,可以通過bundle存取到該文件 NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"MyPlist" ofType:@"plist"]; NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath]; //向數組中新添加一個項目 [array addObject:@"3"]; //重新寫回plist文件中 BOOL value = [array writeToFile:plistPath atomically:YES]; if (value) { NSMutableArray *newArray = [NSMutableArray arrayWithContentsOfFile:plistPath]; NSLog(@"new array = %@",newArray); } /* 輸出: new array = ( 0, 1, 2, 3 ) */ //獲取沙箱中document的path NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *newPath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"]; //將數組寫入到沙箱的document中的data.plist文件中 [array writeToFile:newPath atomically:YES]; NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile:newPath]; NSLog(@"array in data.plist = %@",arr); /* 輸出: array in data.plist = ( 0, 1, 2, 3 ) */
說明:我們首先在項目中新建一個plist文件(root項的類型為數組),添加了3個元素。因為新建的plist文件是在應用程序中的,我們可以通過bundle獲取到這個plist文件,讀取出這個數組,添加一個數據元素后,重新寫回plist文件中。接著我們獲取沙箱document的path,然后將這個文件寫入到沙箱中的data.plist文件中(如果不存在,會自動新建一個的),然后再從data.plist讀取出這個數組。
關于新建的MyPlist.plist文件,我們寫回文件的數組中添加了一項新的元素,但是我們在xcode中查看這個MyPlist.plist文件時,發現并沒有顯示出新增的數組元素,但是我們到沙箱中查看就可以看到了,這個估計是xoode本身的問題。
關于document中data.plist文件查看我們也可以到沙箱中進行查看。如下圖:
下面通過代碼來獲取這些目錄:
//得到app包的路徑 NSString *appPath = [[NSBundle mainBundle]resourcePath];
//獲取根目錄 NSString *homePath = NSHomeDirectory(); NSLog(@"Home目錄:%@",homePath);
//獲取Documents文件夾目錄,第一個參數是說明獲取Doucments文件夾目錄,第二個參數說明是在當前應用沙盒中獲取,所有應用沙盒目錄組成一個數組結構的數據存放 NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsPath = [docPath objectAtIndex:0]; NSLog(@"Documents目錄:%@",documentsPath); //獲取Cache目錄 NSArray *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachePath = [cacPath objectAtIndex:0]; NSLog(@"Cache目錄:%@",cachePath); //Library目錄 NSArray *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *libPath = [libsPath objectAtIndex:0]; NSLog(@"Library目錄:%@",libPath); //temp目錄 NSString *tempPath = NSTemporaryDirectory(); NSLog(@"temp目錄:%@",tempPath);
輸出結果如下:
2012-08-03 11:10:24.325 SandBoxTest[12549:f803] Home目錄:/Users/Ryan/Library/Application Support/iPhone Simulator/5.1/Applications/A6B99E5A-E2C7-46E9-867A-4E7619F0DA45
2012-08-03 11:10:24.325 SandBoxTest[12549:f803] Documents目錄:/Users/Ryan/Library/Application Support/iPhone Simulator/5.1/Applications/A6B99E5A-E2C7-46E9-867A-4E7619F0DA45/Documents
2012-08-03 11:10:24.326 SandBoxTest[12549:f803] Cache目錄:/Users/Ryan/Library/Application Support/iPhone Simulator/5.1/Applications/A6B99E5A-E2C7-46E9-867A-4E7619F0DA45/Library/Caches
2012-08-03 11:10:24.326 SandBoxTest[12549:f803] Library目錄:/Users/Ryan/Library/Application Support/iPhone Simulator/5.1/Applications/A6B99E5A-E2C7-46E9-867A-4E7619F0DA45/Library
2012-08-03 11:10:24.326 SandBoxTest[12549:f803] temp目錄:/var/folders/7z/1wj5h8zx7b59c02pxmpynd500000gn/T/
下面開始向目錄里面創建文件,然后向文件里面寫入內容:
NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsPath = [docPath objectAtIndex:0]; //寫入文件 if (!documentsPath) { NSLog(@"目錄未找到"); }else { NSString *filePaht = [documentsPath stringByAppendingPathComponent:@"test.txt"]; NSArray *array = [NSArray arrayWithObjects:@"Title",@"Contents", nil]; [array writeToFile:filePaht atomically:YES]; }
創建成功后打開文件夾目錄,可以看到test.txt文件:
接下來是把該文件中的內容讀出來:
//讀取文件 NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsPath = [docPath objectAtIndex:0]; NSString *readPath = [documentsPath stringByAppendingPathComponent:@"test.txt"]; NSArray *fileContent = [[NSArrayalloc] initWithContentsOfFile:readPath]; NSLog(@"文件內容:%@",fileContent);
輸出結果如下:
2012-08-03 11:26:53.594 SandBoxTest[12642:f803] 文件內容:(
Title,
Contents
)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。