ランタイム構成のガイドライン

2012. 03. 29
●はじめに

ダイナミックコンフィギュレーションは、コードを再コンパイルせずに実行可能ファイルのプロパティを調整する便利な方法です。

アプリケーションはハードコーディングされた情報に依存せず、外部設定に基づいて僅かに異なる動作を実装します。

ユーザプリファレンスからバンドルに格納されたプロパティリストに至るまで、これらの設定を記録する方法はいくつかあります。

バンドルは、バンドルとそのコンテンツに関する情報を広範囲で格納するためにプロパティリストを使用しています。

Mac OS XとiOSは、アイコンや(iPhoneアプリケーションにおける)ステータスバーを表示するかどうかなど、アプリケーションのプロパティの決定にこれらプロパティの情報を使用します。

Mac OS XまたはiOSでアプリケーションを処理する方法の指定や、アプリケーション動作の構成に使用することができるプロパティについては、このドキュメントを読んでください。


このドキュメントの構成

このドキュメントには下記の項目が含まれています。

  • 情報プロパティリストファイル』は、情報プロパティリストファイルの導入と、システムによる使用法を提供します。

  • プリファレンスシステム』は、ユーザプリファレンスの役割と範囲、およびプリファレンスにアクセスするためのデフォルトツールの使用方法に付いて説明します。

  • 環境変数』は、アプリケーションを設定する際の環境変数の役割に付いて説明します。
    またこの節では、特定のユーザによるセッションやプロセスの環境設定を確立するためのいくつかの方法を扱います。

  • その他の設定のヒント』は、アプリケーションのための必須および推奨の設定オプションを示します。
    またこの項では、バンドルと非バンドルのアプリケーション両方を設定するための追加方法について説明します。

関連項目

情報プロパティリストファイルに含むことができるキーと値についての詳細は『情報プロパティリストキー(0)~コンテンツ』を参照してください。

プリファレンスシステムについての詳細は『Preferences and Settings Programming Guide』または『Preferences Programming Topics for Core Foundation』を参照してください。



情報プロパティリストファイル

情報プロパティリストファイルは、バンドルされた実行可能ファイルの基本的な設定情報を含む、構造化されたテキストファイルです。

ファイル自体は、通常Unicode UTF-8エンコーディングを使用してエンコードされ、内容はXMLを使用して構造化されています。

XMLのルートノードは辞書で、その内容はバンドルの異なる様相を記述するキーと値のセットです。

システムはアプリケーションに関する情報と、それがどのように設定されているかを取得するために、これらのキーと値を使用します。

したがって、全てのバンドルされた実行可能ファイル(プラグイン、フレームワーク、およびアプリケーション)は情報プロパティリストファイルを持つものと想定しています。

慣例として、情報プロパティリストファイルの名前はInfo.plistです。

このファイル名は大文字/小文字が区別されており、最初の大文字が『I』である必要があります。

iPhoneアプリケーションでは、このファイルはバンドルディレクトリの最上位に置かれています。

Mac OS Xバンドルでは、このファイルはバンドルのContentsディレクトリに置かれています。

Xcodeは、通常適切なタイプのプロジェクトを生成する時に、自動的にこのファイルを生成します。

通常Info.plistの内容は、以下の情報をシステムに伝達します。

  • ユーザから見えるバンドルの表示名

  • 実行時にバンドルを検索するために使用することができる(通常はフォームcom.yourcompany.appnameで指定する)一意の識別文字列

  • バンドルのタイプ(アプリケーション、フレームワーク、プラグイン)

  • バージョン情報

  • どのようにバンドルを起動、またはメモリに内容を読み込むかについての情報

  • バンドルの優先実行環境

  • (もしあれば)バンドルのサポートされているドキュメントタイプに関する情報

  • iPhoneアプリケーションにおける、アプリケーションが最初にどのようにコンテンツを表示するかについての情報

情報プロパティリストの生成、および含めることができるキーと値についての詳細は『情報プロパティリストキー(0)~コンテンツ』を参照してください。



プリファレンスシステム

プリファレンスは、ユーザが作業環境をカスタマイズすることができる、アプリケーションまたはシステムのオプションです。

ほとんどのアプリケーションはユーザプリファレンスを何らかの形式で読み込みます。

例えば、document-basedアプリケーションは、デフォルトのフォント、自動保存のオプション、またはページ設定情報のプリファレンスを格納することができます。

しかしプリファレンスはアプリケーションに限定されてはいません。

貴方が定義したフレームワークやライブラリから、ユーザプリファレンスを含むプリファレンス情報を読み書きすることができます。

