2

目的:私は利用可能な新しいバージョンがあるのであれば、実行時に私が持っている私は、タイトル=バージョンとのDefaultValue = 1.0実行時にiphoneアプリケーションの設定を変更するにはどうすればいいですか?

を持ってSetting.Bundleでは、実行時に

をiPhoneアプリケーションの環境を設定します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

私は質問を理解する難しさを持っていますし、あなたのコードが従うことは簡単ではありません(私は決してregisterDefaultsを使用し、それが何であるかに関するドキュメンテーションは少し曖昧です)

バンドルは読み取り専用です。実行時にバンドルを更新することはできません。

"実行時に新しいバージョンが利用可能な場合、私はiPhoneのアプリケーション設定のデフォルト値を変更する必要があります。" - あんまり。バージョン値は既にバンドルされています(あなたのapp.plistから取得しました)

次のコード行を使ってバンドルからアプリバージョンの値を読み取りました: NSString * version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];

関連する問題