提到 iOS 也許有人聽說過一個名詞 --- Sandbox。那 Sandbox 到底是一個什么東西?它到底有什么作用?本文將就這些問題做出說明,讓我們對 Sandbox 有所了解。
為了方便,IOS App Sandbox 在本文中或被簡稱為 應(yīng)用程序沙盒,沙盒 或者 沙箱 等。
在 iOS 系統(tǒng)中(macOS 同樣存在),每個應(yīng)用程序都有一個屬于自己的存儲空間,用于存儲圖像、圖標(biāo)、聲音、文本、屬性列表等,這個存儲空間就是 沙盒。
沙盒具有以下幾個特點(diǎn),
- 每個應(yīng)用程序都有自己的存儲空間。
- 應(yīng)用程序不能翻過自己的圍墻去訪問別的存儲空間的內(nèi)容。
- 應(yīng)用程序請求的數(shù)據(jù)都要通過權(quán)限審核,沒有授權(quán)的訪問會被拒絕。
上述特點(diǎn)概括起來就是:因?yàn)樯澈械拇嬖?,?yīng)用程序只能讀寫自己沙盒的文件,不能訪問其他應(yīng)用程序的沙盒,不能進(jìn)行程序間通信(除非通過URL Scheme 方法)。
通過下圖,能否幫助理解什么是沙盒?沙盒是 IOS 的一種安全體系,應(yīng)用程序的所有操作都要通過它來執(zhí)行,最核心點(diǎn)在于沙盒對應(yīng)用程序執(zhí)行的各種操作有權(quán)限限制。

sandbox
IOS 沙箱被封裝在 libsandbox.dylib 靜態(tài)庫中,它為每個進(jìn)程分配空間和權(quán)限配置,使用TrustedBSD API 托管和通信,暗盒負(fù)責(zé)關(guān)閉代碼控件,明盒負(fù)責(zé)打開代碼控件。它啟用的過程如下,
- sandbox_init 通過
libsandbox.dylib轉(zhuǎn)換為二進(jìn)制傳遞給 kernel mac syscall TrustedBSD。 - 將 sandbox_init 的請求發(fā) sandbox.kext 的擴(kuò)展,擴(kuò)展為當(dāng)前進(jìn)程安裝證書,然后返回安裝結(jié)果。
- 如果安裝成功,每次進(jìn)程的請求,都會被 trusted bsd 發(fā)送給 sandbox.kext 去匹配之前安裝的證書規(guī)則。如果證書不匹配的話,則安裝失敗。
說實(shí)話上述這些內(nèi)容都會網(wǎng)上資料做的拼湊和整合,其實(shí)沒有涉獵過 IOS 開發(fā)可能真的很難從本質(zhì)上理解沙箱,待以后有機(jī)會深入了解之后再對沙箱原理做深入解讀。
END