Swift как поймать окончание звукового файла?

есть кнопка для проигрывания звукового файла. По умолчанию кнопка с картинкой условно говоря "Play". После нажатия эта картинка меняется на знак проигрывания файла или как это обычно делается на "Пауза" (две вертикальные полоски). Т.е. пользователь видит, что в данный момент звуковой файл проигрывается и может остановить это воспроизведение. Тогда картинка "Play" возвращается на кнопку.

Но как поймать окончание звукового файла, чтобы автоматически вернуть на кнопку знак "Play"? Т.е. без участия пользователя. Другими словами, как поймать событие окончания звукового файла, чтобы к нему привязать смену картинки?


Ответы (2 шт):

Автор решения: VAndrJ

Если используете просто AVPlayer:

    NotificationCenter.default.addObserver(self, selector: #selector(playerDidPlayToEndTime), name: .AVPlayerItemDidPlayToEndTime, object: nil)
...
@objc private func playerDidPlayToEndTime() {
    // Делаете здесь все что нужно после окончания проигрывания
}
→ Ссылка
Автор решения: maxMas

Спасибо огромное!

А можно еще вас попросить помочь встроить код во ViewController, пока не работал плотно с Notifications. Попробовал сделать так как ниже, но нужно наверное что-то еще сделать.

import UIKit
import AVFoundation

class ViewController: UIViewController {
    
    var audioPlayer = AVAudioPlayer()

    @IBOutlet weak var playButtonOutlet: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func playButton(_ sender: UIButton) {
        let path = Bundle.main.path(forResource: "The Beatles-Something", ofType: "mp3")!
        let url = URL(fileURLWithPath: path)
        
        do {
             audioPlayer = try AVAudioPlayer(contentsOf: url)
             audioPlayer.play()
        } catch {
           // couldn't load file :(
        }
    }
    
    @IBAction func stopButton(_ sender: UIButton) {
        audioPlayer.stop()
    }
    
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(playerDidPlayToEndTime),
        name: .AVPlayerItemDidPlayToEndTime,
        object: nil
    )
    ...
    @objc private func playerDidPlayToEndTime() {
        // Делаете здесь все что нужно после окончания проигрывания
    }
}

Здесь пока без смены картинки, просто чтобы сделать функционал вначале.

→ Ссылка