Setting Bundle の設定は設定を変更して初めて反映されるので、アプリ起動時に反映させる方法をメモ。

以下のように NSUserDefaults のエクステンションにした。
registerDefaults を使わなかったのは Setting Bundle の設定をリセットしたかったから。
registerDefaults でも削除はみたいだけど、置き換えるようなカタチでやるみたい。

extension NSUserDefaults {

    /**
     Setting.bundle の初期設定を NSUserDefaults に登録する

     - parameter plistName: String
     */
    public static func registerSettingBundleDefaults(plistName: String = "Root") {
        guard let plist = NSBundle.mainBundle().pathForResource(plistName, ofType: "plist", inDirectory: "Settings.bundle") else {
            return
        }

        let settings = NSDictionary(contentsOfFile: plist)!
        guard let prefs = settings.objectForKey("PreferenceSpecifiers") as? NSArray else {
            return
        }

        let userDefaults = NSUserDefaults.standardUserDefaults()
        for pref in prefs {
            guard let key = pref.objectForKey("Key") else {
                continue
            }

            let obj = userDefaults.objectForKey(key as! String)
            if obj == nil {
                guard let defaultValue = pref.objectForKey("DefaultValue") else {
                    continue
                }
                userDefaults.setObject(defaultValue, forKey: key as! String)
            }
        }
        userDefaults.synchronize()
    }

    /**
     Setting.bundle の設定を NSUserDefaults から削除する(Setting.bundle の設定をリセットする)

     - parameter plistName: String
     */
    public static func removeSettingBundleDefaults(plistName: String = "Root") {
        guard let plist = NSBundle.mainBundle().pathForResource(plistName, ofType: "plist", inDirectory: "Settings.bundle") else {
            return
        }

        let settings = NSDictionary(contentsOfFile: plist)!
        guard let prefs = settings.objectForKey("PreferenceSpecifiers") as? NSArray else {
            return
        }

        let userDefaults = NSUserDefaults.standardUserDefaults()
        for pref in prefs {
            guard let key = pref.objectForKey("Key") else {
                continue
            }
            userDefaults.removeObjectForKey(key as! String)
        }
        userDefaults.synchronize()
    }
}

Next PostPrevious Post