Вы не должны решать эту проблему, устанавливая таймер, потому что вы не можете выполнять любой код в фоновом режиме. Представьте себе, что произойдет, если пользователь перезапустит свой iPhone тем временем или с некоторыми другими крайними случаями.
Используйте applicationDidEnterBackground: и applicationWillEnterForeground: методы вашего AppDelegate, чтобы получить желаемое поведение. Это намного более надежно, потому что оно также будет работать, когда ваше приложение полностью убито из-за перезагрузки или нехватки памяти.
Вы можете сэкономить время, когда таймер сработает в следующий раз, когда ваше приложение перейдет в фоновый режим, и проверитьесли вы должны принять меры, когда приложение возвращается на передний план. Также остановите и запустите таймер в этих методах. Пока ваше приложение работает, вы можете использовать таймер для запуска обновления в нужный момент.
Но вот код для фонового таймера:
var bgTask = UIBackgroundTaskIdentifier()
bgTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
UIApplication.shared.endBackgroundTask(bgTask)
})
let timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(notificationReceived), userInfo: nil, repeats: true)
RunLoop.current.add(timer, forMode: RunLoopMode.defaultRunLoopMode)