Я использую AVAudioPlayer
для воспроизведения зацикленного звука. Мой текущий код имеет следующую строку: audioPlayer.numberOfLoops = -1
, что приводит к неопределенному l oop. Я использую таймер, чтобы остановить зацикливание звука через определенный промежуток времени. Это работает, когда приложение находится на переднем плане, но не после того, как оно переходит на задний план.
Фоновые возможности моего приложения:
Несмотря на то, что включен фоновый режим и воспроизводится звук во время перехода приложения в на фоне приложение выглядит как , оно приостановлено сразу после вызова 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()
}
}