Background tasks на iOS и Android: что должен проверять QA
Приложение свёрнули — что с фоновыми задачами? Загрузка ассетов, синхронизация, аналитика, push-обработчики — всё это может молча умереть в фоне. Особенно неприятно потому что воспроизвести «в реальной жизни» сложно, а в продакшене это десятки процентов потерянных событий.
iOS
После того как юзер свернул приложение, у него есть ~30 секунд на завершение задач — затем iOS его «суспендит». Дальше можно работать только через специальные API:
BGAppRefreshTask— короткие задачи (~30 сек) для обновления данных.BGProcessingTask— длинные задачи (несколько минут), но iOS решает когда запустить — может через час, может через сутки.URLSession background config— для скачивания/выгрузки файлов в фоне.
QA-чек:
✅ Свернуть приложение в момент аплоада → дождаться завершения (Network Link Conditioner в slow) → разверни → файл загружен полностью, не наполовину.
✅ Low Power Mode включён → background fetch троттлится. Проверь что критичные задачи работают, некритичные — отложены.
✅ Приложение в фоне 24 часа → push → приложение проснулось, обработало → ушло обратно. Тест проводится через ночь.
Android
Android более жёсткий — особенно начиная с Android 8+ ввели background execution limits.
WorkManager— стандартный API для фоновых задач (включая deferrable, network-dependent).Foreground Service— для длинных задач которые юзер должен видеть (нотификация обязательна).JobScheduler— старый API, но всё ещё используется.
Android 12+ ввёл background restrictions: после push-уведомления у вас 10 секунд чтобы стартануть сервис. Не успел — крах.
Android 14+ требует explicit permission на forces foreground service.
QA-чек:
✅ Включи Battery Optimization для приложения → запусти задачу → свернись → подожди 30 минут → проверь что задача завершилась (или корректно отложилась).
✅ OEM-specific: Xiaomi MIUI, Huawei EMUI имеют свои autostart-белые списки. Без добавления приложения в Autostart фоновые задачи отрубаются через 1-2 часа без предупреждения.
✅ Doze mode: устройство не двигается 30 минут → Android режет background. WorkManager задачи копятся в maintenance windows (раз в час) — это нормальное поведение, но retention-критичные операции должны использовать setExpedited.
Что часто пропускают
— Аналитика теряется: события собрались в локальный буфер, приложение убили без flush → события потеряны. Проверь что batch flush’ится при applicationWillResignActive.
— WebSocket рвутся: соединение жило когда приложение было в foreground, при сворачивании iOS/Android рвёт. После возврата должен быть retry. Тест: 5 минут в фоне → возврат → состояние корректно синхронизировано.
— Cron-like задачи: «раз в час обновить данные» — на iOS это не гарантировано вообще. Не предполагай точность.
Тулзы для тестирования
— iOS: Xcode → Debug → Simulate Background Fetch — программно триггерит фоновую задачу.
— Android: adb shell am set-inactive com.example.app true — пометить приложение как inactive (имитация долгого отсутствия использования).
— Android Doze: adb shell dumpsys deviceidle force-idle — форсировать Doze для тестирования.
Подробнее: Apple Background Tasks framework, Android WorkManager.