深入理解偏好檔案:位置:
系統和應用程式的喜好設定檔案的存放,在Mac OS X系統中可以歸為兩個範疇,一個是系統範疇,一個是使用者範疇.
系統範疇內儲存的是系統的或者是系統全域的喜好設定,這一點要和使用者範疇對比來說,使用者範疇是針對不同使用者的,使用者自己設定的偏好。
具體來說,一般地,系統範疇的儲存在/Library/Preferences/目錄裡,而使用者範疇的儲存在~/Library/Preferences/目錄裡(注1
).
注1
: 在系統裡面~符號代表使用者的home目錄,比如使用者student的home目錄在/Users/student,
這時 ~就等於/Users/student,
而~/Library/Preferences/就是/Users/student/Library/Preferences/.
兩種類型的plist檔案
- 硬體特定位置(ByHost Preference)
Mac系統支援一種特定硬體的喜好設定,這些偏好檔案儲存在ByHost目錄中,使用者可以在自己的home目錄的~/Library
/Preferences/ByHost/裡面,對於不同的系統(軟體和硬體),Mac OS
X系統或應用程式可能會將喜好設定檔案儲存在ByHost裡面,這樣這個檔案中涉及的所有設定都只是相關於這個電腦本身。
ByHost喜好設定檔案都有一個特殊的檔案名稱以示和本系統硬體相關,在Mac OS X 10.5之前的版本,系統使用的喜好設定檔案名稱是在普通檔案名稱中加入網卡的MAC地址來區別的,比如:
com.apple.screensaver.001122334455.plist就是使用者設定螢幕保護裝置的偏好配置。
而在Mac OS X
10.5之後,為了可以更好地標示系統的唯一性,它使用系統的UUID來替換原來MAC地址的內容,比如,上面同樣的螢幕保護裝置的偏好配置,我的是:
com.apple.screensaver.27074F01-7A93-5859-BAF3-0EB138E001D3.plist
為什麼一定要使用ByHost配置呢?
有些程式的喜好設定的確可以歸結為與硬體相關,有些是為了程式的特性。除了上面提到的螢幕保護裝置程式外,還有比如ImageCapture使用那個程式的設
置就是ByHost的,無論開啟Image
Capture.app還是iPhoto.app程式,在它們的Preferences裡面都有一個選項是下載照片使用哪個程式,見就是Image
Capture.app的Preferences的:
裡面設定使用iPhoto,如果沒有設定值,就顯示no application,Mac OS X系統就是靠這個偏好設定檔來啟動對應程式的.
到ByHost中就可以看到叫做:
com.apple.ImageCapture.27074F01-7A93-5859-BAF3-0EB138E001D3.plist,
它的內容在Property List Editor.app中顯示為:
再例如,控制當前顯示所支援的解析度個數的資訊,也是儲存在ByHost裡面,這一點比較容易理解。是顯示10個解析度的選項:
它的plist檔案顯示如下:
還有一種用處,如果一個程式的許可證是使用者只能安裝在一台機器上使用,這樣ByHost的偏好配置就是一種可以方便使用的機制, 比如有著作權保護的程式,例如iTunes,需要儲存本機本使用者的唯一標識,並與著作權資訊共同製作一個簽名,這樣防止盜版。
如何找到這個UUID呢?在Terminal中執行下面的命令:
ioreg -d2 -c IOPlatformExpertDevice |
在一台iMac上可以看到下面的內容:
+-o iMac8,1 <class IOPlatformExpertDevice, registered, matched, active, busy 0, retain 23>
{
"IOBusyInterest" = "IOCommand is not serializable"
"IOInterruptControllers" = ("io-apic-0")
"IOPlatformSerialNumber" = "YMXXXXXXXXX"
"clock-frequency" = <005a6b3f>
"version" = <"1.0">
"product-name" = <"iMac8,1">
"IOInterruptSpecifiers" = (<0900000005000000>)
"board-id" = <"Mac-F226BEC8">
"model" = <"iMac8,1">
"serial-number" = <5xxxx200000000000000000000xxxxxxxxxxx4dxx5axxxx00000000000000000000000000000>
"manufacturer" = <"Apple Inc.">
"IOPlatformArgs" = <00c0xxx00050exxxxxxeef0000000000>
"name" = <"/">
"IOPlatformUUID" = "FXXXXXX5-XXXX-XXXX-XXXX-82XXXXXXXX34"
"compatible" = <"iMac8,1">
"IOPolledInterface" = "SMCPolledInterface is not serializable"
"system-type" = <01>
}
|
從上面的內容可以找到一行叫"IOPlatformUUID"的,這個就是了,為了可以一次找到,運行下面的命令
ioreg -rd1 -c IOPlatformExpertDevice | grep "IOPlatformUUID" |
這個UUID只有在Mac OS X 10.5以上版本的系統中猜支援,另外一個問題是,並不是所有的硬體系統都支援,比如下面是一個較老的版本的iMac系統(2007),它的UUID前面部分是"00000000-0000-1000-8000
" 後面根著的是網卡MAC地址,在這樣的系統中,就不使用這個UUID作為標示了,而是沿用舊的方法,直接使用MAC地址.
"IOPlatformUUID" = "00000000-0000-1000-8000-00XXXXXXXX20" |
在Mac OS X 10.5以前的系統中,同樣支援這個命令ioreg,但是不支援-rd1或者-d2的選項。
- 全域偏好位置(Global Preference)
全域偏好檔案是一個特殊的plist檔案,存在於系統和使用者範疇內,但是在Finder出口中一般看不到,到Terminal中,可以找到
/Library/Preferences/.GlobalPreferences.plist或者~/Library/Preferences
/.GlobalPreferences.plist兩個檔案. 它們定義系統或者使用者全域的系統參數,比如時區等.
常用工具
常用圖形工具:
Property List Editor:首選當然是蘋果開發工具中的這個應用程式,免費而且是主要工具.
PlistEdit
:可以開啟處理文本和二進位檔案,並以原來的格式儲存,
PlistEdit Pro
:收費軟體,特點是XML明碼和樹狀結構同時顯示.
PrefEdit
:方便尋找plist檔案,2.0版本開始收費, 1.2的還是免費
命令列工具:
plutil:主要用來檢查plist檔案的文法,並將plist檔案在Text和Binary之間轉換.
defaults: 用於操作plist檔案, 但是操作多層屬性時有局限;10.5之後都預設將文字格式設定轉化為Binary格式, 這樣可以提高系統讀取速度.
PlistBuddy: 是一個比defaults更加靈活的工具,可以任意編輯多層的屬性,但是不是OS X內建的.
Tony Liu
June 26, 2009 Calgary