Mac OS Xのプリファレンスシステムは、セッション間でユーザ設定の保存と復元のサポートが組み込まれています。

CarbonとCocoaアプリケーションの両方とも、プリファレンス情報を読み書きするためにCore Foundationのプリファレンスサービスを使用することができます。

またCocoaアプリケーションは、ユーザプリファレンスの読み込みにNSUserDefaultsクラスを使用することができます。

重要
ユーザプリファレンスによる想定は重要ではなく、アプリケーションはプリファレンスのデフォルトセットを再生成することができます。
プリファレンスとして、アプリケーションの初期設定データを格納するべきではありません。
初期設定データは重要であり、アプリケーションパッケージ内のプロパティリストに格納する必要があります。

プリファレンスシステムに関連付けられているキーと値の設定は、後でプリファレンス値の取得に使用されます。

ユーザプリファレンスは、ユーザのログインID、アプリケーションID、そしてホスト(コンピュータ)名の組み合わせに基づいたスコープを持ちます。

このメカニズムによって、異なるレベルで適用されるプリファレンスを生成することができます。

例えば、以下のエンティティのいずれかに適用するプリファレンス値を保存することができます。

  • 現在のホスト上にあるアプリケーションの現在のユーザ

  • ローカルネットワークに接続している、特定のホスト上のアプリケーションの全てのユーザ

  • ローカルネットワークに接続している、任意のホスト上のアプリケーションの現在のユーザ
    (ユーザプリファレンスのための通常のカテゴリ)

  • ローカルネットワークに接続している、任意のホスト上の任意のアプリケーション任意のユーザ

アプリケーションは、ユーザから取得した情報を表すこれらのプリファレンスのみを格納する必要があります。

各ユーザ毎に同じデフォルトプリファレンスのセットを格納するのは、アプリケーションのプリファレンスの管理には非効率的な方法です。

プリファレンスは、プリファレンス情報を読み込むために解析する必要がある、プロパティリストファイルに格納されています。

プリファレンスを管理するより効率的な方法は、内部にデフォルトプリファレンスのセットを格納し、デフォルトセットの上に任意のユーザカスタマイズプリファレンスを適用することです。


プリファレンスの格納方法

プリファレンスシステムは、適切なファイルシステムドメイン内のLibrary/Preferencesフォルダにあるファイルに、プリファレンスデータを格納します。

例えば単一ユーザに適用されるプリファレンスは、ユーザのホームディレクトリ内のLibrary/Preferencesフォルダにファイルが書き込まれます。

ネットワーク上の全てのユーザに適用されるプリファレンスの場合は、/Network/Library/Preferences内になります。

Library/Preferences内の各ファイル名は、アプリケーションのバンドル識別子の後に.plist拡張子を付加して構成されます。

例えばTextEditアプリケーションのバンドル識別子がcom.apple.TextEditの場合、プリファレンスファイル名はcom.apple.TextEdit.plistになります。

競合する名前が存在しないことを保証するために、AppleはJavaパッケージ名の形式と同じようなバンドル識別子(貴方の会社の独自ドメイン名の後にアプリケーションまたはライブラリ名を続ける形式)にすることを強く推奨します。

例えば、Finderの場合はcom.apple.finderを使用しています。

この方式は名前が衝突する可能性を最小限に抑え、貴方の会社のドメインの下に識別名の空間を管理する自由を残しています。

この値は、情報プロパティリストファイルのCFBundleIdentifierキーに割り当てます。

アプリケーションが適切なファイルシステムドメイン内のLibrary/Preferences以外の場所へプリファレンスの書き込みを試した場合、問題になる可能性があります。

ひとつは、プリファレンスAPIはこのような変更に対して設計されていません。

しかしより重要なのは、予期しない場所に格納されているプリファレンスはプリファレンス検索リストから除外されているため、他のアプリケーション、フレームワーク、またはシステムサービスによって認識されない可能性があることです。

Mac OS X version 10.3以前では、プリファレンスはXMLプロパティリストフォーマットで保存されていました。

Mac OS X version 10.4以降では、プリファレンスはバイナリplistフォーマットで保存されます。

plutil(1)ツールを使用して、(例えばXML形式のplistを検査できるように)あるフォーマットから別のフォーマットにファイルを変換することができますが、ファイルのフォーマットに依存しないでください。

手動でプリファレンスファイルを編集することは控えるべきです。

アプリケーションがファイルを読み込む際に、不正な情報あるいは不正確なデータが入力されていると、以降に問題が発生する可能性があります。

アプリケーション内のプリファレンスドメインから情報を取得する正しい方法は、プリファレンスAPIを使用することです。


プリファレンスドメイン

