在运行 ios 13 的设备上没有应用程序崩溃的情况下无法播放音频文件

Posted

技术标签:

【中文标题】在运行 ios 13 的设备上没有应用程序崩溃的情况下无法播放音频文件【英文标题】:Cannot play audio file without app crashing on device running ios 13 【发布时间】:2019-10-04 10:07:52 【问题描述】:

我有一个应用程序被人们用来接收订单,它需要发出持续的声音,直到工作人员注意到它。它工作了两个月,然后就开始崩溃了。无论出于何种原因,它在 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()

查看DidLoad,因为我认为可能无法多次调用该代码,但它没有帮助。

具体来说,编译器在崩溃时会高亮显示这一行:

self.alertSoundEffect = try AVAudioPlayer(contentsOf: url)

我尝试使用 try AVAudioPlayer,它以 Data 对象作为参数或包含要播放的音频文件的类型,但这并没有改变任何东西。

当我尝试 AVAudioPlayer 的委托并像这样声明它时:

self.alertSoundEffect.delegate = self

就在我在 Xcode 上面分享的第一行代码之前,它会在可靠崩溃时突出显示该行。

我还应该尝试什么?

【问题讨论】:

请显示崩溃日志。 【参考方案1】:

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

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

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

ios 13 开始,这导致我的应用出现错误,因为我有 3-10 秒长的通知声音。

【讨论】:

【参考方案2】:

如果您以任何方法初始化您的 AVAudioPlayer,例如 var wrongMusicPlayer: AVAudioPlayer = AVAudioPlayer() 或 wrongMusicPlayer = AVAudioPlayer(),请删除它并像 var wrongMusicPlayer: AVAudioPlayer! 一样声明。

iOS 13.1 Crash in AVAudio Player

【讨论】:

以上是关于在运行 ios 13 的设备上没有应用程序崩溃的情况下无法播放音频文件的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:在 iOS 14 上点击返回时导航链接崩溃,但在 iOS 13 上没有

iOS 13 UserDefaults:在某些设备上启动时应用程序崩溃

应用程序在设备上崩溃,但 XCode 没有注册崩溃

使用 Xcode 13.2 在设备中进行测试时,应用程序在 iPhone 6、iOS 12.5 上崩溃

在 iOS 8 设备上查找崩溃日志

发布版本 Xcode8 在 iOS 9 设备上崩溃