When I write code for a timer like below, the timer doesn't fire if the device is locked. How do I cause the code in the timer closure to run when the app is in the background? Are there any other ways to cause specific code to run at a certain time when the app is in the background? func setTimer(alarm: UTIAlarm) {
let timer = Timer(fire: alarm.date!, interval: 0, repeats: false) {
(timer: Timer) in
print("timer fire \(self.dateFormatter.string(from: alarm.date!))")
do {
try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
} catch {
print("Failed to setActive AVAudioSession from timer closure.")
print(error.localizedDescription)
}
let predicate = MPMediaPropertyPredicate(value: alarm.mediaItem!.title, forProperty: MPMediaItemPropertyTitle)
let query = MPMediaQuery()
query.addFilterPredicate(predicate)
self.playerController!.setQueue(with: query)
self.playerController!.play()
}
runLoop.add(timer, forMode: .default)
timers.append(timer)
}