| ファイル名拡張子 | .plist |
|---|---|
| インターネットメディアの種類 | application/x-plist |
| 統一型識別子 (UTI) | com.apple.プロパティリスト |
| 開発者 | Apple ComputerとGNUstep ( 旧NeXT) |
| フォーマットの種類 | 辞書オブジェクトのシリアル化。 |
macOS、iOS、NeXTSTEP、およびGNUstepプログラミングフレームワークでは、プロパティ リストファイルはシリアル化された オブジェクトを格納するファイルです。プロパティ リスト ファイルはファイル名拡張子 を使用するため、 p リスト.plistファイルと呼ばれることがよくあります。
プロパティ リスト ファイルは、多くの場合、ユーザーの設定を保存するために使用されます。また、バンドルやアプリケーションに関する情報を保存するのにも使用されます。これは、古い Mac OS ではリソース フォークによって実行されていたタスクです。
プロパティ リストは、開発用のローカライズ文字列にも使用されます。これらのファイルは、.stringsまたは.stringsdict拡張子を使用します。前者は、括弧のない 1 つの辞書のみを含む「縮小された」旧式の plist です ( propertyListFromStringsFileFormat を参照) [1]。後者は、完全な plist です。Xcodeは、プロジェクト ファイルとして使用される旧式の plist に
も拡張子を使用します。.pbxproj
表現
プロパティ リストによって表されるデータはいくぶん抽象的であるため、基礎となるファイル形式はさまざまな方法で実装できます。つまり、NeXTSTEP はプロパティ リストを表すために 1 つの形式を使用し、その後のGNUstepおよびmacOSフレームワークは異なる形式を導入しました。
ネクストステップ
NeXTSTEPでは、プロパティ リストは人間が読み取り可能で手動で編集できるように設計されており、プログラミング言語のような構文でASCIIにシリアル化されています。これと同じ形式がOPENSTEPでも使用されていました。
- 文字列は C リテラル スタイルで表されます: ; 英数字と_$+/:.-
"This is a plist string\n"のいずれかで構成されていれば、より単純な引用符なしの文字列も使用できます。 - バイナリ データは次のように表されます:ペアになった 16 進コード間のスペースとコメントは無視されます。
< [hexadecimal codes in ASCII] > - 配列は次のように表されます:
( "1", "2", "3" )末尾のカンマは許容されます。 - 辞書は次のように表されます:
{ "key" = "value"; ... }左側は文字列である必要がありますが、引用符で囲まなくてもかまいません。 - コメントは次のように使用できます:
/* This is a comment */および// This is a line comment。 - C と同様に、空白は通常、構文には重要ではありません。値ステートメントはセミコロンで終了します。
オリジナルの NeXT プロパティ リスト形式の制限の 1 つは、NSValue (数値、ブール値など) オブジェクトを表現できないことです。その結果、これらの値は文字列に変換され、アプリケーションによって「あいまいに」復元されることになります。[2]もう 1 つの制限は、公式の 8 ビット エンコーディングが定義されていないことです。[3]
OPENSTEP (1996) で導入されたdefaultsユーティリティは、設定の保存に使用される plist ファイル (NeXTSTEP では defaults と呼ばれ、これが名前の由来です) を、設定ドメインを介してコマンド ラインで操作するために使用できます。また、このユーティリティを使用して任意の plist ファイルを編集することもできます。このユーティリティは、3 つの古いコマンド (dread、dwrite、および dremove) に取って代わりました。[4]
GNUステップ
GNUstep は NeXTSTEP 形式を採用し、NSValue および NSDate データ型を表すための追加機能を備えています。新しい型付きエントリは<* T ...>という形式を持ち、Tは 1 文字の型コードです。たとえば、ブール値 YES の NSValue は<*BY>として表され、NSDate オブジェクトは として表されます。[5] [6]バイナリ データは、より効率的なbase64形式である<[ b64... ]>を使用することもできます。ほとんどの展開では UTF-8 が使用されるため、8 ビット問題も暗黙的に解決されます。
<*DYYYY-MM-DD HH:MM:SS +ZZZZ>
GNUstep には独自のバイナリ形式NSPropertyListGNUstepBinaryFormatがあり、NSSerializationで実装されています。この形式はテキスト形式と同様に再帰的に定義され、データの前に 1 バイトの型マーカーが付きます。文字列インターンの形式は、GS 拡張のshouldBeCompactスイッチによってサポートされています。[7]
GNUstep には、2 つの相対的に独立した plist ハンドラがあります。libs -core-base (CoreFoundation)のCFPropertyListと、 libs-base (Foundation Kit)のNSPropertyList です。どちらも macOS で使用されるバイナリ形式と XML 形式をある程度サポートしていますが、後者の方がはるかに完全です。たとえば、2 つの GNUstep 固有の形式は後者でのみ処理されます。[8]
GNUstepはNSPropertyListをベースにしたplistコマンドラインツールのセットを提供しており、その中にはpl [9]やdefaults [4]のバージョンも含まれています。
macOS
macOS も NeXTSTEP 形式を読み取ることができますが、Apple はそれを脇に置いて、XML ベースとバイナリの 2 つの新しい独自の形式を採用しています。Apple には、部分的に互換性のある JSON 形式 ( NSJSONSerialization ) もあります。
歴史
Mac OS X 10.0では、NeXTSTEP形式は非推奨となり、Appleによって定義されたパブリックDTDを備えた新しいXML形式が導入されました。XML形式は、非ASCII文字とNSValueオブジェクトの格納をサポートしています(GNUstepのASCIIプロパティリスト形式とは異なり、AppleのASCIIプロパティリスト形式はサポートしていません)。[10]
ただし、XML ファイルは最もスペース効率の良い保存手段ではないため、Mac OS X 10.2では、プロパティ リスト ファイルをバイナリ ファイルとして保存する新しい形式が導入されました。Mac OS X 10.4以降では、これが環境設定ファイルのデフォルト形式です。Mac OS X 10.7では、 JSON形式のファイルの読み取りと書き込みのサポートが導入されました。ただし、JSON とプロパティ リストは完全に互換性があるわけではありません。たとえば、プロパティ リストにはネイティブの日付とデータ型がありますが、JSON 形式ではサポートされていません。逆に、JSON では値が許可されますnullが、プロパティ リストでは明示的な null はサポートされません。
ツーリング
NeXTSTEPの古いデフォルトツールは引き続き利用可能です。/usr/libexec/PlistBuddyコマンドは対話型のplistエディタを提供します。スクリプト化することもできます。[11]
plutilユーティリティ ( Mac OS X 10.2で導入) を使用すると、プロパティ リストの構文をチェックしたり、プロパティ リスト ファイルをある形式から別の形式に変換したりできます。また、plists を Objective-C または Swift オブジェクト リテラルに変換することもできます。[ 12]構築の基盤となっているCocoa NSPropertyListSerializationと同様に、"旧式" の入力を受け取りますが、この型に変換しません。(Mac OS X 10.2 より前の Cocoa NSSerializer は旧式の出力を出力します。)
plユーティリティはMac OS X v10.5 で導入されました。これは任意の入力を受け取り、「旧式」の plist を生成しようとします。[13] [a] GNUstep バージョンと同様に、plist にある Foundation タイプのdescriptionプロパティを使用するようです。これは Apple が有効な旧式 plist を生成するために指定しています。[b]
内部的には、Apple は C Core Foundationコードで、CFPropertyList として古いスタイル、XML、およびバイナリ形式用のオープン ソース パーサーを提供しています。ただし、すべてのユーティリティとシステムのほとんどの部分では、Obj-C Foundation Kit のクローズド ソース NSPropertyList パーサーを使用しています。Swift の再実装はオープン ソースですが、同一であることが保証されているわけではありません。
形式
XMLおよびJSONプロパティ リストは、任意のテキスト エディターで手動で編集できます。さらに、Apple はXcodeで、バイナリまたはXML 形式の plist を処理できる階層型ビューア/エディターでプロパティ リストを編集するためのサポートを提供していますが、JSON は処理できません。Mac OS X 10.4以降 、Apple はシステム イベント アプリケーションを通じてプロパティ リスト ファイルを読み取るためのAppleScriptインターフェイスを提供しています。Mac OS X 10.5以降、Apple はプロパティ リスト ファイルの編集、作成、書き込み用のAppleScriptインターフェイスも提供しています。[14]
XML 形式の場合、タグ、関連する Foundation クラスと CoreFoundation タイプ、およびデータ ストレージ形式は次のとおりです。
バイナリファイル形式は、AppleのFoundationライブラリのバイナリplistのオープンソース実装のCore Foundation Cコードソースファイル(CF/CFBinaryPList.c )のコメントブロックに文書化されています。 [15] Appleはplist(5)のマニュアルページのドキュメントで実装を不透明であると説明しており、[16]つまり、この形式に依存することは推奨されていません。バイナリファイル形式では、マジックナンバー(有効なplistファイルであることを示すファイルの最初の数バイト)はテキストbplistで、その後に形式のバージョンを示す2バイトが続きます。
バイナリ ファイルには、XML または JSON ファイル形式ではキャプチャできない一部の情報を保存できます。配列、セット、および辞書のバイナリ タイプは、ファイル内のオブジェクト テーブルにインデックスを付けるポインタ(objref エントリと keyref エントリ) で構成されます。つまり、バイナリ plist は、たとえば、ファイルにシリアル化された個別の配列と辞書の両方に同じデータ要素が格納されているという事実をキャプチャできます。これは、XML ファイルではキャプチャできません。このようなバイナリ ファイルを変換すると、データ要素のコピーが XML ファイルに配置されます。さらに、バイナリ ファイルには、シリアル化時にデータ項目を識別するために使用される UID タイプがあります。C コード ソース ファイルから取得した、保存できるデータの完全なリストは次のとおりです。
多くのタイプでv"1?"+ という注記があることに注意してください。これは、マーカー バイトが、マジック ナンバー "1?" 以上のフォーマット バージョンを持つファイルにのみ存在することを意味します。CFBinaryPlist 実装はバージョン "0?" のみを処理するため、これらを正確に解析する方法は、従来のタイプを解析する方法よりも不明瞭です。実際には、NSKeyedArchiver が既にこれらの情報をキャプチャできるため、これらのタイプに遭遇することはありません。
オブジェクト テーブルの後にはオフセット テーブルが続き、その後に 2 つのテーブルのサイズと場所に関する情報を含むトレーラーが続きます。
plist へのシリアル化
プロパティリストは任意のオブジェクトを記述するために必要なすべての情報とデータ型をキャプチャするわけではないため、エンコードとデコードの追加レイヤーが実行されることがよくあります。OpenStep仕様は、NSCodingプロトコルの下で任意のNSObjectをシリアル化する操作を抽象化します。このプロトコルを実装するクラスは、 NSCoderサブクラスによってインスタンスを他の形式にシリアル化できます。[18]オブジェクトをplistにシリアル化する目的で、2つの主要なコーダが存在します。
- NSArchiverは、オブジェクトをタグ付き構造体のようなバイナリ データのブロックに変換します。このクラスは OpenStep の一部ですが、具体的な形式は定義されていません。実際には、これを使用してオブジェクトをファイルにシリアル化したり (plist をスキップ)、データを plist に埋め込んだりすることができます。書き込みと同じ順序で読み取りと書き込みを行う必要があります。NSKeyedArchiver の導入により、このクラスの使用は非推奨になりました。
- Mac OS X 10.2 で導入されたNSKeyedArchiverは、オブジェクトをNSDictionaryに変換します。プログラマにとってこの形式の主な改善点は、メンバーを固定順序ではなく文字列キーでアクセスすることです。内部的には、辞書に$objectsと呼ばれるオブジェクト テーブル配列を格納することで、バイナリ plist 形式をある程度再現しています。クラス情報を含むその他のすべては、UID ポインタによって参照されます。辞書の下の$topエントリは、プログラマがエンコードしようとしていた最上位のオブジェクトを指します。[17]
とりわけ、アーカイバを使用すると、plist 形式自体を変更せずに新しいデータ型をエンコードすることができ、Apple が NSSet や null 値などをエンコードするのに好んで使用している方法です。plist がサポートするはずのクラスでも、もう 1 つのレイヤーに従う必要があるため、形式の解析は少し難しくなります。オブジェクト テーブルも持つバイナリ形式と同様に、NSKeyedArchiverで循環参照を作成することができます。XML には UID データ型がないため、整数はキー "CF$UID" の下の辞書に格納されます。[19]
AppleはSwift Corelibs FoundationでオープンソースのNSKeyedArchiverを公開しています。クローズドソースのApple Foundationと同様に、出力形式はバイナリとXMLのみに制限されています。また、シリアル化の結果を示すテストケースもいくつかあります。[20] GNUstepにも互換性のある実装があり、出力形式を制限していません。[21]
パス言語
XPath がXML に対して行っているような、プロパティ リストに対する単一の標準化されたパス言語はありませんが、さまざまなプログラムで使用される非公式の規則が存在します。
- ドット構文バージョンは、Appleのplutilのkeypath引数に見られる。これはから派生したものと思われる。[12]
(id) -[NSObject(NSKeyValueCoding) valueForKeyPath:] - PlistBuddyでは、インデックスにコロン構文を使用した異なる形式が使用されています。 [11]
どちらの形式でも、区切り文字を含むキーを表現することはできません。
その他のプラットフォーム
ウィンドウズ
iOSやmacOSを含むAppleまたはDarwinシステムで最もよく知られていますが、plistファイルはiTunes [22]やSafari [23]などのAppleソフトウェアがインストールされている場合、Windowsコンピュータにも存在します。Windowsでは、ファイルは通常バイナリファイルですが[24]、一部のアプリケーションは他の形式でPLISTファイルを生成する場合があります。
Windows では、Apple plist ファイルは、 %USERPROFILE%\AppData\Roaming\Apple Computerの下のユーザーのホーム ディレクトリに保存されます。Windows 上のこれらの plist ファイルは通常、Windows レジストリを使用するのではなく、設定やその他の情報を保存します。
Windows で PLIST ファイルを編集するためのオプションは、macOS ほど豊富ではありません。ファイルが XML または JSON 形式である場合は、Notepad++などのテキスト エディターを使用できます。Apple は、 iTunesの一部である「Apple Application Support」パッケージ内に plutil.exe を同梱しており、これは macOS 版と同一です。
ネットBSD
2006年に導入され、 NetBSD#4.0 (2007) で初めてリリースされたproplibライブラリは、カーネルとユーザーランド間でデータをシリアル化するために使用できます。これは、XML plist言語の一部を実装しています。[25]
proplib のサンプル ユーザーの 1 つは、システム監視用のsysmon envsysフレームワークの 2 番目のリビジョンです。
NetBSDのproplibライブラリも2010年にDragonFlyに移植され、DragonFly BSD#2.8以降で利用可能になりました。[26]
クロスプラットフォーム
- FacebookのオープンソースのXcodeビルドツールであるxcbuildには、plistライブラリのほか、plutilとPlistBuddyが含まれています。これらのクロスプラットフォームユーティリティはC++で書かれています。[27]
- Pythonプログラミング言語には、
plistlibAppleのXMLまたはバイナリ(Python 3.4以降)のplistファイルを読み書きするための組み込みモジュールがあります。 [28] ProperTreeはこのライブラリを使用するクロスプラットフォームエディタです。[29]- ccl-bplistと呼ばれるサードパーティのライブラリには、NSKeyedArchiver UIDを処理する追加機能があります。[19]
- Goには、
plistOpenStepテキスト、GNUStepテキスト、Apple XML、Appleバイナリの4種類のplistをサポートするパッケージがあります。また、XMLおよびバイナリ形式のUIDも処理します。 [2] - Dartにはpropertylistserialization [30]と呼ばれるサードパーティのライブラリがあり、これもNSKeyedArchiver UIDを処理します。
参照
注記
- ^ macOS plの奇妙な点は、標準入力を手動で入力して^Dで終了すると、stdout に不要な "D" 文字が出力されることです。
- ^ Obj-C Foundation の は、辞書表現を返すという点でバグがあります。オープンソースの Swift Foundation には、そのような問題はありません。
descriptionNSData
参考文献
- ^ 「NSStringクラスリファレンス: propertyListFromStringsFileFormat」。GNUstep 。2020年2月17日閲覧。
- ^ ab "Package plist". godoc.org。
Unmarshal は、OpenStep プロパティ リストに遭遇すると、緩和された解析モードに入ります。OpenStep プロパティ リストは、単純な古いデータを文字列としてのみ保存できるため、必要に応じて整数、浮動小数点、ブール値、日付値を復元しようとします。
- ^ 「旧スタイルの ASCII プロパティ リスト」。Apple Developer (プロパティ リスト プログラミング ガイド) 。2020 年2 月 16 日閲覧。
- ^ ab – Linux一般コマンドマニュアル
- ^ Frith-Macdonald, Richard (2004). 「NSPropertyListSerialization クラスのドキュメント」. GNUstep .
- ^ 「プロパティ リスト」。GNUstepWiki。
- ^ 「NSSerialization ドキュメント」。GNUstep。ソースコード
- ^ 「型と定数: NSPropertyListFormat」. gnustep.org .
- ^ – Linux一般コマンドマニュアル
- ^ 「appleexaminer.com: 「PLIST ファイル」」。2014 年 2 月 19 日時点のオリジナルよりアーカイブ。2014 年2 月 27 日閲覧。
- ^ ab – DarwinおよびmacOSシステム管理者マニュアル
- ^ ab – DarwinおよびmacOS一般コマンドマニュアル
- ^ – DarwinおよびmacOS一般コマンドマニュアル
- ^ 「AppleScript: プロパティ リスト」。2009 年 4 月 24 日。2009 年 4 月 24 日時点のオリジナルよりアーカイブ。
- ^ ab "CF/CFBinaryPList.c". Apple Open Source . 2020年1月6日閲覧。
- ^ – DarwinおよびmacOSファイル形式マニュアル
- ^ ab Caithness, Alex (2012 年 4 月 4 日)。「Geek post: NSKeyedArchiver ファイル – どのようなもので、どのように使用できますか?」。Digital Investigation。
リスト 2 の CF$UID データ型は、1 つのキー ("CF$UID") とそれに続く整数を持つ辞書です (このレイアウトは、プロパティ リストが XML で表現されるときに表示されます。生のバイナリ形式では、"UID" データ型は辞書構造を必要としない別のエンティティです)。これらのデータ型は、"$objects" 配列内の別のエンティティへの参照を表します。CF$UID の番号は、配列の位置を示します。
- ^ "NSCoder.html". OpenStep 仕様。
- ^ ab CCLForensics Group (2020年1月15日). 「cclgroupltd/ccl-bplist」. GitHub .
- ^ “apple/swift-corelibs-foundation: NSKeyedArchiver.swift”. GitHub . 2021年12月14日.テスト
- ^ 「NSKeyedArchiver ドキュメント」。GNUstepドキュメント。2020年2 月 23 日閲覧。ソースコード
- ^ Hummert, Christian; Humphries, Georgina Louise (2022)、Hummert, Christian; Pawlaszczyk, Dirk (編)、「プロパティリスト」、モバイルフォレンジック - ファイル形式ハンドブック:モバイルデバイスで使用される一般的なファイル形式とファイルシステム、Cham:Springer International Publishing、pp. 157–165、doi:10.1007/978-3-030-98467-0_6、ISBN 978-3-030-98467-0、 2024年3月12日閲覧
- ^ 「Apple Safari ウェブブラウザは Windows 上でどのように設定を保存するのか?」。Super User。
- ^ 「GitHub - microsoft/NSPlist: NSPlist」。2019 年 5 月 3 日 – GitHub 経由。
- ^ Jason R. Thorpe. 「proplib — プロパティ コンテナ オブジェクト ライブラリ」。NetBSD。
- ^ Jason R. Thorpe. 「proplib — プロパティ コンテナ オブジェクト ライブラリ」. DragonFly BSD .
- 「proplib - プロパティ コンテナ オブジェクト ライブラリ」。DragonFly オンライン マニュアル ページ。
- ^ “facebook/xcbuild/Libraries/plist”. GitHub . 2020年2月17日閲覧。
- ^ 「plistlib — Mac OS X .plist ファイルを生成および解析する」。Python 3 ドキュメント。2020年1 月 6 日閲覧。
- ^ 「corpnewt/ProperTree: Pythonで書かれたクロスプラットフォームGUI plistエディター」。GitHub 。 2020年2月17日。 2020年2月17日閲覧。
- ^ "propertylistserialization | Dart パッケージ". Dart パッケージ. 2024 年9 月 14 日閲覧。
外部リンク
- developer.apple.com の plist(5) マニュアル ページ
- Excel テーブルから plist ファイルを作成するための Excel アドイン
- さまざまなplist形式の読み取り/書き込み用のJava API - Androidと互換性あり
- GNUstep plist の EBNF 文法
