Site icon AppTractor

Я заставил мое приложение работать в офлайне — архитектурный сдвиг

У каждого разработчика иногда ночью возникают безумные мысли. У меня она была простой:

«Что, если я просто отключу интернет и посмотрю, как поведёт себя приложение?»

И я так и сделал. Я потянулся за стол, выдернул Ethernet-кабель из роутера и понаблюдал, как мигает маленький индикатор Wi-Fi, как будто всё в порядке.

Но моё приложение знало правду.

Экран входа мгновенно заблокировал меня.

В ленте новостей не было ничего, кроме бесконечного спиннера.

Даже страница настроек не работала — как будто для включения тёмного режима нужен интернет.

Вот тут-то меня и осенило.

Моё приложение на самом деле не было приложением. Оно было просто марионеткой, которой управлял интернет, дергая за все ниточки.

А когда я отключил ниточки, марионетка рухнула.

И я принял решение:

Я переделаю своё приложение так, чтобы оно работало только в offline режиме.

Никаких оправданий. Никаких сообщений «попробуйте ещё раз позже». Только локальная архитектура.

И этот выбор изменил всё в моём подходе к разработке приложений.

Когда интернет исчез

Вот что сломалось первым:

По сути, моё приложение представляло собой замаскированную вкладку браузера.

Поэтому я принял смелое решение. Я заставлю это приложение работать только в офлайн-режиме.

И вот тут-то и началось настоящее приключение.

Большой сдвиг в архитектуре

Мне пришлось всё переосмыслить. Вот как изменилось моё мышление.

1. От API-First к Local-First

До:

После:

Или, проще говоря, моё приложение перестало зависеть от облака. Оно стало работать самостоятельно.

2. Локальная база данных становится главной

Я годами игнорировал базы данных. Теперь они стали моими лучшими друзьями.

Новое правило: в пользовательском интерфейсе всегда отображается то, что находится в локальной базе данных.

3. Слой синхронизации: новое сердце

Это был самый большой сдвиг в мышлении.

Старый способ:

UI -> Call API -> Show Results

Новый способ:

UI -> Save to Local DB -> Queue for Sync -> Push to Server (when online)

Приложение работает даже без интернета. Когда устройство снова подключилось к сети, синхронизатор передал изменения.

4. Разрешение конфликтов: сложная часть

Этот этап заставил меня потерять сон.

Я пробовал разные стратегии:

В итоге я выбрал сочетание:

Не идеально. Но гораздо лучше, чем молчаливая потеря данных.

5. UX тоже нужно изменить

Офлайн-приложения ощущаются по-другому. Мне пришлось переработать интерфейс.

Два моих эксперимента: iOS и Flutter

Поскольку я делал приложение и на Swift, и на Flutter, вот как я решил эту проблему.

iOS (Swift + Core Data + Фоновая синхронизация)

// Save note offline first
func addNoteOffline(title: String, content: String) {
    let note = NoteEntity(context: context)
    note.title = title
    note.content = content
    note.isSynced = false
    saveContext()
    queueForSync(note)
}

// Sync later when online
func syncNotes() {
    let unsyncedNotes = fetchUnsyncedNotes()
    for note in unsyncedNotes {
        api.upload(note) { success in
            if success {
                note.isSynced = true
                saveContext()
            }
        }
    }
}

Flutter (Hive + Background Worker)

// Save task offline
void addTask(String title) {
  final task = Task(title, false, DateTime.now(), false);
  hiveBox.add(task.toJson());
  queueForSync(task);
}
// Sync later
Future<void> syncTasks() async {
  final tasks = hiveBox.values.where((t) => t['synced'] == false);
  for (var task in tasks) {
    final success = await api.upload(task);
    if (success) {
      task['synced'] = true;
      hiveBox.put(task['id'], task);
    }
  }
}

Оба стека следовали одному и тому же правилу.

Локально в первую очередь. Синхронизация потом.

Сюрпризы

Вот чего я не ожидал.

Уроки

Заключение

То, что начиналось как глупый эксперимент, превратилось в полную перестройку моего подхода к приложениям.

Заставив своё приложение работать офлайн, я понял его истинную сущность.

Оно стало мощнее, быстрее и удобнее для пользователя.

И я усвоил один важный урок:

Интернет — это не фича. Это роскошь. Офлайн — это выживание.

Так что, если вы разрабатываете приложение в 2025 году, попробуйте один раз. Выключите Wi-Fi, откройте приложение и посмотрите, что получится.

Вот тогда и проявятся настоящие уроки архитектуры.

Источник

Exit mobile version