Ответ
Да, но с существенными ограничениями. 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)
Система управляет таким сеансом, даже если приложение приостановлено или завершено.
Важно: Непредназначенный для фона код будет приостановлен системой, что может привести к неполным операциям и утечкам памяти.