Вам необходим механизм для общения с player
объектом, чтобы выполнить над ним действия.
Есть много способов сделать это.
Лично я бы создал специальный класс для игрока, который занимается его созданием, загрузкой аудио-ресурса, воспроизведением, приостановкой и т. Д.
Тогда я хотел бы, чтобы этот класс был одноэлементным, чтобы я мог получить к нему доступ из любого места, или внедрить его и передать его другим классам, где он будет использоваться.
Базовый пример:
class MyAudioPlayer {
static let shared = MyAudioPlayer()
private var player: AVAudioPlayer?
func load(_ url: URL) {
player = try? AVAudioPlayer(contentsOf: url)
}
func play(url: URL) {
load(url: url)
player?.play()
}
func pause() {
player?.pause()
}
func stop() {
player?.stop()
}
}
Отправка действий из любого места в приложении:
MyAudioPlayer.shared.play(someURL)
MyAudioPlayer.shared.pause()
Что касается воспроизведения в фоновом режиме, даже если приложение не активно, потребуется (возможно, в AppDelegate
)
try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
with: .duckOthers)
try? AVAudioSession.sharedInstance().setActive(true)
UIApplication.shared.beginReceivingRemoteControlEvents()