メインバンドル内からURLでサウンドファイルを実行するアプリを構築しています。これをiOS 13でテストしたところ、すべて問題ありません。しかし、13.1の新しいアップデートでは、コード行でエラーが発生します
backgroundMusicPlayer = try AVAudioPlayer(contentsOf:URL(fileURLWithPath:sound!))
それは言う:
スレッド1:EXC_BAD_ACCESS(code = 1、address = 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を実行しているデバイスでクラッシュします。URLが問題であるようですが、理由はわかりません。この同じ動作は、ボタンがバンドルからオーディオファイルをトリガーする他の画面でも発生します。
これを変える:
var backgroundMusicPlayer = AVAudioPlayer()
これに:
var backgroundMusicPlayer : AVAudioPlayer!
AVAudioPlayerにはinitがないため、削除する必要があります。
Swiftのソリューション
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 を参照してください。そのための解決策は、すべての例外のブレークポイントを編集し、例外の種類を「すべて」から「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
}