2

Цель: Я хочу, чтобы установить настройки iphone приложения во время выполненияКак изменить настройки настроек приложения iphone во время выполнения?

В Setting.Bundle У меня есть заголовок = Версия и 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

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

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

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

Reading:

+ (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]; 
} 

Writing:

+ (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

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

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

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

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

Смежные вопросы