Реалізація міграції користувальницьких налаштувань між версіями мобільного додатку
Користувач оновив додаток — і всі його налаштування скинулися на дефолтні. Тема «темна» стала «світлою», сповіщення включилися заново, вибраний мова змінилася на системну. Це трапляється, коли у новій версії переименували ключі у 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 день.







