出于安全考慮,iOS系統(tǒng)的沙盒機(jī)制規(guī)定每個(gè)應(yīng)用都只能訪問當(dāng)前沙盒目錄下面的文件(也有例外,比如系統(tǒng)通訊錄能在用戶授權(quán)的情況下被第三方應(yīng)用訪問),這個(gè)規(guī)則把iOS系統(tǒng)的封閉性展現(xiàn)的淋漓盡致。
每個(gè)沙盒下面都有相似的目錄結(jié)構(gòu),如下圖所示(出自蘋果官方文檔):
每個(gè)應(yīng)用的沙盒目錄都是相似的,主要包含圖中所示的4個(gè)目錄:
①存放內(nèi)容
該目錄包含了應(yīng)用程序本身的數(shù)據(jù),包括資源文件和可執(zhí)行文件等。程序啟動(dòng)以后,會(huì)根據(jù)需要從該目錄中動(dòng)態(tài)加載代碼或資源到內(nèi)存,這里用到了lazy loading的思想。
②整個(gè)目錄是只讀的
為了防止被篡改,應(yīng)用在安裝的時(shí)候會(huì)將該目錄簽名。非越獄情況下,該目錄中內(nèi)容是無法更改的;在越獄設(shè)備上如果更改了目錄內(nèi)容,對(duì)應(yīng)的簽名就會(huì)被改變,這種情況下蘋果官網(wǎng)描述的后果是應(yīng)用程序?qū)o法啟動(dòng),我沒實(shí)踐過。
③是否會(huì)被iTunes同步
否
2、Documents
①存放內(nèi)容
我們可以將應(yīng)用程序的數(shù)據(jù)文件保存在該目錄下。不過這些數(shù)據(jù)類型僅限于不可再生的數(shù)據(jù),可再生的數(shù)據(jù)文件應(yīng)該存放在Library/Cache目錄下。
②是否會(huì)被iTunes同步
是
①存放內(nèi)容
該目錄用來保存由外部應(yīng)用請(qǐng)求當(dāng)前應(yīng)用程序打開的文件。
比如我們的應(yīng)用叫A,向系統(tǒng)注冊(cè)了幾種可打開的文件格式,B應(yīng)用有一個(gè)A支持的格式的文件F,并且申請(qǐng)調(diào)用A打開F。由于F當(dāng)前是在B應(yīng)用的沙盒中,我們 知道,沙盒機(jī)制是不允許A訪問B沙盒中的文件,因此蘋果的解決方案是講F拷貝一份到A應(yīng)用的Documents/Inbox目錄下,再讓A打開F。
②是否會(huì)被iTunes同步
是
4、Library
①存放內(nèi)容
蘋果建議用來存放默認(rèn)設(shè)置或其它狀態(tài)信息。
②是否會(huì)被iTunes同步
是,但是要除了Caches子目錄外
①存放內(nèi)容
主要是緩存文件,用戶使用過程中緩存都可以保存在這個(gè)目錄中。前面說過,Documents目錄用于保存不可再生的文件,那么這個(gè)目錄就用于保存那些可再生的文件,比如網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)。鑒于此,應(yīng)用程序通常還需要負(fù)責(zé)刪除這些文件。
②是否會(huì)被iTunes同步
否。
①存放內(nèi)容
應(yīng)用程序的偏好設(shè)置文件。我們使用NSUserDefaults寫的設(shè)置數(shù)據(jù)都會(huì)保存到該目錄下的一個(gè)plist文件中,這就是所謂的寫道plist中!
②是否會(huì)被iTunes同步
是
①存放內(nèi)容
各種臨時(shí)文件,保存應(yīng)用再次啟動(dòng)時(shí)不需要的文件。而且,當(dāng)應(yīng)用不再需要這些文件時(shí)應(yīng)該主動(dòng)將其刪除,因?yàn)樵撃夸浵碌臇|西隨時(shí)有可能被系統(tǒng)清理掉,目前已知的一種可能清理的原因是系統(tǒng)磁盤存儲(chǔ)空間不足的時(shí)候。
②是否會(huì)被iTunes同步
否
獲取這四個(gè)重要目錄路徑的方法是:
NSSearchPathFordirectoriesInDomains方法,這個(gè)方法有三個(gè)重要參數(shù)。
directory
NSSearchPathDirectory類型的enum值,表明我們要搜索的目錄名稱,比如這里用NSDocumentDirectory 表明我們要搜索的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄。
domainMask
NSSearchPathDomainMask類型的enum值,指定搜索范圍,這里的NSUserDomainMask表示搜索的范圍限制于 當(dāng)前應(yīng)用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示 /Network)等。
expandTilde
BOOL值,表示是否展開波浪線~。我們知道在iOS中~的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~”。
而tmp文件的路徑是通過:NSTemporaryDomain();方法獲取到的。
APP文件的路徑是通過:【[NSBundle mainbundle]resourcesPath】;方法獲取的。
獲取應(yīng)用沙盒根路徑的方法:NSHomeDirectory();
2、打開模擬器沙盒目錄
下面看看模擬器的沙盒文件夾在mac電腦上的什么位置。
文件都在個(gè)人用戶名文件夾下的一個(gè)隱藏文件夾里,中文叫資源庫,他的目錄其實(shí)是Library。
2.1 方法1、可以設(shè)置顯示隱藏文件,然后在Finder下直接打開。設(shè)置查看隱藏文件的方法如下:打開終端,輸入命名
顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
輸完單擊Enter鍵,退出終端,重新啟動(dòng)Finder就可以了
重啟Finder:鼠標(biāo)單擊窗口左上角的蘋果標(biāo)志-->強(qiáng)制退出-->Finder-->
現(xiàn)在能看到資源庫文件夾了。