Я делаю музыкальный будильник c. Musi c потоков в течение выбранной пользователем продолжительности, в том числе в фоновом режиме, и в конце периода в дополнение к локальному уведомлению воспроизводится пользовательский звуковой сигнал.
Короче (1) установлен таймер (2) локальное уведомление отключается (3) потоковая музыка c останавливается (4) воспроизводится сигнал тревоги
Я могу сделать (1) и (2) в порядке, но не могу понять, как Триггер (3) или (4) , когда приложение находится в фоновом режиме.
Вот код для (1) и (2)
let center = UNUserNotificationCenter.current()
var trigger : UNNotificationTrigger!
//...
trigger = UNCalendarNotificationTrigger(dateMatching: Calendar.current.dateComponents([.hour, .minute], from: date), repeats: false)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
center.add(request)
Ваша помощь очень ценится.
Редактировать 1: Пробный таймер. Только смог заставить его работать, когда приложение находится на переднем плане.
if let interval = AppDataManager.shared.wakeupDate?.timeIntervalSince(Date.init()) {
print("interval ", interval)
self.wakeUpTimer = Timer.scheduledTimer(withTimeInterval: interval, repeats: false) { (timer) in
print("Timer Invoked")
self.stopPlay()
}
} else {
print("interval NOT AVAILABLE")
}
Редактировать 2:
print ("Wakeup date set is \(AppDataManager.shared.wakeupDate)")
print ("Date now is \(Date())")
let calendar = Calendar.current
let unitFlags = Set<Calendar.Component>([ .second])
let datecomponents = calendar.dateComponents(unitFlags, from: Date(), to: AppDataManager.shared.wakeupDate!)
let seconds = datecomponents.second
print(String(describing: seconds))
let secondsInDouble: Double = Double(seconds!)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
if appDelegate.globalTimer == nil {
print ("Timer started")
appDelegate.globalTimer = Timer.scheduledTimer(withTimeInterval: secondsInDouble, repeats: false, block: {_ in
NSLog("Right now the music should stop! ????")
//Function for music stop. This only works in Simulator, or when the app is active in the device
})
}