Actualizando & amp; cambiar la configuración de archivos de listas con nuevas versiones de una aplicación
-
05-07-2019 - |
Pregunta
Tengo un archivo plist de configuración predeterminada en la carpeta de recursos de mi aplicación, y en el primer inicio que se copia en la carpeta de documentos.
En versiones sucesivas de la aplicación, ¿cómo puedo fusionar la configuración de plist en sus documentos con las nuevas teclas & amp; valores (posiblemente anidados) que se han agregado desde la versión anterior?
He visto un patrón en el que las propiedades se crean realmente como NSDictionary en la aplicación (con todas las configuraciones predeterminadas), y luego la configuración actual guardada en el archivo plist se fusiona con ese diccionario, y luego se guarda sobre el plist actual.
¿Es ese un buen enfoque? Si es así, ¿cómo se combinan los NSDictionary que podrían tener varios valores anidados con sub matrices y sub diccionarios?
Además, ¿se recomienda tener un archivo plist personalizado separado para la configuración, o debería usar siempre NSUserDefaults? ¿NSUserDefaults maneja el control de versiones y el cambio de valores predeterminados?
Muchas gracias
Mike
Solución
Bien, creo que he encontrado la mejor manera de hacerlo:
- (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];
}
}