當前位置:成語大全網 - 書法字典 - ios的應用沙箱運行情況如何?

ios的應用沙箱運行情況如何?

1,IOS沙盒機制

IOS應用程序只能讀取在此應用程序中創建的文件系統中的文件,而不能在其他任何地方訪問它們。這個區域叫做沙箱,所有非代碼文件都要保存在這裏,比如圖片、圖標、聲音、圖像、屬性列表、文本文件等。

1.1,每個應用都有自己的存儲空間。

1.2.應用程序不能翻越自己的墻來訪問其他存儲空間的內容。

1.3,應用請求的數據必須通過權限檢查,不符合條件的,不予發布。

從這張圖我們只能理解為沙盒表面上是壹個安全系統,應用的所有操作都必須通過這個系統進行,其核心內容是:沙盒對應用進行各種操作的權限。

2.打開模擬器沙盒目錄。

我們來看看模擬器的沙盒文件夾在mac電腦上的什麽位置。

這些文件都在個人用戶名文件夾下的隱藏文件夾中。中文名是資源庫,英文名是Library。

這裏有壹個簡單的方法來找到這個文件夾:點擊->在Finder上。轉到-& gt;轉到文件夾

進入模擬器後,包含了每個應用的沙箱。

進入壹個應用,如下圖,是壹個沙盒。

下面是沙箱的目錄結構:

默認情況下,每個沙箱包含三個文件夾:Documents、Library和tmp以及壹個應用程序文件(也是壹個文件)。由於應用程序的沙箱機制,應用程序只能讀寫幾個目錄中的文件。

文檔:蘋果建議將程序中創建或瀏覽的文件數據保存在該目錄下,這些數據將包含在iTunes備份和恢復中。

庫:存儲程序的默認設置或其他狀態信息;

庫/緩存:存儲緩存文件。iTunes不會備份此目錄,當應用程序退出時,此目錄中的文件也不會被刪除。

Tmp:提供壹個即時創建臨時文件的地方。

與iPhone同步時,ITunes會備份所有文稿和資料庫文件。

當iPhone重啟後,所有的tmp文件都將被丟棄。

註意:這裏很容易混淆bundle。下面根據我自己的理解來解釋壹下兩者的區別:

Bundle:當壹個iOS應用生成後,Xcode將其捆綁成壹個包。包是文件系統中的壹個目錄,它將相關的資源集中在壹個地方。iOS應用程序包包含其可執行文件和支持資源文件(如應用程序圖標、圖像文件和本地化內容)。

包是壹個具有標準化層次結構的目錄,它保存可執行代碼和該代碼使用的資源。

因此,您可以將整個應用程序視為壹個包。

沙盒的概念與bundle無關,它只是意味著程序資源與外界隔離。

讓我們通過壹個簡單的例子來解釋bundle和sandbox。

//新創建的plist文件在應用程序中,可以通過bundle訪問。

ns string * plist path =[[ns bundle main bundle]path for resource:@ " my plist " of type:@ " plist "];

NSMutableArray * array =[NSMutableArray arraywithcontentsofile:plist path];

//向數組中添加新項。

[array add object:@ " 3 "];

//寫回plist文件。

BOOL value =[array write tofile:plist path atomically:YES];

如果(值){

NSMutableArray * new array =[NSMutableArray arraywithcontentsofile:plist path];

NSLog(@ "新數組= %@ ",new array);

}

/*輸出:

新數組=(

0,

1,

2,

)

*/

//獲取沙箱中文檔的路徑

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

ns string * documents directory =[paths objectAtIndex:0];

ns string * new path =[documents directory stringByAppendingPathComponent:@ " data . plist "];

//將數組寫入沙箱的文檔中的data.plist文件。

[array write to file:new path atomically:YES];

NSMutableArray * arr =[[NSMutableArray alloc]initwithcontentsofile:new path];

NSLog(@"array in data.plist = %@ ",arr);

/*輸出:

data.plist =(

0,

1,

2,

)

*/

描述:我們首先在項目中創建壹個新的plist文件(根項的類型是array)並添加三個元素。因為新創建的plist文件在應用程序中,所以我們可以通過bundle獲取plist文件,讀取數組,添加壹個數據元素,並將其寫回到plist文件中。然後我們獲取沙盒文檔的路徑,然後將這個文件寫入沙盒中的data.plist文件(如果不存在,會自動新建壹個),然後從data.plist中讀取這個數組。

關於新創建的MyPlist.plist文件,我們在文件的數組中添加了壹個新元素,但是當我們在xcode中查看這個MyPlist.plist文件時,發現新添加的數組元素並沒有顯示出來,但是在沙箱中查看時可以看到。這個估計是xoode本身的問題。

我們還可以在沙盒中查看文檔中的data.plist文件。如下圖所示:

3.獲取沙盒目錄:

//1,獲取程序的主目錄。

ns string * home directory = nshome directory();

NSLog(@“路徑:%@”,home directory);

//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671

//2.獲取文檔目錄。

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

ns string * path =[paths objectAtIndex:0];

NSLog(@“路徑:%@”,路徑);

//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/Documents

//3.獲取緩存目錄。

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);

ns string * path =[paths objectAtIndex:0];

NSLog(@“路徑:%@”,路徑);

//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/Library/Caches

//4、獲取庫目錄

NSArray * paths = NSSearchPathForDirectoriesInDomains(nslibrary directory,NSUserDomainMask,YES);

ns string * path =[paths objectAtIndex:0];

NSLog(@“路徑:%@”,路徑);

//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/Library

//5.獲取tmp目錄。

ns string * tmpDir = NSTemporaryDirectory();

NSLog(@ "路徑:%@ ",tmpDir);

//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/tmp/

4.文件操作的NSFileManager

4.1.在文檔中創建壹個文件目錄。

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

ns string * documents directory =[paths objectAtIndex:0];

NSLog(@“documents directory % @”,documents directory);

NSFileManager * file manager =[NSFileManager default manager];

ns string * test directory =[documents directory stringByAppendingPathComponent:@ " test "];

//創建壹個目錄

[file manager createDirectoryAtPath:test directory within intermediated directory:YES attributes:nil error:nil];

4.2.在測試目錄中創建文件。

如果我創建壹個文件呢?然後上面的代碼testPath要用stringByAppendingPathComponent拼接生成文件名,比如Test11.txt,這樣就可以在測試目錄下寫文件了。

TestDirectory是上面代碼生成的路徑。哦,別忘了。我在測試文件夾裏寫了三個文件,test11.txt,test22.txt,text.33.txt,東西都寫好了,寫String。

實現代碼如下:

ns string * testpath 1 =[test directory stringByAppendingPathComponent:@ " test 1 . txt "];

ns string * test path 2 =[test directory stringByAppendingPathComponent:@ " test 2 . txt "];

ns string * test path 3 =[test directory stringByAppendingPathComponent:@ " test 3 . txt "];

NSString *string = @ "寫內容,寫字符串";

[file manager createFileAtPath:testpath 1內容:[string data using encoding:nsu TF 8 string encoding]屬性:nil];

[file manager createFileAtPath:testpath 2內容:[string data using encoding:nsu TF 8 string encoding]屬性:nil];

[file manager createFileAtPath:testpath 3內容:[string data using encoding:nsu TF 8 string encoding]屬性:nil];

4.3獲取目錄列中的所有文件名

有兩種獲取方式:subpathsOfDirectoryAtPath和subpathsAtPath。

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

ns string * documents directory =[paths objectAtIndex:0];

NSLog(@“documents directory % @”,documents directory);

NSFileManager * file manager =[NSFileManager default manager];

ns string * my directory =[documents directory stringByAppendingPathComponent:@ " test "];

//方法1

NSArray * file =[file manage subpathsOfDirectoryAtPath:my directory error:nil];

NSLog(@“% @”,文件);

//方法2

NSArray * files =[file manage subpath sat path:my directory];

NSLog(@“% @”,文件);

獲取剛才測試目錄中的所有文件名:

兩種方法都是輸出。

" test1.txt ",

" test2.txt ",

" test3.txt "

)

4.4.fileManager使用當前目錄進行操作。

//創建文件管理器

NSFileManager * file manager =[NSFileManager default manager];

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

ns string * documents directory =[paths objectAtIndex:0];

//切換到要操作的目錄。

[file manager change current directory path:[documents directory stringByExpandingTildeInPath]];

//創建文件fileName文件名,contents文件內容,如果壹開始沒有內容,可以設置為nil的屬性,attributes file,initially nil。

ns string * fileName = @ " testfilensfilemanager . txt ";

NSArray * array =[[NSArray alloc]initWithObjects:@ " hello world " ,@ " hello world 1 " ,@ " hello world 2 ",nil];

//下面是將數組類型轉換為NSData類型。

NSMutableData * data =[[NSMutableData alloc]init];

for(int I = 0;我& lt[數組計數];++i ){

ns string * str =[array objectAtIndex:I];

ns data * temp =[str data using encoding:nsu TF 8 string encoding];

[data appendData:temp];

}

//註意,contents參數的類型是NSData。

[文件管理器創建文件路徑:文件名內容:數據屬性:空];

4.5刪除文件

然後上面的代碼就可以刪除新創建的testFileNSFileManager.txt文件了!

[文件管理器removeItemAtPath:文件名錯誤:nil];

4.6讀寫混合數據請參考原文最後壹部分。