環境設定値へのアクセス
NSUserDefaults クラスを使用して、アプリの環境設定にアクセスできます。各アプリには、 standardUserDefaults クラスメソッドからアクセス可能なこのクラスの単一のインスタンスが用意されています。共有ユーザーのデフォルトオブジェクトは、以下の目的で使用できます。
- 起動時にアプリの環境設定のデフォルト値を指定します。
- アプリドメインに格納されている個々の環境設定値を取得して設定します。
- 環境設定値を削除します。
- 揮発性の環境設定ドメインの内容を調べます。
Cocoa 結束を使用する Mac アプリでは、NSUserDefaultsController オブジェクトを使用して、環境設定を自動的に設定および取得できます。通常、このようなオブジェクトを、ユーザー向きの環境設定を表示するために使用する同じ nib ファイルに追加します。ユーザーのデフォルト・コントローラー内の項目にユーザー・インターフェース・コントロールを結束して下さい。このコントローラーは、ユーザーのデフォルト・データベース内の値を取得して設定するプロセスを処理します。
環境設定値は、NSData、NSString、NSNumber、NSDate、NSArray、または NSDictionary のいずれか 1 つの標準プロパティリストオブジェクト型でなければなりません。NSUserDefaults クラスはまた、NSURL オブジェクトを環境設定値として格納する組み込み操作も提供しています。プロパティリストとその内容の詳細については、プロパティリストプログラミングガイド を参照してください。
アプリのデフォルトの環境設定を登録
起動時には、それが存在し、有効であると予想される任意の環境設定のデフォルト値をアプリは登録する必要があります。まだ設定されていない環境設定値を要求すると、NSUserDefaults クラスのメソッドがデータ型に適したデフォルト値を返します。数値のスカラー値の場合、これは通常 0 を返すことを意味しますが、文字列やその他のオブジェクトの場合は nil を返すことを意味します。これらの標準のデフォルト値があなたのアプリに適切でない場合は、registerDefaults: メソッドを使用して独自のデフォルト値を登録できます。このメソッドは、カスタムのデフォルト値を NSRegistrationDomain ドメインに配置し、これにより、環境設定が明示的に設定されていないときにそれらが返されます。
registerDefaults: メソッドを呼び出すときは、登録が必要な、すべてのデフォルト値の辞書を提供しなければなりません。リスト 2-1 は、iOS アプリが起動時の早い段階でデフォルト値を登録する例を示しています。もちろん、いつでもデフォルト値を登録できますが、全ての環境設定値を取得する前にデフォルト値を登録する必要があります。
リスト 2-1 デフォルトの環境設定値の登録
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { // Register the preference defaults early. NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"CacheDataAgressively"]; [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; // Other initialization... }
スカラー型のデフォルト値を登録するときは、NSNumber オブジェクトを使用して数値を指定します。値が URL である環境設定を登録する場合は、NSKeyedArchiver の archivedDataWithRootObject: メソッドを使用して、NSData オブジェクト内の URL を最初にコード化します。他の型のオブジェクトにも同様の手法を使用できますが、より簡単なオプションが利用可能な場合は、そうしてください。
環境設定値の取得と設定
NSUserDefaults クラスのメソッドを使用して、環境設定値を取得および設定して下さい。このクラスには、ブール型、integer、float、および double のスカラー値を持つ環境設定を取得および設定するためのメソッドがあります。また、値が NSData、NSDate、NSString、NSNumber、NSArray、NSDictionary、および NSURL 型のオブジェクトである環境設定値を取得および設定するメソッドもあります。環境設定値を取得する場合と設定する場合の 2 つの状況があります。
- 設定値を取得する:
- 値を使用してアプリの動作を構成する必要がある場合。
- あなたの環境設定インターフェイスで値を表示する必要があるとき。
- ユーザーが環境設定インターフェースで環境設定値を変更したときに値を設定します。
以下のコードは、コード内での環境設定値を取得する方法を示しています。この例では、コードは CacheDataAggressively キーの値を取得し、これはアプリがキャッシュ戦略 (caching strategy) を決定するためにアプリが使用するカスタムキーです。このようなコードは、どこでもアプリのカスタム構成を処理するために使用できます。この特定の環境設定値をユーザーに表示したい場合は、同様のコードを使用して環境設定インターフェースのコントロールを構成できます。
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"CacheDataAggressively"]) { // Delete the backup file. }
プログラムによって環境設定値を設定するには、NSUserDefaults の対応するセッターメソッドを呼び出して下さい。オブジェクト値を設定する場合は、setObject:forKey: メソッドを使用しなければなりません。このメソッドを呼び出すときは、オブジェクトが標準のプロパティリスト型の 1 つであることを確認しなければなりません。以下の例では、アプリの環境設定インターフェイスの状態に基づいていくつかの環境設定を行います。
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; if ([cacheAgressivelyButton state] == NSOnState) { // The user wants to cache files aggressively. [defaults setBool:YES forKey:@"CacheDataAggressively"]; [defaults setObject:[NSDate dateWithTimeIntervalSinceNow:(3600 * 24 * 7)] forKey:@"CacheExpirationDate"]; // Set a 1-week expiration } else { // The user wants to use lazy caching. [defaults setBool:NO forKey:@"CacheDataAggressively"]; [defaults removeObjectForKey:@"CacheExpirationDate"]; }
すべての値を管理するための環境設定インターフェースを表示する必要はありません。あなたのアプリは興味深い情報をキャッシュ (cache) するために環境設定を使うことができます。たとえば、NSWindow オブジェクトは、現在の場所をユーザーのデフォルトシステムに格納します。このデータを使用すると、次回ユーザーがアプリを起動したときに同じ場所に戻ることができます。
環境設定の変更の同期と検出
NSUserDefaults クラスは値をキャッシュ (cache) するため、キャッシュされた値をユーザーのデフォルトデータベースの現在の内容と同期させる必要があることがあります。あなたのアプリは、常にユーザーのデフォルトデータベースを変更する唯一のエンティティではありません。iOS では、設定アプリは、設定バンドルを持つアプリの環境設定の値を変更できます。OS X では、システムや他のアプリがユーザーの操作に応じて環境設定値を変更することがあります。たとえば、ユーザーが優先言語を変更した場合、システムは新しい値をユーザーのデフォルト・データベースに書き込みます。OS X v10.5 以降では、共有 NSUserDefaults オブジェクトは定期的な間隔でキャッシュを自動的に同期します。ただし、アプリは synchronized メソッドを手動で呼び出して、キャッシュされた値を強制的に更新することができます。
環境設定値の変更が起こったことを検出するため、アプリは通知Nの為 SUserDefaultsDidChangeNotification に登録することもできます。共有された NSUserDefaults オブジェクトは、永続的ドメインの 1 つにある環境設定への変更を検出すると、この通知をあなたのアプリに送信します。この通知を使用して、ユーザーインターフェイスに影響する変更に対応できます。たとえば、ユーザーの優先言語の変更を検出し、アプリコンテンツを適切に更新するために使用できます。
Cocoa 結束を使用した環境設定の管理
Mac アプリは、Cocoa 結束を使用して、ユーザーインターフェイスから直接環境設定値を設定できます。結束を使用して環境設定を変更するのは、NSUserDefaultsController オブジェクトを適切な nib ファイルに追加し、コントロールの値をユーザーのデフォルト・データベースの環境設定値に結束するのを含みます。あなたのアプリがインターフェースを表示すると、ユーザーデフォルトコントローラーはユーザーデフォルトデータベースから自動的に値をロードし、それらを使用してコントロール内の値を設定します。同様に、ユーザーがコントロールの値を変更すると、ユーザーのデフォルトコントローラーはユーザーのデフォルトデータベース内の値を更新します。
NSUserDefaultsController クラスを使用して環境設定値をあなたのユーザーインターフェイスに結束する方法の詳細については、Cocoa 結束プログラミングトピックス 内の ユーザーのデフォルトと結束 を参照してください。
Core Foundation を使用した環境設定の管理
Core Foundation フレームワークは、ユーザのデフォルトデータベースに格納されている環境設定にアクセスするための独自のインタフェースセットを提供します。NSUserDefaults クラスと同様に、Core Foundation 関数を使用して環境設定値を取得および設定し、ユーザーのデフォルト・データベースを同期することができます。NSUserDefaults とは異なり、Core Foundation 関数を使用して、様々なアプリや様々なコンピュータの環境設定を書き込むことができます。一部の環境設定ドメイン (現在のアプリやユーザーに属さないドメイン) を変更するには、root の権限 (または OS X v10.6 より前では管理者権限) が必要です。適切な権限を得る方法については、Authorization Services Programming Guide (権限サービスプログラミングガイド) を参照してください。サンドボックス内にインストールされているアプリでは、アプリドメイン外での書き込みはできません。
環境設定を取得および設定するための Core Foundation 関数については、環境設定ユーティリティのリファレンス を参照してください。
Core Foundation を使用して環境設定値を設定
環境設定は、キー値のペアとして保管されます。キーは CFString オブジェクトでなければなりませんが、コンテナ型を含め、任意の Core Foundation プロパティリスト値 (Core Foundation のプロパティリストプログラミングトピックス を参照)にすることができます。たとえば、アプリが作成する任意の新しいウィンドウのピクセル単位の幅を定義する defaultWindowWidth というキーがあるとします。その値はおそらく CFNumber 型の値でしょう。ウィンドウの幅と高さを defaultWindowSize という単一の環境設定に組み合わせ、その値を 2 つの CFNumber オブジェクトを含む CFArray オブジェクトにすることもできます。
リスト 2-2 のコードは、MyTextEditor というアプリの単純な環境設定を作成する方法を示しています。この例では、アプリのデフォルトのテキストの色を青色に設定しています。
リスト 2-2 単純なデフォルトの書き込み
CFStringRef textColorKey = CFSTR("defaultTextColor"); CFStringRef colorBLUE = CFSTR("BLUE"); // Set up the preference. CFPreferencesSetAppValue(textColorKey, colorBLUE, kCFPreferencesCurrentApplication); // Write out the preference data. CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
CFPreferencesSetAppValue だけでは、新しい環境設定を作成するのに十分ではないことに注意してください。実際に値を保存するには、CFPreferencesAppSynchronize への呼び出しが必要です。複数の環境設定を書き込んでいる場合は、個々の値が設定された後に同期するよりも、最後の値が設定された後に 1 回だけ同期する方が効率的です。たとえば、環境設定ペインを実装する場合は、ユーザーが [OK] ボタンを押したときにのみ同期できます。他の場合、アプリが終了するまで全く同期したくないかもしれませんが、アプリがクラッシュすると、保存されていないすべての環境設定が失われることに注意してください。
Core Foundation を使用して環境設定値を取得
環境設定値を見つけて取得する最も簡単な方法は、CFPreferencesCopyAppValue 関数を使用することです。この呼び出しは、指定したキーが見つかるまで、さまざまな環境設定ドメインを順に検索します。より特定的でないドメイン、つまり例えば任意のアプリに環境設定が設定されている場合、より具体的なバージョンが見つからない場合は、この呼び出しでその値が取得されます。リスト 2-3 は、リスト 2-2 に保存されているテキスト色の環境設定を取得する方法を示しています。
リスト 2-3 単純なデフォルトの読み込み
CFStringRef textColorKey = CFSTR("defaultTextColor"); CFStringRef textColor; // Read the preference. textColor = (CFStringRef)CFPreferencesCopyAppValue(textColorKey, kCFPreferencesCurrentApplication); // When finished with value, you must release it // CFRelease(textColor);
変更可能なオブジェクトを使用して値を設定しただけであっても、環境設定から返されるすべての値は変更不可能です。