Реализация миграции кэша при обновлении мобильного приложения
После обновления приложения кэш может стать невалидным. Это не всегда очевидно: старые изображения загружены под старыми ключами, 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 день.







