Реализация миграции пользовательских настроек между версиями мобильного приложения
Пользователь обновил приложение — и все его настройки сбросились на дефолтные. Тема «тёмная» стала «светлой», уведомления включились заново, выбранный язык сменился на системный. Это происходит, когда в новой версии переименовали ключи в SharedPreferences / UserDefaults или изменили тип хранимого значения. Без явной миграции старые значения просто игнорируются.
Стратегия миграции UserDefaults / SharedPreferences
Основной принцип — версионирование хранилища настроек, аналогичное версионированию базы данных.
// Android
class SettingsMigration(private val prefs: SharedPreferences) {
private val PREFS_VERSION_KEY = "prefs_version"
fun migrate() {
val currentVersion = prefs.getInt(PREFS_VERSION_KEY, 0)
if (currentVersion < 1) migrateV0toV1()
if (currentVersion < 2) migrateV1toV2()
prefs.edit().putInt(PREFS_VERSION_KEY, CURRENT_VERSION).apply()
}
private fun migrateV0toV1() {
// Переименование ключа: "dark_mode" (boolean) → "theme" (string)
val wasDark = prefs.getBoolean("dark_mode", false)
prefs.edit()
.putString("theme", if (wasDark) "dark" else "light")
.remove("dark_mode")
.apply()
}
}
Вызывается при первом запуске новой версии — до инициализации UI.
// iOS
class SettingsMigrator {
private let defaults = UserDefaults.standard
private let versionKey = "settingsVersion"
func migrate() {
let version = defaults.integer(forKey: versionKey)
if version < 1 { migrateToV1() }
if version < 2 { migrateToV2() }
defaults.set(2, forKey: versionKey)
}
private func migrateToV1() {
// Bool → String enum
let wasDark = defaults.bool(forKey: "darkMode")
defaults.set(wasDark ? "dark" : "light", forKey: "theme")
defaults.removeObject(forKey: "darkMode")
}
}
Что входит в работу
- Аудит текущих ключей
SharedPreferences/UserDefaults - Версионирование хранилища настроек
- Миграторы для переименований и изменений типов
- Запуск миграции при старте приложения до инициализации UI
Сроки
Миграция настроек для 1–2 версий: 0,5 дня. Полный аудит и цепочка миграций для нескольких версий: 1 день.







