У меня есть приложение, которое люди используют для получения заказов, и оно должно издавать непрерывный звук до тех пор, пока сотрудники не займутся этим. Это работало в течение двух месяцев, а потом просто начало сильно падать. По какой-то причине он отлично работает на iPad, но не на айфонах, работающих под управлением последней операционной системы.
Когда этот фрагмент кода вызывается, он вылетает:
guard let path = Bundle.main.path(forResource: "alert.mp3", ofType: nil) else { return }
let url = URL(fileURLWithPath: path)
do {
self.alertSoundEffect = try AVAudioPlayer(contentsOf: url)
} catch let err {
print("err: \(err)")
}
DispatchQueue.main.async {
self.alertSoundEffect.numberOfLoops = -1
self.alertSoundEffect.prepareToPlay()
self.alertSoundEffect.play()
}
Исправление, которое можно объявить онлайнПеременная alertSoundEffect выглядит следующим образом:
private var alertSoundEffect : AVAudioPlayer!
не работает вообще.
Я пытался переместить все, кроме строки:
self.alertSoundEffect.play()
в viewDidLoad, как я думал, может бытьэтот код не может быть вызван более одного раза, но это не помогло.
В частности, компилятор выделяет эту строку в случае сбоя:
self.alertSoundEffect = try AVAudioPlayer(contentsOf: url)
Я попытался использовать try AVAudioPlayer, гдеон принимает объект данных в качестве параметра или с включением типа аудиофайла для воспроизведения, но это ничего не меняет.
Когда я пытаюсь делегировать AVAudioPlayer и объявляю его так:
self.alertSoundEffect.delegate = self
прямо перед тем, как первые строки кода, которыми я поделился над Xcode, подсвечивают эту строку вместо надежного сбоя.
Что еще мне следует попробовать?