mobile-qahardware

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.