高レベル環境設定 API の使用
関数 CFPreferencesSetAppValue と CFPreferencesCopyAppValue は、アプリケーションが現在のユーザとアプリケーションに固有の環境設定を作成して取得する最も簡単な方法です。環境設定データは、デフォルトのドメイン (現在のユーザ、現在のアプリケーション、すべてのホスト) に書き込まれるため、このユーザがログインできるすべてのマシンで使用可能になります。これらの関数は、kCFPreferencesAnyApplication では決して呼び出されず、実際のアプリケーション ID または kCFPreferencesCurrentApplication のみで呼び出されます。
簡単な環境設定を格納する
環境設定は、キー/値のペアとして格納されます。キーは CFString オブジェクトでなければなりませんが、コンテナの型を含め、全ての Core Foundation プロパティリスト値 (Core Foundation のプロパティリストプログラミングトピック を参照の事) にすることができます。たとえば、アプリケーションが作成する新しいウィンドウの幅をピクセル単位で定義する defaultWindowWidth というキーがあるとします。その値はおそらく CFNumber 型の値になります。ウィンドウの幅と高さを defaultWindowSize という単一の環境設定に組み合わせ、その値を 2 つの CFNumber オブジェクトを含む CFArray オブジェクトにすることもできます。
リスト 1 のコードは、アプリケーション "MyTextEditor" の単純な環境設定を作成する方法を示しています。この例では、アプリケーションのデフォルトのテキストの色を青に設定しています。
リスト 1 : 単純なデフォルトを書き込む
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" ボタンを押したときにのみ同期することができます。それ以外の場合は、アプリケーションが終了するまではまったく同期しないかもしれませんが、アプリケーションがクラッシュした場合、保存されていないすべての設定が失われることに注意してください。
簡単な環境設定を読み込む
環境設定値を検索して取得する最も簡単な方法は、CFPreferencesCopyAppValue 関数を使用することです。この呼び出しは、指定したキーが見つかるまで、さまざまな環境設定ドメインを順に検索します。より具体的なバージョンが見つからない場合には、より特定でないドメインに環境設定が設定されている場合 (例えば "全てのアプリケーション")、この値はこの呼び出しで取得されます。リスト 2 は、リスト 1 に格納されているテキスト色の環境設定を取得する方法を示しています。
リスト 2 : 簡単なデフォルトを読み込む
CFStringRef textColorKey = CFSTR("defaultTextColor"); CFStringRef textColor; // Read the preference. textColor = (CFStringRef)CFPreferencesCopyAppValue(textColorKey, kCFPreferencesCurrentApplication); // When finished with value, you must release it // CFRelease(textColor);
変更可能なオブジェクトだけを使用して値を設定したとしても、環境設定から返されるすべての値は不変であることに注意してください。
簡単な環境設定の更新
簡単な環境設定の更新の例は、ラウンドが完了するたびにハイスコアの環境設定を検索するゲームです。ハイスコア環境設定がない場合、アプリケーションは現在のスコアをハイスコアとして書き込みます。ハイスコアの環境設定が存在する場合は、新しいスコアと比較され、新しいスコアが高い場合に更新されます。リスト 3 は、この過程を示しています。
リスト 3 : 環境設定の更新
CFStringRef highScoreKey = CFSTR("High Score"); CFNumberRef tempScore; int highScore; // Look for the preference. tempScore = (CFNumberRef)CFPreferencesCopyAppValue(highScoreKey, kCFPreferencesCurrentApplication); // If the preference exists, update it. If not, create it. if (tempScore) { // Numbers come out of preferences as CFNumber objects. if (!CFNumberGetValue(tempScore, kCFNumberIntType, &highScore)) { highScore = 0; } CFRelease(tempScore); printf("The old high score was %d.", highScore); } else { // No previous value. printf("There is no old high score."); highScore = 0; } highScore += 5; // Create the CFNumber to pass to the preference API. tempScore = CFNumberCreate(NULL, kCFNumberIntType, &highScore); // Set the preference value, or update it if it already exists. CFPreferencesSetAppValue(highScoreKey, tempScore, kCFPreferencesCurrentApplication); // Release the CFNumber. CFRelease(tempScore); // Write out the preferences. CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
リスト 3 に示す手法は、アプリケーションがグラフィック環境設定パネル内のユーザに表示するための環境設定のセットを検索することを試みる複数の環境設定のコンテキストに一般化します。環境設定が存在しない場合、デフォルト値が使用されます。既存の環境設定値が見つかった場合は、環境設定パネルを初期化してユーザに表示するため使用されます。ユーザが変更して "OK" ボタンを押すと、変更された環境設定値を設定して記憶装置に書き込めます。
前の章 次の章