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

iOS 15下Swift游戏静音模式播放系统音效的现代实现方法

解决方案

要在iOS 15+的游戏中实现静音模式下仍能播放系统音效,核心是正确配置音频会话,并调整音效播放方式,具体步骤如下:

1. 现代方式配置AVAudioSession

无论你使用SwiftUI还是UIKit,都可以在应用启动初期配置音频会话,无需依赖AppDelegate:

SwiftUI 项目(@main 结构体)

import SwiftUI
import AVFoundation

@main
struct YourGameApp: App {
    init() {
        configureAudioSession()
    }
    
    var body: some Scene {
        WindowGroup {
            GameRootView()
        }
    }
    
    private func configureAudioSession() {
        do {
            // 设置音频会话类别为playback,该类别会忽略静音开关
            try AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers)
            try AVAudioSession.sharedInstance().setActive(true)
        } catch {
            #if DEBUG
            print("音频会话配置错误: \(error.localizedDescription)")
            #endif
        }
    }
}

UIKit 项目(SceneDelegate)

如果你的项目仍使用SceneDelegate,在场景初始化时配置:

import UIKit
import AVFoundation

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
        configureAudioSession()
    }
    
    private func configureAudioSession() {
        do {
            try AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers)
            try AVAudioSession.sharedInstance().setActive(true)
        } catch {
            #if DEBUG
            print("音频会话配置错误: \(error.localizedDescription)")
            #endif
        }
    }
}

2. 替换音效播放方式

AudioServicesPlaySystemSound 和 AudioServicesPlayAlarmSound 本身受系统静音开关逻辑约束,即使配置了音频会话也无法完全绕过。改用 AVAudioPlayer 加载系统音效文件播放,就能遵循我们配置的音频会话规则:

import AVFoundation

func playUnmutedSystemSound(_ soundID: SystemSoundID) {
    // 获取系统音效的本地URL
    guard let soundURL = AudioServicesGetSystemSoundIDURL(soundID) else {
        print("无法获取系统音效URL")
        return
    }
    
    do {
        let audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
        audioPlayer.play()
    } catch {
        print("音效播放失败: \(error.localizedDescription)")
    }
}

// 调用示例
playUnmutedSystemSound(1000)

关键说明

  • .playback 类别是核心:该音频会话类别专门用于媒体播放,会忽略设备的静音(Ringer)开关,优先遵循应用的音频设置。
  • AVAudioPlayer 替代系统API:系统提供的 AudioServices 系列API针对系统级提示音设计,本身会遵守静音逻辑,改用 AVAudioPlayer 可以让音效完全遵循我们配置的音频会话规则。

内容的提问来源于stack exchange,提问作者Justin Hammond

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:15:45