在运行 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:在某些设备上启动时应用程序崩溃