SwiftUI: как включить воспроизведение звука в фоновом режиме приложения после исчезновения листа?

#swift #xcode #audio #background #swiftui

#swift #xcode #Аудио #фон #swiftui

Вопрос:

Я создаю приложение для потокового аудио. Я уже создал аудиоплеер, получающий данные из firestore в виде отображаемого листа, но когда он исчезает, звук прекращается. Я ищу решение, как включить его прослушивание во время использования приложения, даже если пользователь закрывает лист аудиоплеера.

Вот код предстоящего листа:

 struct PodcastPlayerView : View {

@State var album : Album
@State var song : Song



@State var player = AVPlayer()

@State var isPlaying : Bool = false


var body: some View{
    ZStack{
        Color.white
        VStack{
            Image(song.image)
                .resizable()
                .frame(width: 350, height: 350, alignment: .center)
                .cornerRadius(15)
                .shadow(radius: 20)
                .padding(30)
            
            Text(song.songName)
                .font(.system(size: 25, weight: .semibold))
                .multilineTextAlignment(.center)
            Text(song.artist)
                .font(.system(size: 20, weight: .regular))
                .multilineTextAlignment(.center)
            Spacer()
            AudioPlayerControlsView2(player: player,
                                     timeObserver2: PlayerTimeObserver2(player: player),
                                     durationObserver2: PlayerDurationObserver2(player: player),
                                     itemObserver2: PlayerItemObserver2(player: player))
            Spacer()
            HStack{
                Spacer()
                Button(action: self.previous, label: {
                    Image(systemName: "backward.end.fill")
                        .resizable()
                }).frame(width: 50, height: 50, alignment: .center).foregroundColor(Color(.black))
                Spacer()
                Button(action: self.playPause, label: {
                    Image(systemName: isPlaying ? "pause.circle.fill" : "play.circle.fill")
                        .resizable()
                }).frame(width: 55, height: 55, alignment: .center).foregroundColor(Color(.black))
                Spacer()
                Button(action: self.next, label: {
                    Image(systemName: "forward.end.fill")
                        .resizable()
                }).frame(width: 50, height: 50, alignment: .center).foregroundColor(Color(.black))
                Spacer()
            }
            Spacer()
        }.onAppear(){
            playSong()
        }
    }
}


func playSong(){
    let storage = Storage.storage().reference(forURL: self.song.file)
    storage.downloadURL { (url, error) in
        if error != nil {
            print(error!)
        }else{
            
            do{
                try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback)
                try AVAudioSession.sharedInstance().setActive(true)
            }
            catch{
                // report for an error
            }
        
            player = AVPlayer(playerItem: AVPlayerItem(url: url!))
            player.play()
        }
    }
}