在 iOS13.1 上播放音频时应用崩溃

App crashes when playing audio on iOS13.1

我正在构建一个应用程序,它使用 url 从主包中运行声音文件。当我在 iOS 13 上测试时,一切正常。但是随着 13.1 的新更新,我在代码行

处收到错误

backgroundMusicPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))

也就是说:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x48

这是我在应用程序启动时运行背景音乐的自定义 class 中使用的代码:

import Foundation
import AVFoundation

var backgroundMusicPlayer = AVAudioPlayer()

func playBackgroundMusic(filename: String){
let  sound = Bundle.main.path(forResource: filename, ofType: "m4a")

do{
    try     
AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: AVAudioSession.Mode.default, options: [AVAudioSession.CategoryOptions.mixWithOthers])
    backgroundMusicPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: sound!))

}catch{
    print (error)
}
backgroundMusicPlayer.numberOfLoops = -1
backgroundMusicPlayer.prepareToPlay()
backgroundMusicPlayer.play()
}

在 iOS13 上的模拟器中一切正常,但在设备上崩溃 运行13.1 看来 url 是问题所在,但我不确定为什么.同样的行为也发生在其他屏幕上,其中按钮触发了捆绑包中的音频文件。

改变这个:

var backgroundMusicPlayer = AVAudioPlayer()

为此:

var backgroundMusicPlayer : AVAudioPlayer!

AVAudioPlayer 没有 init,因此应该将其删除。

swift

的解决方案

如果你像这样初始化你的 AVAudioPlayer:

var musicPlayer: AVAudioPlayer = AVAudioPlayer() 

musicPlayer = AVAudioPlayer() 

在任何方法中 然后删除它并声明如下:

var musicPlayer: AVAudioPlayer!

Objective C

的解决方案

如果你像这样初始化

AVAudioPlayer *musicPlayer = [[AVAudioPlayer alloc] init];

删除 [[AVAudioPlayer alloc] init] 的初始化部分,使其看起来像

AVAudioPlayer *musicPlayer = [AVAudioPlayer alloc];

编辑:如果在此之后,您的应用程序在该行暂停,就像您在那里设置断点一样(但您没有),但是应用程序 运行 在您单击 play/run 后没有问题,您不必担心,因为这是一些不会影响应用程序的 c 级问题。 您可以在此阅读更多内容 thread 所以解决方案是编辑所有异常的断点,将异常类型从 "All" 更改为 "Objective-C exceptions"

  1. 转到 Xcode 中的断点导航器。
  2. 按住 Control 键并单击 'All Exceptions' 行。
  3. Select 'Edit Breakpoint...' 选项。
  4. 将例外从全部更改为 Objective-C。

在AppDelegate.swift

中添加以下代码
func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSession.Category.playback)
    }
    catch {
        print("Setting category to AVAudioSessionCategoryPlayback failed.")
    }
    return true
}