Xamairn.iOSでSettingsBundleのDefaultValueが取得できない

提供: MonoBook
ナビゲーションに移動 検索に移動


Xamarin.iOSでSettings Bundleから値を取得しようとすると「DefaultValue」に設定した値ではなく必ずnullが返ってきてしまう。iPadの設定画面上ではちゃんと表示されているのにアプリからだとnullが返ってくる。

これはXamarin.iOSに限った話ではなくObjective-CSwiftでも同様。

この問題を回避するにはアプリ起動時一発目に以下のようなコードを走らせるとよい。 ググれObjective-CSwiftでの実装例もでてくる。

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    SetDefaultsFromSettingsBundle();
}

void SetDefaultsFromSettingsBundle()
{
    var settingsUrl = NSBundle.MainBundle.PathForResource("Settings.bundle/Root.plist", null);
    var settingsPlist = new NSDictionary(settingsUrl);
    if (settingsPlist == null)
        return;

    var preferences = settingsPlist["PreferenceSpecifiers"] as NSArray;
    if (preferences == null)
        return;

    var ud = NSUserDefaults.StandardUserDefaults;

    foreach (var pitem in NSArray.FromArray<NSDictionary>(preferences))
    {
        // keyがないのはセパレーター等なのですっ飛ばす
        var key = pitem["Key"] as NSString;
        if (key == null)
            continue;

        // 初期値を取得する
        var val = pitem["DefaultValue"];
        if (val == null)
            continue;

        // 既存のvalueがnullじゃないのは入力済みなのですっ飛ばす
        var cur = ud.ValueForKey(key);
        if (cur != null)
            continue;

        // 明示的に保存する。
        ud.SetValueForKey(val, key);
    }
    
    // いらない気もするが明示的にフラッシュしとく。
    ud.Synchronize();
}