SwiftUI按钮控制音频播放/暂停报错:音频文件未找到
解决音频文件找不到的问题
先排查最容易踩的几个坑:
- 文件名必须完全匹配:检查你的音频文件名是不是严格叫
thesound.mp3,iOS的Bundle路径区分大小写,比如TheSound.mp3和thesound.mp3会被当成不同文件。 - 别把音频放进Assets.xcassets:Xcode的Assets.xcassets是用来管理图片、颜色、矢量图的,音频文件要作为普通文件添加到项目中,不能放进xcassets目录里——否则Bundle根本找不到它。
- 确认文件已加入Target:选中音频文件,打开右侧的File Inspector,确保
Target Membership里你的App target是勾选状态。没勾选的话,编译时文件不会被打包进App的Bundle,自然找不到。 - 区分Group和Folder Reference:如果你的音频放在名为
Assets的文件夹里:- 如果是黄色的Group(逻辑分组):Bundle里不会生成
Assets目录,文件直接在根目录,不需要加inDirectory参数。 - 如果是蓝色的Folder Reference(实际目录):才需要用
inDirectory: "Assets"或者subdirectory: "Assets"来指定路径。
- 如果是黄色的Group(逻辑分组):Bundle里不会生成
修正后的代码示例
推荐直接用Bundle.main.url()方法获取URL(比path更可靠),分两种情况:
情况1:音频在项目根目录
init() { if let soundURL = Bundle.main.url(forResource: "thesound", withExtension: "mp3") { do { self.audioPlayer = try AVAudioPlayer(contentsOf: soundURL) // 可选:预加载音频,提升播放响应速度 audioPlayer?.prepareToPlay() } catch { print("AVAudioPlayer初始化失败: \(error.localizedDescription)") } } else { print("音频文件找不到") } }
情况2:音频在蓝色Folder Reference的Assets目录下
init() { if let soundURL = Bundle.main.url(forResource: "thesound", withExtension: "mp3", subdirectory: "Assets") { do { self.audioPlayer = try AVAudioPlayer(contentsOf: soundURL) audioPlayer?.prepareToPlay() } catch { print("AVAudioPlayer初始化失败: \(error.localizedDescription)") } } else { print("音频文件找不到") } }
额外检查步骤
如果还是找不到,可以手动验证Bundle里是否包含音频文件:
- 运行App后,在Xcode的
Window > Devices and Simulators里找到你的App,点击Download Container。 - 把下载的.xcappcontainer文件右键显示包内容,查看里面的文件结构,确认音频文件是否在预期的路径下。
内容的提问来源于stack exchange,提问作者Filip Pokłosiewicz
相关产品推荐
相关产品推荐

