You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:45:27