アプリケーションが既存のプリファレンス値の検索を行う場合、プリファレンスシステムは検索のスコープを現在のプリファレンスドメインに限定します。

同様に、アプリケーションが新しいプリファレンスを書き出す場合、値は現在のドメインにスコープされます。

プリファレンスドメインは、ユーザID、アプリケーション識別子、そしてホスト名の3つの情報によって識別されます。

ほとんどの場合、現在のユーザとアプリケーションのプリファレンスを指定します。

ただし、アプリケーションレベルのプリファレンスを格納するために決定する場合もあります。

それを行うには、使用していたドメインを正確に指定するため、Core Foundationのプリファレンスユーティリティの関数を使用します。

これらのルーチンの使用方法については『Preferences Programming Topics for Core Foundation』を参照してください。

表1に全てのプリファレンスドメインを示します。

プリファレンスを取得するルーチンは、要求されたキーを見つけるまで、この順番でプリファレンスドメイン内を検索します。

したがって、プリファレンスが特定ユーザや特定アプリケーションより多くのドメイン内で見つけられなかった場合、ルーチンはよりグローバルなドメインで情報を検索します。

表1 検索順序のプリファレンスドメイン

検索順序ユーザスコープアプリケーションスコープホストスコープ
1現在のユーザ現在のアプリケーション現在のホスト
2現在のユーザ現在のアプリケーション任意のホスト
3現在のユーザ任意のアプリケーション現在のホスト
4現在のユーザ任意のアプリケーション任意のホスト
5任意のユーザ現在のアプリケーション現在のホスト
6任意のユーザ現在のアプリケーション任意のホスト
7任意のユーザ任意のアプリケーション現在のホスト
8任意のユーザ任意のアプリケーション任意のホスト


defaultsユーティリティ

Mac OS Xのプリファレンスシステムには、アプリケーションドメインまたは他のドメインから(ユーザデフォルトとして知られる)プリファレンスを読み込み、書き込み、および削除するためのdefaultsと名付けられたコマンドラインユーティリティが含まれています。

defaultsユーティリティは、アプリケーションをデバッグするための補助として貴重なものです。

多くのプリファレンスはアプリケーションのプリファレンスダイアログ(または相当するもの)を介してアクセス可能ですが、プリファレンスによるウィンドウの位置は常に利用できるものとは限りません。

これらのプリファレンスについては、defaultsユーティリティで表示することができます。

ユーティリティを実行するにはターミナルアプリケーションを起動し、BSDシェルでdefaultsに必要なコマンドオプションの記述を加えて入力します。

構文と引数についての簡単な説明は、defaultsコマンドを実行してください。

完全な説明についてはdefaultsのマニュアルページを読むか、usage引数でコマンドを実行してください。

$ defaults usage

ターゲットのアプリケーションの実行中にdefaultsツールを使用して値を変更しないでください。

このような変更を行った場合、アプリケーションは変更を確認することはほとんど無く、指定した新しい値が上書きされる可能性があります。



環境変数

環境変数は動的にアプリケーションを構成する別の方法です。

多くのアプリケーションおよびシステムでは、実行可能なプログラムやヘッダファイルの場所等の重要な情報を格納するために環境変数を使用します。

変数は、変数名を伴うキー文字列と値の文字列で構成されています。

環境変数の値を取得するには、アプリケーションは標準システムライブラリ(stdlib.h)の一部であるgetenv関数を呼び出す必要があります。

この関数に要求する変数名を含む文字列を渡すと、その値、もしくは名前の変数が見つからなかった場合はnilを返します。

それによって、アプリケーションは適切な変数を使用することができます。


環境変数スコープ

環境変数はそれらを生成したプロセスおよびそのプロセスの全ての子へのスコープを持ちます。

ターミナルアプリケーションでは、環境変数を管理するために独立した独自のプロセスとして、各ウィンドウを扱います。

したがって、ターミナルウィンドウを生成し、いくつかの環境変数を定義する場合、そのウィンドウから実行する任意のプログラムがそれらの変数を継承します。

ただし、第二ターミナルウィンドウから第一ウィンドウで定義した変数へのアクセス、またはその逆はできません。

セッションは継承することができます。

例えばユーザがログインした時に、システムがユーザセッションを生成し、環境変数の標準設定を定義するとします。

するとセッション中にユーザによって起動される全てのプロセスは、ユーザの環境設定を継承することになります。

ただし、この継承は読み込みのみの関係です。

プロセスによって変数に加えた全ての変更は、プロセスに対してローカルで保持され、他のプロセスによって継承はされません。


ユーザセッション環境変数

