Какие возможности для выполнения фоновой работы есть у iOS-приложения?

«Какие возможности для выполнения фоновой работы есть у iOS-приложения?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

1. Background Modes (Фоновые режимы)

Активируются в настройках проекта (Signing & Capabilities). Требуют обоснования при ревью в App Store.

  • Audio: Воспроизведение или запись звука.
  • Location Updates: Значимые изменения местоположения или посещение точек интереса (Visits).
  • Voice over IP (VoIP): Для звонков.
  • Background Fetch: Периодическое обновление контента (система сама определяет оптимальное время).
  • Remote Notifications: Получение тихих пуш-уведомлений (content-available: 1) для предзагрузки данных.

2. Background Tasks API (iOS 13+)

Универсальный и предпочтительный способ для коротких операций.

// 1. Запросить идентификатор задачи у системы
var backgroundTaskID: UIBackgroundTaskIdentifier?
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
    withName: "Data Sync Task") {
    // Блок expirationHandler: вызывается, если время истекло.
    // Необходимо завершить работу и очистить ресурсы.
    self.endBackgroundTask()
}

// 2. Выполнить работу на фоновой очереди
guard let taskID = backgroundTaskID else { return }
DispatchQueue.global().async {
    // Ваша фоновая работа (сеть, обработка данных)
    // ...

    // 3. Сообщить системе о завершении
    DispatchQueue.main.async {
        self.endBackgroundTask(taskID: taskID)
    }
}

func endBackgroundTask(taskID: UIBackgroundTaskIdentifier) {
    UIApplication.shared.endBackgroundTask(taskID)
    backgroundTaskID = .invalid
}

Важно: Система дает ~30 секунд после ухода в фон. По истечении времени вызывается expirationHandler.

3. Другие сценарии

  • NSURLSession с фоновой конфигурацией: Для загрузки/выгрузки больших файлов. Управляется системой.
  • Уведомления о значимых изменениях местоположения: Используют CLLocationManager и могут пробуждать приложение.

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