如何让iOS应用在静音模式下停止播放点击音效
解决iOS静音模式下仍播放音效的问题
你的问题核心在于音频会话类别设置:当前使用的.playback类别会强制播放音频,不受系统静音键控制。要让音效遵循静音模式,只需调整音频会话类别,并在播放前判断静音状态即可。
具体修改方案:
- 更换音频会话类别:将
.playback改为.ambient(跟随系统音量与静音设置,同时允许其他音频播放)或.soloAmbient(跟随静音设置,但会中断其他应用音频)。 - 播放前检查静音状态:通过
AVAudioSession的isMuted属性判断设备是否静音,仅在非静音时播放音效。
修改后的完整代码:
import AVFoundation import SwiftUI struct View1 : View { @State var player: AVAudioPlayer? @State var todoItem = TodoItem(count: 0) // 假设TodoItem为已定义的模型 var body: some View { Button(action: { playSound() todoItem.count += 1 }) { Image("CounterButton") .resizable() .scaledToFit() .frame(width: 70, height: 70) .foregroundColor(Color.white) } } private func playSound() { guard let url = Bundle.main.url(forResource: "tick", withExtension: "mp3") else { return } // 先判断设备是否处于静音模式 let audioSession = AVAudioSession.sharedInstance() guard !audioSession.isMuted else { return } do { // 设置遵循静音规则的音频类别 try audioSession.setCategory(.ambient, mode: .default) try audioSession.setActive(true) player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) guard let player = player else { return } player.play() } catch let error { print(error.localizedDescription) } } } // 示例模型定义(根据你的实际代码调整) struct TodoItem { var count: Int }
关键说明:
.ambient类别:音效会随系统音量调节,静音模式下完全静音,且不干扰其他应用的音频播放(比如后台音乐)。.soloAmbient类别:与.ambient规则一致,但会暂停其他应用的音频,适合需要独占音频场景的需求。isMuted属性:直接获取系统当前静音状态,确保静音时不会触发播放逻辑。
内容的提问来源于stack exchange,提问作者Shana
相关产品推荐
相关产品推荐

