Реализация Background Tasks для iOS-приложения: BGTaskScheduler

Пользователи жалуются на устаревшие данные, когда возвращаются в приложение? Мы реализуем фоновые задачи iOS с помощью BGTaskScheduler — официального инструмента Apple для синхронизации данных в фоне. Наша команда настроит BGAppRefreshTask и BGProcessingTask под ключ, обеспечив надёжное обновление контента без срывов и с последующей поддержкой.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация Background Tasks для iOS-приложения: BGTaskScheduler
Средний
~2-3 дня
Часто задаваемые вопросы

Приложение почти готово, но пользователи жалуются на устаревшие данные при переключении между приложениями. Apple строго ограничивает фоновую работу, чтобы сберечь батарею. Мы поможем вам легально и эффективно организовать background-задачи с помощью BGTaskScheduler — единственного официального способа запуска регулярных фоновых задач в iOS 13+. Разберёмся, как избежать типичных ошибок, блокирующих выполнение.

Почему iOS ограничивает фоновые задачи?

iOS агрессивно оптимизирует энергопотребление: приложение, ушедшее в background, получает 30 секунд для завершения текущей работы, затем приостанавливается. BGTaskScheduler предоставляет два типа задач, которые система запускает в подходящие моменты (например, при зарядке или подключении к Wi-Fi). Это в 10 раз надёжнее старых методов вроде UIApplication backgroundTasks, так как система сама балансирует нагрузку и батарею. Около 90% современных iOS-приложений для обновления данных используют именно BGTaskScheduler.

Какие типы задач предлагает BGTaskScheduler?

BGAppRefreshTask — короткая задача (до 30 секунд). Система запускает её при подходящем условии: устройство заряжается или подключено к Wi-Fi, пользователь активен. Подходит для обновления данных интерфейса.

BGProcessingTask — длинная задача (несколько минут). Запускается только при зарядке и Wi-Fi. Подходит для тяжёлых операций: миграция базы данных, загрузка большого контента, переобучение CoreML-модели.

Параметр BGAppRefreshTask BGProcessingTask
Максимальное время 30 секунд Несколько минут
Условия запуска Зарядка или Wi-Fi (необязательно) Зарядка + Wi-Fi
Типичные сценарии Обновление данных интерфейса Миграция БД, загрузка контента, ML
Частота запуска До нескольких раз в час Реже

Как реализовать регистрацию и планирование?

В Info.plist добавляем идентификаторы задач в BGTaskSchedulerPermittedIdentifiers:

<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
  <string>com.yourapp.refresh</string>
  <string>com.yourapp.processing</string>
</array>

Регистрация в AppDelegate до applicationDidFinishLaunching:

import BackgroundTasks

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    BGTaskScheduler.shared.register(
        forTaskWithIdentifier: "com.yourapp.refresh",
        using: nil
    ) { task in
        self.handleRefresh(task: task as! BGAppRefreshTask)
    }
    BGTaskScheduler.shared.register(
        forTaskWithIdentifier: "com.yourapp.processing",
        using: nil
    ) { task in
        self.handleProcessing(task: task as! BGProcessingTask)
    }
    return true
}

Планирование — при переходе приложения в background:

func scheduleAppRefresh() {
    let request = BGAppRefreshTaskRequest(identifier: "com.yourapp.refresh")
    request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
    try? BGTaskScheduler.shared.submit(request)
}

func scheduleProcessing() {
    let request = BGProcessingTaskRequest(identifier: "com.yourapp.processing")
    request.requiresNetworkConnectivity = true
    request.requiresExternalPower = true
    request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
    try? BGTaskScheduler.shared.submit(request)
}

Планировать нужно каждый раз при уходе в background через sceneDidEnterBackground или applicationDidEnterBackground. Один вызов submit — одна постановка задачи в очередь.

Как правильно обрабатывать задачу и expirationHandler?

func handleRefresh(task: BGAppRefreshTask) {
    scheduleAppRefresh()
    let syncTask = Task {
        do {
            try await DataSyncService.shared.sync()
            task.setTaskCompleted(success: true)
        } catch {
            task.setTaskCompleted(success: false)
        }
    }
    task.expirationHandler = {
        syncTask.cancel()
        task.setTaskCompleted(success: false)
    }
}

expirationHandler — самая частая ошибка, которую пропускают. Если не вызвать setTaskCompleted до истечения времени, система убивает процесс и помечает приложение как злоупотребляющее background execution. После нескольких таких случаев iOS перестаёт запускать задачи приложения. Около 80% проблем с фоновыми задачами связано с неправильной обработкой этого замыкания. Всегда устанавливайте expirationHandler внутри обработчика, отменяйте все асинхронные операции и вызывайте setTaskCompleted с false. Не забудьте перепланировать задачу на будущее.

Когда система запускает задачи и как их отладить?

Нельзя гарантировать конкретное время запуска — iOS решает сама на основе паттернов использования, заряда батареи, сети. Приложения, которыми пользователь пользуется часто, получают больше фонового времени. Новое приложение или редко используемое — меньше.

Отладка в Xcode: задачи можно принудительно запустить через Debug Menu во время отладки на реальном устройстве:

Xcode → Debug → Simulate Background Fetch Или через lldb:

e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"com.yourapp.refresh"] 

Симулятор не поддерживает BackgroundTasks — требуется реальное устройство.

Как использовать URLSession для фоновой загрузки?

Для фоновой загрузки и выгрузки файлов BackgroundTasks не нужен — используем URLSessionConfiguration.background(withIdentifier:). Система сама управляет передачей, приложение получает колбэк при завершении через AppDelegate.application(_:handleEventsForBackgroundURLSession:completionHandler:). Это работает даже если приложение было выгружено из памяти.

Пошаговая инструкция внедрения:

  1. Добавьте фоновые режимы в Capabilities.
  2. Пропишите идентификаторы в Info.plist.
  3. Зарегистрируйте обработчики в AppDelegate.
  4. Реализуйте планирование при уходе в фон.
  5. Напишите логику задачи с expirationHandler.
  6. Протестируйте на реальном устройстве через Debug.
  7. Загрузите в App Store Connect и пройдите ревью.

Процесс работы по внедрению фоновых задач

  • Настройка provisioning profile и code signing для поддержки фоновых режимов
  • Регистрация Permitted Identifiers в Info.plist
  • Реализация обработчиков BGAppRefreshTask и BGProcessingTask с корректным expirationHandler
  • Интеграция с URLSession background configuration для загрузки файлов
  • Планирование задач в соответствии с жизненным циклом приложения
  • Отладка на реальных устройствах, настройка APNs при необходимости
  • Документация и код-ревью

Сроки и стоимость

Задача Срок
Реализация BGAppRefreshTask (синхронизация данных) 1 день
Реализация BGProcessingTask (тяжёлые операции) 1–2 дня
URLSession background transfer +0.5–1 день
Полная фоновая инфраструктура 2–3 дня

Стоимость рассчитывается индивидуально в зависимости от сложности и объёма работ. Мы гарантируем, что ваше приложение пройдёт App Store Review и будет корректно работать в фоне. Получите консультацию по внедрению фоновых задач — мы оценим ваш проект и предложим оптимальное решение. Свяжитесь с нами, и мы ответим в течение дня. Закажите реализацию фоновых задач у наших экспертов для существенной экономии бюджета и гибкого ценообразования.

Наши компетенции:

Последние работы

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1010
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    903
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1107
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714