Mac OS Xは、現在のユーザセッションのスコープ内での環境変数の定義をサポートしています。

ログインすると、ログインウィンドウアプリケーションはその名前のenvironment.plistを持つ特殊なプロパティリストファイルを検索します。

このファイルは、ユーザのホームディレクトリのルートにある.MacOSXと呼ばれるディレクトリ内に配置する必要があります。

(貴方が生成する必要がある)このファイルへのパスは以下のようになります。

~/.MacOSX/environment.plist

environment.plistファイルが存在する場合、ログインウィンドウはルート要素の子であるキーを検索します。

これらの各キーに、ログインウィンドウは同名の環境変数を登録し、それをキーの値に割り当てます。

このファイルは環境変数の定義のみをサポートしています。

スクリプトコードの他の形式を実行するためにこのファイルを使用することはできません。

ファイルのフォーマットは、ファイル内の各キーが文字列値を含んでいる、他のプロパティリストファイルと同じXMLフォーマットです。

例えば、(Xcodeがインストールされたディレクトリを<Xcode>とすると、<Xcode>/Applications/Utilitiesにある)Property List Editorアプリケーションで見ると、プロパティリストファイルは下図のようになります。

environment_plist


アプリケーション固有の環境変数

アプリケーションで使用できる環境変数を作成するには2つの方法があります。

一つ目は、ターミナルセッションで変数を定義し、同じセッションからアプリケーションを起動する方法です。

ターミナルから起動する場合、アプリケーションはそこで定義された全ての環境変数を含むセッションの設定を継承します。

アプリケーションに環境変数を関連付ける二つ目の方法は、アプリケーションの情報プロパティリストファイルにLSEnvironmentキーを含めることです。

LSEnvironmentキーは、環境変数とその値を表すキー/値ペアの任意の数を指定することができます。

アプリケーションの情報プロパティリストファイルを変更する必要があるため、このキーの使用は頻繁に変更されないオプションに最適です。

キーの使用方法についての詳細は『情報プロパティリストキー(0)~コンテンツ』を参照してください。



その他の設定のヒント

この章では、アプリケーションを構成するためのいくつかの雑多な技術を説明します。


PkgInfoファイル

PkgInfoファイルは、アプリケーションまたはバンドルのタイプとクリエータコードを指定するための代替方法です。

このファイルは必須ではありませんが、この情報にアクセスするコードのパフォーマンスを向上させることができます。

このファイルを提供するかどうかに関わらず、CFBundlePackageTypeとCFBundleSignatureキーのそれぞれを使用して、情報プロパティリストファイルにタイプとクリエータ情報を常に含める必要があります。

PkgInfoファイルの内容は、アプリケーションの4バイトの署名に続く4バイトのパッケージタイプです。

したがってテキストエディットアプリケーションの場合、タイプが『APPL』で署名が『ttxt』であるので、ファイルにはASCII文字列『APPLttxt』が含まれます。


起動引数の使用

Cocoaアプリケーションの場合、コマンドライン上で指定することによって、多くのユーザデフォルト設定をオーバーライドすることができます。

更にCocoaは、ファイルを開いたり出力するために、いくつかの追加の引数を認識します。

表1にCocoaアプリケーションで一般的に使用される、いくつかのコマンドライン引数を示します。

表1 Cocoaアプリケーションのコマンドライン引数

引数説明
-NSOpenfileNameアプリケーション起動終了後に指定されたファイルを開きます。
ファイルを開くのにはアプリケーションデリゲートの
application:openFile:メソッドを使用します。
-NSOpenTempfileNameアプリケーション起動終了後に一時ファイルとして指定された
ファイルを開きます。
ファイルを開くのにはアプリケーションデリゲートの
application:openTempFile:メソッドを使用します。
-NSPrintfileNameアプリケーション起動終了後に指定されたファイルを出力します。
ファイルを出力にはアプリケーションデリゲートの
application:printFile:メソッドを使用します。
-NSShowAllDrawing<YES>ビューのどの部分が更新されているかが確認できるように、描画
されようとしている領域を黄色で示します。
これはQuartzデバッグアプリケーションを介して使用できる機能に
似ていますが、指定されたアプリケーション上でのみ動作します。
-NSTraceEvents<YES>アプリケーションが受信したイベントの実行ログを表示します。



参考文献

Runtime Configuration Guidelines

XML用語事典/ルートノード

XML用語事典/ノード

Wikipedia/Carbon

Wikipedia/Cocoa

0 CommentsPosted in 資料





Bose SoundLink around-ear wireless headphones II
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
Sun Mon Tue Wed Thu Fri Sat
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

Bose SoundLink around-ear wireless headphones II
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR