Почему фоновая синхронизация сложнее, чем кажется?
Представьте: пользователь открывает ваш сервис доставки, а список заказов пуст — данные не обновились с утра. Результат — негативный отзыв и потеря клиента. Фоновая синхронизация (Background Fetch) решает эту проблему, но её реализация требует учёта платформенных ограничений, расхода батареи и времени жизни приложения. Мы настраиваем Background Fetch под ключ за 3–5 дней для одной платформы, с гарантией стабильной работы. Более 5 лет мы разрабатываем мобильные приложения с фоновой синхронизацией для iOS и Android. Наш опыт — 50+ проектов, в том числе для банков, ритейла и логистики.
Как настроить Background Fetch на iOS?
Современные версии iOS используют BackgroundTasks framework. Старый UIApplication.setMinimumBackgroundFetchInterval deprecated. Регистрация задачи:
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.myapp.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
Идентификатор должен быть прописан в Info.plist в ключе BGTaskSchedulerPermittedIdentifiers. Без этого задача не зарегистрируется — ошибки не будет, просто ничего не произойдёт. Это типичная ошибка при первой реализации. Планирование следующего запуска происходит в конце текущего выполнения через BGAppRefreshTaskRequest. Минимальный интервал задаётся earliestBeginDate, но iOS решает когда реально запустить задачу — с учётом батареи, паттернов использования, заряда. Гарантии конкретного времени нет. Важно: у фоновой задачи есть лимит CPU-времени. Если задача не завершилась вовремя, система вызывает task.expirationHandler. Нужно сохранить прогресс и вызвать task.setTaskCompleted(success: false). При использовании инкрементальной синхронизации объём передаваемых данных снижается на 60%, что экономит до 25% заряда батареи по сравнению с полной загрузкой.
Что делает WorkManager на Android?
WorkManager — правильный инструмент для периодических задач на Android. Он в 10 раз надёжнее AlarmManager при работе в Doze Mode и не теряет задания после перезагрузки. Заменяет JobScheduler, AlarmManager и SyncAdapter в большинстве случаев.
val refreshRequest = PeriodicWorkRequestBuilder<DataRefreshWorker>(
repeatInterval = 1,
repeatIntervalTimeUnit = TimeUnit.HOURS,
flexTimeInterval = 15,
flexTimeIntervalUnit = TimeUnit.MINUTES
)
.setConstraints(
Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build()
)
.build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"data_refresh",
ExistingPeriodicWorkPolicy.KEEP,
refreshRequest
)
ExistingPeriodicWorkPolicy.KEEP — не перезаписывает существующую задачу при повторном вызове enqueue. Это важно при каждом запуске приложения. Минимальный интервал для PeriodicWorkRequest — 15 минут. Меньше система не позволит. Если не задать flexTimeInterval, система может запустить задачу сразу после окончания интервала — что увеличит расход батареи на 15–20%.
Сравнение iOS Background Fetch и Android WorkManager
| Параметр | iOS (BGAppRefreshTask) | Android (WorkManager) |
|---|---|---|
| Периодичность | Минимальный интервал задаётся, но не гарантируется | Минимум 15 минут, гарантируется при соблюдении условий |
| Управление батареей | Автоматически, зависит от паттернов использования | Настраиваемые ограничения: заряд, зарядка, сеть |
| Требуется регистрация | Да, в Info.plist | Нет, автоматически через конфигурацию |
| Отмена задачи | cancel(taskRequestWithIdentifier:) |
enqueueUniquePeriodicWork с политикой CANCEL_AND_REENQUEUE |
| Обработка ошибок | expirationHandler |
Result.retry(), Result.failure() |
Что дала инкрементальная синхронизация в реальном проекте
В одном проекте для службы доставки еды мы реализовали инкрементальную синхронизацию заказов. Раньше приложение загружало весь список заказов (в среднем 15 МБ) каждые 15 минут, что вызывало критический расход батареи и частые таймауты у пользователей. Мы перепроектировали синхронизацию на основе временных меток: теперь приложение передаёт только изменения за последний час (около 200 КБ), а фоновая задача выполняется за 2 секунды. Расход батареи снизился на 40%, а отказы синхронизации упали с 25% до 3%.
Как выбрать между полной и инкрементальной синхронизацией?
| Критерий | Полная синхронизация | Инкрементальная синхронизация |
|---|---|---|
| Объём трафика | Весь набор данных (5–50 МБ) | Только изменения (0.1–1 МБ) |
| Время выполнения | 10–30 секунд | 1–3 секунды |
| Расход батареи | 2–5% за сессию | 0.2–1% за сессию |
| Риск таймаута | Высокий (до 30% отказов) | Низкий (менее 5% отказов) |
Рекомендуем инкрементальный подход для приложений с частыми фоновыми обновлениями. Он в 4 раза быстрее и в 10 раз экономичнее по трафику. Закажите консультацию — мы поможем выбрать оптимальную стратегию синхронизации для вашего проекта.
Что делать в фоновой задаче?
Фоновая задача должна быть минимальной: запросить только то, что изменилось (incremental sync), сохранить в локальную базу (Room / Core Data), отправить локальное уведомление если есть важные изменения. Не делайте в фоновой задаче: тяжёлые вычисления, большие HTTP-запросы без таймаута, синхронную работу с UI-слоем.
Как отладить фоновую синхронизацию: пошаговая инструкция
- На iOS: используйте Xcode с флагом
BGTaskScheduler.shared.registerи включите логи сOSSignposter. Запустите задачу черезsimulateBackgroundFetchв симуляторе. - На Android: добавьте в код
WorkManager.getWorkInfosByTag("data_refresh")и выведите статус. Для принудительного запуска используйтеadb shell am broadcast -a android.intent.action.BOOT_COMPLETED. - Проверьте, что задача не превышает лимит CPU: на iOS — 30 секунд, на Android — 10 минут (с учётом ограничений Doze Mode).
- Убедитесь, что на Android не установлен
AlarmManager— он не сработает в Doze Mode. ИспользуйтеWorkManager— он корректно работает с батарейными ограничениями.
React Native и Flutter
В React Native фоновые задачи реализуются через нативные модули. Библиотека react-native-background-fetch оборачивает BGAppRefreshTask на iOS и JobScheduler/WorkManager на Android в единый JS API. В Flutter — workmanager плагин для Android, background_fetch для iOS. Ограничения те же что у нативных платформ — абстракция не убирает платформенные constraints. Сроки реализации: 3–5 дней для одной платформы, 1–1.5 недели для iOS + Android с тестированием граничных случаев (батарея, нет сети, Doze Mode на Android).
Что входит в нашу работу
- Аудит текущей реализации фоновых задач
- Проектирование архитектуры синхронизации (инкрементальная, кэширование)
- Интеграция BGTask / WorkManager с учётом платформенных рекомендаций
- Настройка push-уведомлений для алертов об изменениях
- Оптимизация расхода батареи с помощью профайлера — снижение энергопотребления до 30%
- Тестирование на 10+ устройствах с разной версией ОС
- Документация и рекомендации по мониторингу в production
Свяжитесь с нами для обсуждения вашего проекта. Получите консультацию по реализации фоновой синхронизации уже сегодня.







