在 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"
- 转到 Xcode 中的断点导航器。
- 按住 Control 键并单击 'All Exceptions' 行。
- Select 'Edit Breakpoint...' 选项。
- 将例外从全部更改为 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
}
我正在构建一个应用程序,它使用 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"
- 转到 Xcode 中的断点导航器。
- 按住 Control 键并单击 'All Exceptions' 行。
- Select 'Edit Breakpoint...' 选项。
- 将例外从全部更改为 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
}