如何解决AVAudioPlayer 不会在关闭屏幕上停止播放
我正在尝试使用 SwiftUI
创建一个类似于 Apple Music 的音乐播放器应用程序。
这是我在屏幕底部设置小矩形迷你播放器的代码:
struct MiniPlayer: View {
let mediaItem : MPMediaItem
@State private var audioPlayer : AudioPlayer = AudioPlayer()
@State private var errorString : String?
@State private var showAlert : Bool = false
@State private var isPlaying : Bool = true
var body: some View {
ZStack {
VStack(alignment: .leading,spacing: 3){
HStack(spacing: 10){
SongsListingRow(mediaItem: mediaItem)
Spacer()
Button(action: {
isPlaying.toggle()
isPlaying ? audioPlayer.play() : audioPlayer.pause()
},label: {
Image(systemName: isPlaying ? "pause.fill" : "play.fill")
.foregroundColor(Color.black)
})
}
.padding(.horizontal,10)
ProgressView(value: 0.5)
}
.alert(isPresented: $showAlert,content: {
Alert(title: Text("Alert"),message: Text(errorString ?? "Something went wrong"),dismissButton: .default(Text("Okay")))
})
}
.onAppear{
reconfigurePlayer(mediaItem)
}
.onChange(of: mediaItem) { value in
reconfigurePlayer(value)
}
.onDisappear{
// audioPlayer.clean()
}
}
private func reconfigurePlayer(_ mediaItem : MPMediaItem){
if let url = mediaItem.assetURL{
errorString = self.audioPlayer.configure(url: url)
showAlert = errorString != nil
}else{
showAlert = true
}
}
}
还有 AudioPlayer
类:
class AudioPlayer{
private var audioPlayer : AVAudioPlayer?
func configure(url : URL) -> String?{
do{
try AVAudioSession.sharedInstance().setCategory(.playback)
self.audioPlayer = try AVAudioPlayer(contentsOf: url)
audioPlayer?.prepareToPlay()
audioPlayer?.volume = 0.3
self.play()
return nil
}catch{
return error.localizedDescription
}
}
...
}
以及显示 MiniPlayer
的列表:
struct SongsListing: View {
...
var body: some View {
VStack(spacing: 0) {
List{
TextField("Type your search",text: $searchText)
.textFieldStyle(RoundedBorderTextFieldStyle())
ForEach(songs,id: \.persistentID){ mediaItem in
Button(action: {
self.selectedItem = mediaItem
},label: {
SongsListingRow(mediaItem: mediaItem)
})
}
}
.navigationTitle("Songs")
if selectedItem != nil{
ZStack{
Color.white
.shadow(radius: 2.0)
MiniPlayer(mediaItem: selectedItem!)
}
.frame(height: 60.0)
}
}
}
}
所以流程是屏幕 A > SongsListing
。点按行项目会在屏幕底部显示 MiniPlayer
。
我的问题是:
当我从 SongsListing 返回到屏幕 A 时,AVAudioPlayer
不会自行停止播放。不应该从视图控制器中弹出来取消实例化 AudioPlayer
类并扩展 AVAudioPlayer
吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。