ОК, похоже, ответ заключается в следующем: закройте код, чтобы ОС знала, что вы хотите продолжить обработку, пока приложение находится в фоновом режиме или когда включен экран блокировки.
DispatchQueue.global().async {
let thisActivity = ProcessInfo.processInfo.beginActivity(options: .userInitiated, reason: "Batch processing user report")
// Do stuff here
// e.g.
let operation = Operation()
let queue = DispatchQueue()
queue.addOperation(operation)
queue.waitUntilAllProcessesAreFinished()
//...
ProcessInfo.processInfo.endActivity(thisActivity)
}
Я не проверял все опции, чтобы увидеть, все ли они работают, но «.userInitiated» продолжает работать до завершения и НЕ мешает пользователю перевести систему в спящий режим. Другие параметры могут вести себя по-разному.