1. 程式人生 > >【理解】 iOS沙盒(sandbox)機制(一)

【理解】 iOS沙盒(sandbox)機制(一)

 IOS應用程式只能在為該改程式建立的檔案系統中讀取檔案,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非程式碼檔案都要儲存在此,例如影象,圖示,聲音,映像,屬性列表,文字檔案等。

 1.1、每個應用程式都有自己的儲存空間
 1.2、應用程式不能翻過自己的圍牆去訪問別的儲存空間的內容
 1.3、應用程式請求的資料都要通過許可權檢測,假如不符合條件的話,不會被放行。
     通過這張圖只能從表層上理解sandbox是一種安全體系,應用程式的所有操作都要通過這個體系來執行,其中核心內容是:sandbox對應用程式執行各種操作的許可權限制。

2、開啟模擬器沙盒目錄

下面看看模擬器的沙盒資料夾在mac電腦上的什麼位置。

檔案都在個人使用者名資料夾下的一個隱藏資料夾裡,中文叫資源庫,他的目錄其實是Library。

2.1 方法1、可以設定顯示隱藏檔案,然後在Finder下直接開啟。設定檢視隱藏檔案的方法如下:開啟終端,輸入命名

<span style="font-family:Times New Roman;font-size:18px;"><p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 15px;"><span style="padding: 0px; margin: 0px;">顯示Mac隱藏檔案的命令:defaults write com.apple.finder AppleShowAllFiles -bool true</span></p>
<p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 15px;"><span style="padding: 0px; margin: 0px;">隱藏Mac隱藏檔案的命令:defaults write com.apple.finder AppleShowAllFiles -bool false</span></p>
<p style="padding-top: 0px; padding-bottom: 0px; margin-top: 0px; margin-bottom: 15px;"><span style="padding: 0px; margin: 0px;">輸完單擊Enter鍵,退出終端,重新啟動Finder就可以了</span><span style="padding: 0px; margin: 0px;"> 重啟Finder:滑鼠單擊視窗左上角的蘋果標誌-->強制退出-->Finder--></span></p>
</span>
現在能看到資源庫檔案夾了。

開啟資源庫後找到/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目錄

  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  2. NSString *path = [paths objectAtIndex:0];  
  3. NSLog(@"path:%@", path);  
列印結果: 
  1. 2012-06-17 14:00:06.098 IosSandbox[3536:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/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目錄
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  2. NSString *path = [paths objectAtIndex:0];  
  3. NSLog(@"path:%@", path);  
列印結果
  1. 2012-06-17 14:00:06.099 IosSandbox[3536:f803] path:/Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Documents  
3、獲取Cache目錄
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);  
  2. NSString *path = [paths objectAtIndex:0];  
  3. NSLog(@"%@", path);  
列印結果 
  1. 2012-06-17 14:03:50.431 IosSandbox[3628:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library/Caches  

4、獲取Library目錄
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);  
  2. NSString *path = [paths objectAtIndex:0];  
  3. NSLog(@"%@", path);  
列印結果 
  1. 2012-06-17 14:07:17.544 IosSandbox[3733:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2/Library  
5、獲取Tmp目錄
  1. NSString *tmpDir = NSTemporaryDirectory();  
  2.  NSLog(@"%@", tmpDir);  
列印結果
  1. 2012-06-17 14:08:07.824 IosSandbox[3782:f803] /var/folders/g7/246bh79130zblw0yjjtc55cw0000gn/T/  
6、寫入檔案
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  2.     NSString *docDir = [paths objectAtIndex:0];  
  3.     if (!docDir) {  
  4.         NSLog(@"Documents 目錄未找到");          
  5.     }  
  6.     NSArray *array = [[NSArray alloc] initWithObjects:@"內容",@"content",nil];  
  7.     NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];  
  8.     [array writeToFile:filePath atomically:YES];  

注:我們在真機上也執行一下,把檔案寫入,下一步從真機上把內容讀取出來。

寫入輸入 array ,裡面是兩個字串,一會我們讀出來列印。

寫入我們在程式沙盒目錄下看到檔案 testFile.txt

 

開啟檔案看到的內容是這樣的,是個xml格式的plist檔案,資料格式儲存了內容。

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
  3. <plist version="1.0">  
  4. <array>  
  5.     <string>內容</string>  
  6.     <string>content</string>  
  7. </array>  
  8. </plist>  
7、讀取檔案
  1. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  2.     NSString *docDir = [paths objectAtIndex:0];  
  3.     NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];  
  4.     NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];  
  5.     NSLog(@"%@", array);  
列印結果:

把上面的檔案解析後,把內容打印出來了。

  1. 2012-06-17 14:14:46.249 IosSandbox[3918:f803] (  
  2.     "\U5185\U5bb9",  
  3.     content  
  4. )