无法在运行iOS 13的设备上使应用崩溃的情况下播放音频文件

时间:2019-10-04 10:07:52

标签: ios swift avfoundation

我有一个应用程序供人们使用,它需要发出连续的声音,直到员工参加为止。它工作了两个月,然后才开始崩溃很多。无论出于何种原因,它都可以在iPad上正常运行,但不能在运行最新操作系统的iPhone上运行。

这部分代码被调用时会崩溃:

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上方共享的第一行代码之前,

在可靠崩溃时会突出显示该行。

我还应该尝试什么?

2 个答案:

答案 0 :(得分:0)

我想您的path是错误的。 试试这个:

guard let path = Bundle.main.path(forResource: "alert", ofType: "mp3") else { return }

此外,如果您的音频文件很短(例如少于30秒),请尽量不要呼叫self.alertSoundEffect.prepareToPlay()。只需立即致电self.alertSoundEffect.play()

自iOS 13以来,这导致我的应用程序出现错误,因为我的通知声音持续3-10秒。

答案 1 :(得分:0)

如果以任何方法初始化AVAudioPlayer像varrongMusicPlayer:AVAudioPlayer = AVAudioPlayer()或rongMusicPlayer = AVAudioPlayer(),然后将其删除,然后像varrongMusicPlayer:AVAudioPlayer一样声明。

iOS 13.1 Crash in AVAudio Player