Какие способы выполнения кода в background доступны в iOS?

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

Ответ

Да, но с существенными ограничениями. iOS разрешает фоновое выполнение только для определённых сценариев:

1. Background Modes (Info.plist) Требуют явного объявления и одобрения Apple:

  • Audio — воспроизведение или запись
  • Location updates — значимые изменения местоположения
  • Voice over IP — поддержка звонков
  • External accessory communication — работа с подключёнными устройствами
  • Background fetch — периодическое обновление контента
  • Remote notifications — обработка push-уведомлений с контентом

2. Background Tasks API (iOS 13+) Рекомендуемый способ для коротких операций:

// Запросить время для фоновой задачи
let taskIdentifier = UIApplication.shared.beginBackgroundTask {
    // Очистка при истечении времени
}

// Выполнить операцию
DispatchQueue.global().async {
    // Долгая операция (сеть, обработка)

    // Обязательно завершить задачу
    UIApplication.shared.endBackgroundTask(taskIdentifier)
}
  • Лимит времени: Обычно ~30 секунд. Точное время можно проверить через UIApplication.shared.backgroundTimeRemaining.
  • Система может прервать задачу в любой момент, если потребуются ресурсы.

3. URLSession с Background Configuration Для длительных сетевых операций (загрузка/выгрузка):

let config = URLSessionConfiguration.background(withIdentifier: "com.app.upload")
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

Система управляет таким сеансом, даже если приложение приостановлено или завершено.

Важно: Непредназначенный для фона код будет приостановлен системой, что может привести к неполным операциям и утечкам памяти.