我正在构建一个应用程序,该应用程序使用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的设备上崩溃似乎是问题所在,但我不确定为什么。在其他屏幕上,按钮正在触发捆绑软件中的音频文件时,也会发生相同的行为。
答案 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”
答案 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
}