求助:macOS SwiftUI中AudioServicesPlayAlertSound无法播放系统音效
macOS Ventura下SwiftUI播放系统音效问题解决建议
在macOS Ventura 13.2.1中,你调用AudioServicesPlayAlertSound(1108)无法播放音效,而iOS平台的AudioServicesPlaySystemSound(1108)可以正常工作,以下是几个可行的解决方向:
1. 确认系统音效ID的兼容性
iOS和macOS的系统音效ID并不完全通用,1108是iOS专属的完成提示音ID。你可以尝试macOS对应的音效ID,比如:
1007:完成提示音1016:确认提示音1000:弹出提示音
如果不确定ID是否有效,可以通过AudioServicesGetSystemSoundID验证,或者直接查询macOS系统音效的官方文档。
2. 使用macOS原生NSSound API
NSSound是macOS专属的音频播放API,适配性更好,直接通过音效名称调用即可:
import AppKit // 定义播放函数 func playCompletionSound() { // 使用系统自带的Glass音效,可替换为其他音效名称 if let sound = NSSound(named: "Glass") { sound.play() } } // 在Image的onAppear中调用 Image("OK Done") .resizable() .frame(width: 100, height: 100) .offset(x: 40, y: 0) .opacity(OKisVisible ? 1.0 : 0.0) .onAppear { playCompletionSound() }
macOS系统音效存放在/System/Library/Sounds/目录下,音效名称对应文件名去掉.aiff后缀(比如Pop.aiff对应名称Pop)。
3. 改用AVFoundation的AVAudioPlayer
如果需要更灵活的控制,AVAudioPlayer也是可靠的选择,直接加载系统音效文件路径:
import AVFoundation var audioPlayer: AVAudioPlayer? func playSystemSound() { // 替换为你需要的音效路径 guard let soundURL = URL(fileURLWithPath: "/System/Library/Sounds/Hero.aiff") else { return } do { audioPlayer = try AVAudioPlayer(contentsOf: soundURL) audioPlayer?.play() } catch { print("音效播放失败: \(error.localizedDescription)") } } // 在onAppear中调用 .onAppear { playSystemSound() }
4. 检查应用音频权限
确保你的应用在Info.plist中配置了必要的音频权限,添加NSAudioUsageDescription键并填写权限说明(即使播放系统音效,部分场景下也需要这个配置)。
内容的提问来源于stack exchange,提问作者Giuseppe Biondo
相关产品推荐
相关产品推荐

