Реалізація міграції кэша при оновленні мобільного додатку
Після оновлення додатку кэш може стати невалідним. Це не завжди очевидно: старі зображення завантажені під старими ключами, JSON-відповіді від API серіалізовані у старому форматі, HTTP-кэш містить заголовки з застарілими URL. Якщо не інвалідувати кэш при оновленні — користувач бачить старі дані вперемішку з новими, або додаток крашиться на десеріалізації.
Інвалідація кэша за версією додатку
Найпростіший і найнадійніший підхід: прив'язати ключі кэша до версії додатку або до версії API.
// Android — простір імен кэша за версією
object CacheKeyBuilder {
private val appVersion = BuildConfig.VERSION_CODE
fun forImage(imageId: String) = "img_v${appVersion}_$imageId"
fun forApiResponse(endpoint: String) = "api_v${appVersion}_$endpoint"
}
При оновленні VERSION_CODE всі ключі змінюються — старий кэш перестає використовуватися. Але при цьому старі файли залишаються на диску і потрібна явна очистка.
Очистка застарілого кэша при старті
// iOS
class CacheManager {
private let defaults = UserDefaults.standard
private let lastVersionKey = "lastCachedVersion"
func cleanupIfNeeded() {
let current = Bundle.main.buildVersionNumber
let last = defaults.string(forKey: lastVersionKey) ?? ""
guard current != last else { return }
clearDiskCache()
clearURLCache()
defaults.set(current, forKey: lastVersionKey)
}
private func clearDiskCache() {
let cacheDir = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
try? FileManager.default.removeItem(at: cacheDir.appendingPathComponent("ImageCache"))
}
private func clearURLCache() {
URLCache.shared.removeAllCachedResponses()
}
}
Викликаємо у application(_:didFinishLaunchingWithOptions:) до інініціалізації UI.
Kingfisher (iOS) та Glide (Android)
Обидві бібліотеки використовують власні дискові кэши. Kingfisher зберігає кэш у Library/Caches/com.onevcat.Kingfisher.ImageCache. Очистка:
KingfisherManager.shared.cache.clearDiskCache()
KingfisherManager.shared.cache.clearMemoryCache()
Glide: Glide.get(context).clearDiskCache() — тільки з фонового потоку.
Обсяг роботи
- Версіонування ключів кэша
- Інвалідація застарілого кэша при першому старті нової версії
- Очистка HTTP-кэша та кэша зображень
- Фонова очистка без блокування запуску
Строки
Базова інвалідація кэша при оновленні: 0,5 дня. З версіонованими ключами, збереженням важливого кэша та фоновою очисткою: 1 день.







