【问题标题】:Cannot play audio file without app crashing on device running ios 13在运行 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 上面分享的第一行代码之前,它会在可靠崩溃时突出显示该行。

我还应该尝试什么?

【问题讨论】:

  • 请显示崩溃日志。

标签: ios swift avfoundation


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      相关资源
      最近更新 更多