SwiftUI | オーディオの再生終了を検知する方法

音声・動画

SwiftUIでオーディオの再生終了を検知する方法を説明する。

Swift 5.7 / Xcode 14.0 / iOS 16.0

結論

AVAudioPlayerDelegateに準拠したclassでaudioPlayerDidFinishPlaying()を記述する。

具体例

再生が終了すると「再生が終了したよ」とprintするAppを作成する。

  1. NSObject, AVAudioPlayerDelegateに準拠したclassを記述する。
  2. NSObject準拠のclassなので、init()にはoverrideを付けsuper.init()も記述する。
  3. delegateの設定をする。
  4. audioPlayerDidFinishPlaying()に再生終了時の処理を記述する。
import SwiftUI
import AVFoundation

struct ContentView: View {
    var audioPlayer = プレイヤー()
    
    var body: some View {
        Button(action: {
           audioPlayer.playSound()
        }) {
            Text("再生")
        }
    }
}

class プレイヤー: NSObject, AVAudioPlayerDelegate {  // 👈 1
    var player: AVAudioPlayer?
    let soundURL = Bundle.main.url(forResource: "3sec", withExtension: "m4a")
    
    override init() {  // 👈 2
        super.init()
        print("初期化したいことがあればここに記述")
    }

    func playSound() {
        do {
            player = try AVAudioPlayer(contentsOf: soundURL!)
            player?.delegate = self  // 👈 3
            player?.play()
        } catch {
            print("エラー")
        }
    }
    
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("再生が終了したよ")  // 👈 4
    }
}

まとめ

SwiftUIでオーディオの再生終了を検知する方法を説明した。

コメント

タイトルとURLをコピーしました