Приложение для iPhone: как получить значение по умолчанию из root.plist? - PullRequest
13 голосов
/ 16 сентября 2009

Я работаю над приложением для iPhone

Я прочитал ключ из root.plist так:

NSString *Key1Var = [[NSUserDefaults standardUserDefaults] stringForKey:@"Key1"];

(«Key1» - это PSMultiValueSpecifier, для которого значение строки по умолчанию уже установлено в root.plist)

Это прекрасно работает, как только пользователь делает настройки. Но если пользователь запускает приложение до того, как он выполнит какие-либо настройки, он получит nil для «Key1». В таком случае я ожидал значение по умолчанию, которое я установил для «Key1». что я должен сделать, чтобы пользователю не нужно было делать настройки, чтобы приложение запускалось впервые?

С уважением, Хариш

Ответы [ 7 ]

14 голосов
/ 08 мая 2012

См. этот вопрос для полного решения.

Вы, по сути, хотите запустить этот код перед доступом к настройке:

- (void)registerDefaultsFromSettingsBundle {
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    if(!settingsBundle) {
        NSLog(@"Could not find Settings.bundle");
        return;
    }

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *prefSpecification in preferences) {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if(key) {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
        }
    }

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
    [defaultsToRegister release];
}

Это загрузит значения по умолчанию в объект standardUserDefaults, так что вы больше не получите нулевые значения и вам не нужно дублировать настройки по умолчанию в вашем коде.

4 голосов
/ 16 сентября 2009

Я делаю это рано после запуска, прежде чем пытаться получить свои настройки:

    userDefaultsValuesPath=[[NSBundle mainBundle] pathForResource:@"UserDefaults"
                                                           ofType:@"plist"];
    userDefaultsValuesDict=[NSDictionary dictionaryWithContentsOfFile:userDefaultsValuesPath];

    // set them in the standard user defaults
    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];

    if (![[NSUserDefaults standardUserDefaults] synchronize])
        NSLog(@"not successful in writing the default prefs");
3 голосов
/ 06 марта 2014

Вот код, который я использую в iOS 7, в значительной степени основанный на приведенном выше коде Майка Веллера .

Поместите этот метод в свой AppDelegate.m:

- (void)registerDefaultsFromSettingsBundleWithPlist:(NSString *)plist {
NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
if(!settingsBundle) {
    NSLog(@"Could not find Settings.bundle");
    return;
}
NSString *bundle = [NSString stringWithFormat:@"%@.plist",plist];
NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:bundle]];
NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];

NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
for(NSDictionary *prefSpecification in preferences) {
    NSString *key = [prefSpecification objectForKey:@"Key"];
    if(key) {
        [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
    }
}

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
//[defaultsToRegister release];
}

И затем вызывайте его для каждого файла настроек, который вы используете (для вложенных настроек), из некоторого места в начале вашего кода, как didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//register default settings into NSUserDefaults
    @try {
        [self registerDefaultsFromSettingsBundleWithPlist:@"Root"];
        [self registerDefaultsFromSettingsBundleWithPlist:@"Chat"];
        [self registerDefaultsFromSettingsBundleWithPlist:@"IVR"];
        [self registerDefaultsFromSettingsBundleWithPlist:@"Video"];
    }
    @catch (NSException * e) {
        NSLog(@"Exception: %@", e);
        NSLog(@"Try adding the Default Value field to each preference item in the Settings.bundle plist files.");
    }
    @finally {

    }
    ...
2 голосов
/ 24 апреля 2017

Версия Swift 3, основанная на оригинальном решении Майка Веллера , если оно кому-нибудь нужно:

static func registerDefaultsFromSettingsBundle() {

    guard let settingsBundle = Bundle.main.url(forResource: "Settings", withExtension: "bundle") else {
        print("Could not find Settings.bundle")
        return
    }
    guard let settings = NSDictionary(contentsOf: settingsBundle.appendingPathComponent("Root.plist")) else {
        print("Couldn't find Root.plist in settings bundle")
        return
    }

    guard let preferences = settings.object(forKey: "PreferenceSpecifiers") as? [[String: AnyObject]] else {
        print("Root.plist has an invalid format")
        return
    }

    var defaultsToRegister = [String: AnyObject]()
    for var p in preferences {
        if let k = p["Key"] as? String, let v = p["DefaultValue"] {
            print("Registering " + v.debugDescription + " for key " + k)
            defaultsToRegister[k] = v as AnyObject
        }
    }

    UserDefaults.standard.register(defaults: defaultsToRegister)
}
2 голосов
/ 28 ноября 2015

Я перевел решение Майка Веллера на Swift 2.0 / iOS 9 и заставил его работать для моего приложения:

func registerDefaultsFromSettingsBundle() {
    guard let settingsBundle = NSBundle.mainBundle().URLForResource("Settings", withExtension:"bundle") else {
        NSLog("Could not find Settings.bundle")
        return;
    }

    guard let settings = NSDictionary(contentsOfURL: settingsBundle.URLByAppendingPathComponent("Root.plist")) else {
        NSLog("Could not find Root.plist in settings bundle")
        return
    }

    guard let preferences = settings.objectForKey("PreferenceSpecifiers") as? [[String: AnyObject]] else {
        NSLog("Root.plist has invalid format")
        return
    }

    var defaultsToRegister = [String: AnyObject]()
    for var p in preferences {
        if let k = p["Key"] as? String, v = p["DefaultValue"] {
            NSLog("%@", "registering \(v) for key \(k)")
            defaultsToRegister[k] = v
        }
    }

    NSUserDefaults.standardUserDefaults().registerDefaults(defaultsToRegister)
}
0 голосов
/ 08 мая 2012
NSBundle* mainBundle = [NSBundle mainBundle]; 

1002 *

// Reads the value of the custom key I added to the Info.plist
NSString *value = [mainBundle objectForInfoDictionaryKey:@"key"];

//Log the value
NSLog(@"Value = %@", value);

// Get the value for the "Bundle version" from the Info.plist
[mainBundle objectForInfoDictionaryKey:@"CFBundleVersion"];

// Get the bundle identifier
[mainBundle bundleIdentifier];
0 голосов
/ 16 сентября 2009

В моем делегате приложения я перезаписываю метод +initialize и регистрирую настройки нового приложения по умолчанию.

Например:

+ (void) initialize {
    if ([self class] == [MyAppDelegate class]) {        
        // initialize user defaults dictionary
        BOOL isFirstTimeRun = YES;
        BOOL isKeychainTurnedOn = NO;
        BOOL isSSLTurnedOn = YES;
        NSString *testURLString = @"http://stackoverflow.com";
        NSMutableDictionary *resourceDict = [NSMutableDictionary dictionary];
        [resourceDict setObject:[NSNumber numberWithBool:isFirstTimeRun] forKey:kIsFirstTimeRunKey];
        [resourceDict setObject:[NSNumber numberWithBool:isKeychainTurnedOn] forKey:kIsKeychainTurnedOnKey];
        [resourceDict setObject:[NSNumber numberWithBool:isSSLTurnedOn] forKey:kIsSSLTurnedOnKey];
        [resourceDict setObject:testURLString forKey:kTestURLString];
        [[NSUserDefaults standardUserDefaults] registerDefaults:resourceDict];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...