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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:45:46