我的 iOS SwiftUI 项目无法使用 AVAudioPlayer 播放声音

Pio*_*979 1 xcode avaudioplayer ios swiftui

我有一个愚蠢的问题,但由于某种原因我无法解决它。我尝试使用 AVAudioPlayer 播放声音,但听不到任何声音。没有错误,但我的应用程序仍然保持沉默。它是用 SwiftUI 构建的。这是一段代码:

struct SoundsListView: View {
    
   var body: some View {
        List(Helpers.shared.sounds, id:\.self) { item in
            Text(item)
            Spacer()
            Button(action: {
                var soundPlayer: AVAudioPlayer?
                guard let audioFile: URL = Bundle.main.url(forResource: "Analog watch", withExtension: "mp3") else { return }
                do {
                    soundPlayer = try AVAudioPlayer(contentsOf: audioFile)
                    print(soundPlayer)
                    guard let player = soundPlayer else { return }
                   player.play()
                } catch let error {
                    print("Cannot play sound")
                }
            }) {
                Image(systemName: "play")
            } //: BUTTON
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

没有错误,声音文件也设置了目标成员资格。(奇怪的是,同一段代码适用于我的旧项目,但是是用 Swift + Storyboards 编写的)

模拟器和硬件设备都没有发出声音。静音模式已关闭,音量设置为最大。我不知道这里出了什么问题。

顺便说一句:这个应用程序向用户发送通知并且声音正常。但不是在这段代码中

Ada*_*dam 5

AVAudioPlayer仅存在于按钮操作的范围内,因此它\xe2\x80\x99s 在声音可以播放之前被释放。您需要将其保存在某处\xe2\x80\xa6 我认为您可以将其声明为SoundsListViewa @State var,但最好将其完全从 SwiftUI 视图中重构出来。

\n

编辑:您可能还需要设置 AVAudioSession,它可以让您更改播放类别并控制音频与其他音频(例如音乐播放)的交互方式。

\n

例子:

\n
do {\n    try AVAudioSession.sharedInstance().setCategory(.playback)\n    try AVAudioSession.sharedInstance().setCategory(.playback, options: [.mixWithOthers])\n    try AVAudioSession.sharedInstance().setActive(true)\n} catch {\n    print(error)\n}\n
Run Code Online (Sandbox Code Playgroud)\n