Как вызвать функцию, когда приложение неактивно (например, проигрывание музыки c в фоновом режиме)? - PullRequest
0 голосов
/ 20 марта 2020

Я делаю музыкальный будильник 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
            })
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...