Atualizando e alterar as configurações de arquivos plist com novas versões de um aplicativo
-
05-07-2019 - |
Pergunta
Eu tenho um arquivo plist configurações padrão nos recursos pasta do meu aplicativo, e no primeiro lançamento que é copiado para a pasta de documentos.
Em sucessivas versões do aplicativo, como eu pode mesclar as configurações plist em seus documentos com as novas chaves e valores (possivelmente aninhados) que foram adicionadas desde a versão anterior?
Eu vi um padrão onde as propriedades são realmente criado como um NSDictionary no aplicativo (com todas as configurações padrão) e, em seguida, as configurações atuais guardados no arquivo plist está fundido com o dicionário, e que é então guardada sobre o plist atual.
É uma boa abordagem? Se sim, como você vai fazer sobre a fusão NSDictionary do que poderia ter vários valores aninhados com sub matrizes e sub dicionários?
Além disso, é aconselhável ter um arquivo plist personalizado separado para as configurações, ou você deve sempre usar NSUserDefaults? Does NSUserDefaults alça de versão e mudar padrões?
Muito obrigado,
Mike
Solução
Ok, eu acho que eu vim acima com a melhor maneira de fazê-lo:
- (void)readSettings {
// Get Paths
NSString *defaultSettingsPath = [[NSBundle mainBundle] pathForResource:@"DefaultSettings" ofType:@"plist"];
NSString *settingsPath = [self.applicationDocumentsPath stringByAppendingPathComponent:@"Settings.plist"];
// Read in Default settings
self.settings = [NSMutableDictionary dictionaryWithContentsOfFile:defaultSettingsPath];
// Read in Current settings and merge
NSDictionary *currentSettings = [NSDictionary dictionaryWithContentsOfFile:settingsPath];
for (NSString *key in [currentSettings allKeys]) {
if ([[self.settings allKeys] indexOfObject:key] != NSNotFound) {
if (![[currentSettings objectForKey:key] isEqual:[self.settings objectForKey:key]]) {
// Different so merge
[self.settings setObject:[currentSettings objectForKey:key] forKey:key];
}
}
}
}
- (void)saveSettings {
if (self.settings) {
NSString *settingsPath = [self.applicationDocumentsPath stringByAppendingPathComponent:@"Settings.plist"];
[self.settings writeToFile:settingsPath atomically:YES];
}
}