深入理解偏好文件:
位置:
系统和应用程序的偏好设置文件的存放,在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