2012年9月4日 星期二

iOS 應用程式的沙箱機制


在操作的過程中經常需要取得目前應用程式的資料夾路徑,接下來就簡略地介紹 iOS 的應用程式沙箱機制,以及如何取得沙箱中的資料夾路徑。
在 iOS 系統中,出自於安全性的前提下,應用程式採用了沙箱 (Sandbox) 安全體系的運作機制,當應用程式被安裝到 iOS 系統時,系統會替應用程式建立一個主目錄 (Home Directory),以應用程式的 GUID 來命名,這個主目錄便是應用程式本身的 Sandbox,應用程式被限制僅能存取自己的 Sandbox,無法任意地使用其他應用程式 Sandbox 中的資料,如有需要時必須發送數據請求並經過權限的檢測認可,無法通過檢測則請求會被中斷。

沙箱 (Sandbox) 機制的幾項特點

  • 每個應用程式都有屬於自己的儲存空間
  • 應用程式無法存取其他應用程式的儲存空間
  • 應用程式送出的請求數據必須通過權限的檢測,若無法通過時則請求會被中斷。

沙箱結構

一般而言,沙箱中會有下列四個子資料夾:
²  AppName.app
應用程式主目錄,所有與應用程式建置時有關的檔案都存放於此資料夾中,包括應用程式本身的執行檔及相關資源等等,僅允許讀取不可修改。又稱應用程式的程式包。由於應用程式在安裝時必須經過簽名認證,所以在運行時不能對這個資料夾中進行任何內容的修改動作。
²  Documents 
這個資料夾用來儲存使用者的資料或其他應定期備份的資料,因此在應用程式運行時需要使用的檔案都應該被儲存於這個資料夾中
²  Library
此資料夾中包含兩個子目錄,分別是:
Ø   Caches 
用來儲存應用程式專用的文件,例如保存應用程式再次啟動時需要的快取資料
Ø   Preference 
儲存應用程序的偏好設置文件,應用程式不應該直接於此資料夾創建偏好設定文件,而是透過 NSUserDefault 類別來取得與進行偏好設定文件的操作
²  tmp 
用來儲放臨時檔案的資料夾,保存應用程式再次啟動時較不需要的快取資料。當 iOS 裝置與 iTuens 進行同步時,iTunes 不會將存放於 tmp 資料夾中的檔案進行備份。
若是應用程式中使用了 tmp 資料夾做些檔案的暫存動作,務必記得自行清除不再使用的檔案,避免 tmp 資料夾中的垃圾檔案佔據了使用者的儲存空間。

如何取得沙箱中的資料夾路徑

前面已經簡單地介紹完 iOS 沙箱機制,接下來的重點便是我們要如何去取得沙箱中的資料夾路徑,畢竟操作檔案文件前的先決條件是我們必須得知道檔案路徑在哪裡,才有辦法進行後續的存取動作。
    // 取得應用程式根目錄資料夾路徑
    NSString *homeDirectory = NSHomeDirectory();

    // 取得 AppName.app 程式包路徑
    // - 直接從 Info.plist 屬性清單中 "NSBundleInitialPath" 鍵值直接取得應用程式的程式包路徑
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];     // 取得 Info.plist 屬性清單
    NSString *appFilePath = [infoDictionary objectForKey:@"NSBundleInitialPath"];

    // 取得 Documents 資料夾路徑
    NSString *documentsDirectory = [homeDirectory stringByAppendingPathComponent:@"Documents"];

    // 取得 Library 資料夾路徑
    NSString *libraryDirectory = [homeDirectory stringByAppendingPathComponent:@"Library"];

    // 取得 Caches 與 Preference 資料夾路徑
    NSString *cachesDirectory = [libraryDirectory stringByAppendingPathComponent:@"Caches"];
    NSString *preferenceDirectory = [libraryDirectory stringByAppendingPathComponent:@"Preference"];

    // 取得 tmp 資料夾路徑
    NSString *tmpDirectory = [homeDirectory stringByAppendingPathComponent:@"tmp"];

沒有留言:

張貼留言