Реализация миграции кэша при обновлении мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация миграции кэша при обновлении мобильного приложения
Простая
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    874
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация миграции кэша при обновлении мобильного приложения

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