plutil-convert/-create/-extractなどのサブコマンドでは、plist(property list)のフォーマットとしてxml1binary1を指定する場面が多い。両フォーマットの違いをまとめる。

xml1はテキストのXML形式

xml1はテキストで読み書きできるXML形式のplistである。

$ plutil -create xml1 sample.plist
$ plutil -insert Name -string Sample sample.plist
$ cat sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Name</key>
	<string>Sample</string>
</dict>
</plist>

人間がそのまま読み書きでき、git diffgrepとも相性がよい。

binary1はAppleのバイナリ形式

binary1はAppleが定義したバイナリ形式のplistである。-convertで相互変換できる。

$ plutil -convert binary1 sample.plist
$ file sample.plist
sample.plist: Apple binary property list

先頭バイトを見ると、binary1で作成したファイルでも実際のマジックナンバーはbplist00である。plutil側の引数名(binary1)とファイル内部のシグネチャ(bplist00)は一致しない。

$ hexdump -C sample.plist | head -1
00000000  62 70 6c 69 73 74 30 30  d1 01 02 54 4e 61 6d 65  |bplist00...TName|

フォーマット名末尾の1はバージョン番号

xml1/binary1の末尾の1はフォーマットのバージョン番号である。現状はどちらもバージョン1のみが存在し、xml2のような表記は使えない。

ファイルサイズを比較する

同じ内容のplistをxml1binary1で比較すると、binary1の方が小さくなる。

$ plutil -create xml1 sample-xml.plist
$ plutil -insert Name -string Sample sample-xml.plist
$ plutil -insert Count -integer 3 sample-xml.plist
$ cp sample-xml.plist sample-binary.plist
$ plutil -convert binary1 sample-binary.plist
$ wc -c sample-xml.plist sample-binary.plist
     270 sample-xml.plist
      70 sample-binary.plist
     340 total

XMLのタグや属性が不要な分、binary1はファイルサイズが小さく、パースも高速である。アプリに同梱されるInfo.plistなどは、ビルド時にxml1からbinary1へ変換されていることが多い。

参考

【plutil】-convertでplistのフォーマットを変換する