web-dev-qa-db-ja.com

iOS13.1でオーディオを再生するとアプリがクラッシュする

メインバンドル内から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が問題であるようですが、理由はわかりません。この同じ動作は、ボタンがバンドルからオーディオファイルをトリガーする他の画面でも発生します。

17
Terry B

これを変える:

var backgroundMusicPlayer = AVAudioPlayer()

これに:

var backgroundMusicPlayer : AVAudioPlayer!
25
もぶわさお

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例外」に変更することです。

  1. XcodeのBreakpointナビゲーターに移動します。
  2. [すべての例外]行をコントロールクリックします。
  3. 「ブレークポイントの編集...」オプションを選択します。
  4. 例外をAllからObjective-Cに変更します。

enter image description here

5
omanosoft

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