Как изменить настройки приложения iphone во время выполнения? - PullRequest
2 голосов
/ 22 января 2011

Цель: установить настройки приложения iphone во время выполнения

В Setting.Bundle у меня есть title = Version и DefaultValue = 1.0

Таким образом, во время выполнения, если доступна новая версия, мне нужно изменить значение по умолчанию в настройках приложения iphone. Но я не могу этого сделать. Показывает 1,0 вместо 1,1

Я не знаю, что не так в моем коде

Код:

 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) {

        if([key isEqualToString:@"name_preference"])
        {
            NSString *a=[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
            [defaultsToRegister setObject:a forKey:key];
        }
        else {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];

        }


    }
}

[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];

Ответы [ 2 ]

2 голосов
/ 07 февраля 2011

Ваш пакет доступен только для чтения, поэтому все, что вы хотите записать, необходимо экспортировать.Вы можете использовать стандартные значения по умолчанию, чтобы сохранить всю эту информацию, если хотите.Это довольно просто:

NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
NSString *build = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
[standardDefaults setObject: build forKey:@"MyAppBuild"];
[standardDefaults setObject: version forKey:@"MyAppVersion"];
[standardDefaults synchronize]; 

Кроме того, вы можете скопировать лист в файловую систему устройства и читать и записывать в / из него:

Чтение:

+ (NSDictionary *) loadAppData {
    NSString *finalPath;

    // Load "defaults" plist
    NSArray *paths =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    NSString *writablePath = [documentsPath stringByAppendingPathComponent:@"AppSettings.plist"];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    if([fileManager fileExistsAtPath: writablePath]){
        finalPath = writablePath;
    }
    else{
        NSString *path = [[NSBundle mainBundle] bundlePath];
        finalPath = [path stringByAppendingPathComponent:@"AppSettings.plist"];
    }

    return [NSDictionary dictionaryWithContentsOfFile: finalPath];
}

Запись:

+ (void) saveAppData: (NSDictionary *) appData {

    // Load "defaults" plist
    NSArray *paths =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 
    NSString *writablePath = [documentsPath stringByAppendingPathComponent:@"AppSettings.plist"];

    // Save it
    [appData writeToFile: writablePath atomically: YES];
}
0 голосов
/ 07 февраля 2011

Мне трудно понять вопрос, и ваш код нелегок (я никогда не использую registerDefaults и документация о том, что он делает, немного расплывчата)

Пакеты только для чтения. Вы не можете обновить пакеты во время выполнения.

«Так что во время выполнения, если доступна новая версия, мне нужно изменить значение по умолчанию для приложения iphone». -- на самом деле, нет. Значение версии уже будет в пакете (взято из вашего app.plist)

Я прочитал значение версии приложения из пакета со следующей строкой кода: NSString * version = [[[NSBundle mainBundle] infoDictionary] objectForKey: (NSString *) kCFBundleVersionKey];

...