2

목표 : 나는 Setting.Bundle에서iPhone 응용 프로그램 환경 설정을 런타임에 변경하는 방법은 무엇입니까?

내가 가진 런타임에 아이폰 응용 프로그램 환경 설정을 설정하려면 제목 = 버전과의 DefaultValue = 그래서 런타임에 새 버전의 난에이 사용할 수있는 경우 1.0

iphone 응용 프로그램 환경 설정 기본값을 변경하십시오. 그러나 나는 그렇게 할 수 없다. 대신 내 코드에서 뭐가 잘못 몰라요 1.1

의 1.0 보여주는

코드 :

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를 복사 읽고/그에서 쓸 수 있습니다 :

읽기 :

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

내가 질문을 이해하는 데 어려움이 있어요, 당신의 코드가 따라하기 쉬운 일이 아니다 (I 결코 registerDefaults를 사용하고 조금 멍청하다.)

번들은 읽기 전용입니다. 런타임에 번들을 업데이트 할 수 없습니다.

"런타임시 새 버전을 사용할 수있는 경우 iphone 응용 프로그램 환경 설정 기본값을 변경해야합니다." - 정말로. 버전 값은 이미 번들에 있습니다 (app.plist에서 가져옴)

다음 코드 줄을 사용하여 번들에서 앱 버전 값을 읽었습니다 : NSString * version = [[[NSBundle mainBundle] infoDictionary] objectForKey : (NSString *) kCFBundleVersionKey];

관련 문제