【iOS_Development】iOS沙盒目錄簡述

  • 出于安全考慮,iOS系統(tǒng)的沙盒機制規(guī)定每個應用都只能訪問當前沙盒目錄下面的文件(也有例外,比如系統(tǒng)通訊錄能在用戶授權的情況下被第三方應用訪問),這個規(guī)則把iOS系統(tǒng)的封閉性展現(xiàn)的淋漓盡致,每一個APP都有一個存儲空間,就是沙盒,APP之間不能相互通信。

沙盒中幾個主要的目錄

每個沙盒下面都有相似的目錄結構,如下圖所示(出自蘋果官方文檔),每個應用的沙盒目錄都是相似的,主要包含圖中所示的4個目錄


1、MyApp.app

①存放內(nèi)容
??該目錄包含了應用程序本身的數(shù)據(jù),包括資源文件和可執(zhí)行文件等,程序啟動以后,會根據(jù)需要從該目錄中動態(tài)加載代碼或資源到內(nèi)存,這里用到了lazy loading的思想。
②整個目錄是只讀的
??為了防止被篡改,應用在安裝的時候會將該目錄簽名,非越獄情況下,該目錄中內(nèi)容是無法更改的,在越獄設備上如果更改了目錄內(nèi)容,對應的簽名就會被改變,這種情況下蘋果官網(wǎng)描述的后果是應用程序?qū)o法啟動,我沒實踐過。
③是否會被iTunes同步
??否

2、Documents

①存放內(nèi)容
??我們可以將應用程序的數(shù)據(jù)文件保存在該目錄下。不過這些數(shù)據(jù)類型僅限于不可再生的數(shù)據(jù),可再生的數(shù)據(jù)文件應該存放在Library/Cache目錄下。
②是否會被iTunes同步
??是

3、Documents/Inbox

①存放內(nèi)容
?? 該目錄用來保存由外部應用請求當前應用程序打開的文件。
??比如我們的應用叫A,向系統(tǒng)注冊了幾種可打開的文件格式,B應用有一個A支持的格式的文件F,并且申請調(diào)用A打開F。由于F當前是在B應用的沙盒中,我們知道,沙盒機制是不允許A訪問B沙盒中的文件,因此蘋果的解決方案是講F拷貝一份到A應用的Documents/Inbox目錄下,再讓A打開F。
②是否會被iTunes同步
??是

4、Library

①存放內(nèi)容
??蘋果建議用來存放默認設置或其它狀態(tài)信息。
②是否會被iTunes同步
??是,但是要除了Caches子目錄外

5、Library/Caches

①存放內(nèi)容
??主要是緩存文件,用戶使用過程中緩存都可以保存在這個目錄中。前面說過,Documents目錄用于保存不可再生的文件,那么這個目錄就用于保存那些可再生的文件,比如網(wǎng)絡請求的數(shù)據(jù)。鑒于此,應用程序通常還需要負責刪除這些文件。
②是否會被iTunes同步
??否。

6、Library/Preferences

①存放內(nèi)容
??應用程序的偏好設置文件。我們使用NSUserDefaults寫的設置數(shù)據(jù)都會保存到該目錄下的一個plist文件中,這就是所謂的寫道plist中!
②是否會被iTunes同步
??是

7、tmp

①存放內(nèi)容
??各種臨時文件,保存應用再次啟動時不需要的文件。而且,當應用不再需要這些文件時應該主動將其刪除,因為該目錄下的東西隨時有可能被系統(tǒng)清理掉,目前已知的一種可能清理的原因是系統(tǒng)磁盤存儲空間不足的時候。
②是否會被iTunes同步
??否

總結如下圖

獲取主要目錄路徑的方式

1、沙盒目錄

NSLog(@"%@“, NSHomeDirectory());  

輸出結果:

/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A 

2、tmp

NSLog(@"%@“, NSTemporaryDirectory());  

輸出結果:

/private/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/tmp/  

3、Myapp.app

NSLog(@"%@“, [[NSBundle mainBundle] bundlePath]);  

輸出結果:

/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/PhoneCall.app

4、Documents

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *path = [paths objectAtIndex:0];  
NSLog(@"%@“, path);  

輸出結果:

/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/Documents  

這里用到的NSSearchPathForDirectoriesInDomains方法需要解釋下,其聲明如下:

FOUNDATION_EXPORT NSArray *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);  

該方法用于返回指定范圍內(nèi)的指定名稱的目錄的路徑集合。有三個參數(shù):

  1. directory
    NSSearchPathDirectory類型的enum值,表明我們要搜索的目錄名稱,比如這里用NSDocumentDirectory表明我們要搜索的是Documents目錄,如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄。
  2. domainMask
    NSSearchPathDomainMask類型的enum值,指定搜索范圍,這里的NSUserDomainMask表示搜索的范圍限制于當前應用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
  3. expandTilde
    BOOL值,表示是否展開波浪線。我們知道在iOS中的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~”。

打開模擬器沙盒目錄

下面看看模擬器的沙盒文件夾在mac電腦上的什么位置,文件都在個人用戶名文件夾下的一個隱藏文件夾里,中文叫資源庫,他的目錄其實是Library。

NO.1

可以設置顯示隱藏文件,然后在Finder下直接打開。設置查看隱藏文件的方法如下:打開終端,輸入命名
??顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
??隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
??輸完單擊Enter鍵,退出終端,重新啟動Finder就可以了
??重啟Finder:鼠標單擊窗口左上角的蘋果標志-->強制退出-->Finder-->
??現(xiàn)在能看到資源庫文件夾了,如下圖


NO.2

這種方法更方便,在Finder上點->前往->前往文件夾,輸入/Users/username/Library/Application Support/iPhone Simulator/ 前往,username這里寫你的用戶名。


GitHub主頁

CSDN Blog

Email:jinjob@icloud.com

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容