アプリケーション初インストール時のデフォルト設定をコントロールする

初めてインストールしたアプリケーションには、当り前だがそのアプリケーションの環境設定ファイルは存在しない。だから、ユーザーデフォルトとBindingで接続しているオブジェクトは、そのままでは「値なし*1」が設定されることになってしまう。前回のサンプルコードWindowAlphaプロジェクトの例では、スライダーは0(透明)の位置、windowの透明度は1(不透明)というチグハグな状態になっている。もっと複雑なアプリケーションであれば、正常に起動しないということも考えられる。
やはり、環境設定ファイルが存在しない時は、アプリケーションのデフォルト値を決めておいて、それを設定するようにしたい。Cocoaのユーザーデフォルトには、実はその仕組みもちゃんと用意されているそうだ。

上記のドキュメントから、以下のようにするべきと判断した。早速やってみる。

  • アプリケーションのデフォルト値を保存したUserDefaults.plistを用意する。
  • クラスメソッド「+ (void)initialize」の中で、NSUserDefaultsとNSUserDefaultsControllerに設定する。

UserDefaults.plistの作成

  • Xcodeのプロジェクトウィンドウで、グループとファイルのResourcesフォルダにUserDefaults.plistを新規追加した。
  • 追加したUserDefaults.plistをダブルクリックして、以下のように編集した。


      • iPhone SDK(beta 7)をインストールしたら、Xcodeは3.1にアップデートされ、Property List Editor.appは上記のようなスタイルに変更された。自分としては以前より見易くなったと感じているので嬉しい変更だ。

クラスメソッドinitializeの中での設定

  • AppControllerを追加して、クラスメソッドinitializeを定義する。(ドキュメントに倣い、処理を明確にするため、クラスメソッドsetupDefaultsも定義して、その中でユーザーデフォルトの諸設定を行った。)
  • アプリケーションとしてのデフォルト値を保存したUserDefaults.plistを読み込んで、NSUserDefaultsとNSUserDefaultsControllerに設定している。
+ (void)initialize {
    [self setupDefaults];
}

+ (void)setupDefaults {
    NSString *userDefaultsValuesPath;
    NSDictionary *userDefaultsValuesDict;
    
    // アプリケーションとしてのデフォルト値を読み込む
    userDefaultsValuesPath = [[NSBundle mainBundle] pathForResource:@"UserDefaults" 
                                                             ofType:@"plist"];
    userDefaultsValuesDict = [NSDictionary dictionaryWithContentsOfFile:userDefaultsValuesPath];
    
    // 読み込んだ値をNSUserDefaultsに設定
    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];
        
    // NSUserDefaultsControllerにも設定
    [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:userDefaultsValuesDict];
}

ユーザーデフォルトの挙動

  • 上記のように設定した場合、環境設定ファイル(~/Library/Preferences/com.yourcompany.WindowAlpha.plist)には、アプリケーションとしてのデフォルト値と違っているキーだけがファイルに保存される。(すべてのキーが同じなら環境設定ファイルさえ作成されない。)
  • アプリケーションとしてのデフォルト値に戻すボタンを実装する場合は、NSUserDefaultsControllerにも同じデフォルト値を設定する必要がある。(NSUserDefaultsControllerでコントロールする場合に必要。設定しないと、ボタンを押してもデフォルト値に戻らなかった。)
  • NSUserDefaultsにアプリケーションとしてのデフォルト値を設定しないで、NSUserDefaultsControllerだけに設定した場合、アプリケーションとしてのデフォルト値と同じ値であっても環境設定ファイルに保存される。(アプリケーションとしてのデフォルト値として読み取ることは出来た。しかし、Appleのドキュメントには、このようなことはやらないでくださいと書いてあった。)


これで初めて起動した時でも、安心できる!

*1:NSLogで確認すると「NULL」が表示された。