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

时间:2019-09-25 19:38:19

标签: swift avfoundation ios13

我正在构建一个应用程序,该应用程序使用URL从主捆绑包中运行声音文件。当我在iOS 13上进行测试时,一切都很好。但是,随着新的13.1更新,我在代码行出现错误

  

backgroundMusicPlayer =尝试AVAudioPlayer(contentsOf:URL(fileURLWithPath:sound!))

说:

  

线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x48

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

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的设备上崩溃似乎是问题所在,但我不确定为什么。在其他屏幕上,按钮正在触发捆绑软件中的音频文件时,也会发生相同的行为。

3 个答案:

答案 0 :(得分:24)

更改此:

var backgroundMusicPlayer = AVAudioPlayer()

对此:

var backgroundMusicPlayer : AVAudioPlayer!

答案 1 :(得分:4)

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

快速解决方案

如果您像这样初始化AVAudioPlayer:

var musicPlayer: AVAudioPlayer = AVAudioPlayer() 

musicPlayer = AVAudioPlayer() 

以任何方法然后将其删除并声明如下:

var musicPlayer: AVAudioPlayer!

目标C的解决方案

如果您喜欢...

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

删除[[AVAudioPlayer alloc] init]的init部分,看起来像

AVAudioPlayer *musicPlayer = [AVAudioPlayer alloc];

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

  1. 转到Xcode中的Breakpoint导航器。
  2. 按住Control键并单击“所有例外”行。
  3. 选择“编辑断点...”选项。
  4. 将异常从“全部”更改为“ Objective-C”。

enter image description here

答案 2 :(得分:0)

在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
}