Таймер останавливается несмотря на то, что включена фоновая функция - PullRequest
0 голосов
/ 22 марта 2020

Я использую AVAudioPlayer для воспроизведения зацикленного звука. Мой текущий код имеет следующую строку: audioPlayer.numberOfLoops = -1, что приводит к неопределенному l oop. Я использую таймер, чтобы остановить зацикливание звука через определенный промежуток времени. Это работает, когда приложение находится на переднем плане, но не после того, как оно переходит на задний план.

Фоновые возможности моего приложения:

enter image description here

Несмотря на то, что включен фоновый режим и воспроизводится звук во время перехода приложения в на фоне приложение выглядит как , оно приостановлено сразу после вызова applicationDidEnterBackground. Я так говорю, потому что (1) таймер прекращает печатать вывод на консоль каждую секунду (2) звук продолжает воспроизводиться бесконечно даже после того, как таймер должен был закончиться.

Я прочитал здесь , что это должно В противном случае приложение не должно быть приостановлено, если в фоновом режиме воспроизводится звук, но в моем приложении это не так.

Что мне здесь не хватает? Что я должен сделать, чтобы таймер действительно работал в фоновом режиме, кроме воспроизведения зацикленного звука, если его недостаточно?

Код для запуска аудио:

    var audioPlayer = AVAudioPlayer()
    do {
        let (fileName, fileExtension) = fileNameExtension(fileName: soundFileName)
        let soundURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: fileName, ofType: fileExtension)!)
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
        audioPlayer.prepareToPlay()            
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(.playback, mode: .default, options: [.allowAirPlay, .allowBluetooth, .allowBluetoothA2DP, .mixWithOthers])            
            try AVAudioSession.sharedInstance().setActive(true)
        } catch let error as NSError {
        print("Fetch error: \(error) description: \(error.userInfo)")
        }   
    } catch let error as NSError {
        print("Fetch error: \(error) description: \(error.userInfo)")
    }
    audioPlayer.numberOfLoops = -1        
    audioPlayer.play()

Код для запустить таймер Этот код выполняется, когда приложение находится на переднем плане .:

    timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self] _ in
        self?.updateTimer()
    })        
    RunLoop.current.add(timer, forMode: .common)        
    timer.tolerance = 0.2

updateTimer:

@objc func updateTimer() {        
    remainingTime -= 1              
    if remainingTime <= 0.0 {
       complete()
    }        
}

1 Ответ

0 голосов
/ 23 марта 2020

Вопрос имеет несколько ложных предпосылок:

  • applicationDidEnterBackground не означает, что ваше приложение будет приостановлено. Это обычно , но если у вас есть возможность режима звукового фона и категория звука playback, и вы воспроизводите звук, когда вы go в фоновом режиме, вы не приостановлены; вместо этого вы запускаете в фоновом режиме.

  • Таймер, который запускается до того, как вы go в фоновом режиме в этих условиях работает в фоновом режиме.

Итак, если вы слышите фоновый звук из своего приложения, но ваш таймер срабатывает , а не , это должно быть связано с чем-то, что вы делаете. Возможно, вы настроили все так, что таймер становится недействительным, когда вы go в фоновом режиме?

...