Обновление и изменение файлов списка настроек с новыми версиями приложения
-
05-07-2019 - |
Вопрос
У меня есть файл plist настроек по умолчанию в папке ресурсов моего приложения, и при первом запуске он копируется в папку documents.
В последующих версиях приложения, как я могу объединить настройки plist в их документах с любыми новыми ключами и значениями (возможно, вложенными), которые были добавлены с предыдущей версии?
Я видел шаблон, в котором свойства фактически создаются как NSDictionary в приложении (со всеми настройками по умолчанию), а затем текущие настройки, сохраненные в файле plist, объединяются с этим словарем, и затем он сохраняется поверх текущего plist.
Это хороший подход?Если да, то как вы собираетесь объединить NSDictionary, которые могут иметь несколько вложенных значений, с подмассивами и вложенными словарями?
Кроме того, рекомендуется ли иметь отдельный пользовательский файл plist для настроек, или вы всегда должны использовать NSUserDefaults?Обрабатывает ли NSUserDefaults управление версиями и изменение значений по умолчанию?
Большое спасибо,
Майк
Решение
Хорошо, я думаю, что придумал лучший способ сделать это:
- (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];
}
}