mute/silent 模式打开时声音仍然播放

Sounds still play when mute/silent mode is ON

我正在使用 AudioServicesPlaySystemSoundWithCompletion 播放系统声音,并使用 AVAudioPlayer 播放自定义声音。

为什么打开静音开关会播放声音?我已经尝试了 "AVAudioSession".

的所有类别

我尝试了以下代码:

 try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategorySoloAmbient)
 try AVAudioSession.sharedInstance().setActive(true)

也试过这个:

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.mixWithOthers)
try AVAudioSession.sharedInstance().setActive(true)

我尝试了这个 link 中定义的所有类别,但是当 phone 静音(静音开关打开)时,声音总是在播放。 https://developer.apple.com/reference/avfoundation/avaudiosession/audio_session_categories

我正在播放这样的声音:

系统声音:

AudioServicesPlaySystemSoundWithCompletion(1304, nil)

自定义声音:

        let url = Bundle.main.url(forResource: "sound01", withExtension: ".wav")
        do {
            if audioPlayer != nil {
                audioPlayer!.stop()
                audioPlayer = nil
            }
            if let soundURL = soundURL {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: AVAudioSessionCategoryOptions.mixWithOthers)
                try AVAudioSession.sharedInstance().setActive(true)
                audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
            }
            guard let audioPlayer = audioPlayer else {
                return
            }
            audioPlayer.prepareToPlay()
            audioPlayer.play()
        } catch let error {
            print(error.localizedDescription)
        }

我是不是做错了什么?

修复是使用 AudioServicesPlayAlertSound 函数而不是 AudioServicesPlaySystemSoundWithCompletion 函数。

我们也不能使用AVAudioPlayer。我们需要通过为每个自定义声音创建声音 ID 来使用 AudioServicesPlayAlertSound 函数。

let soundURL = Bundle.main.url(forResource: "test01", withExtension: ".wav")

if let soundURL = soundURL {
      var soundID : SystemSoundID = 0
      AudioServicesCreateSystemSoundID(soundURL as CFURL, &soundID)
      AudioServicesPlayAlertSound(soundID)
}