Xcode9 Swift4启动播放MP3报错:Unexpectedly found nil while unwrapping an Optional value
解决APP启动播放MP3时的Optional Nil解包崩溃问题
这个Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value崩溃,九成是因为你的代码找不到指定的MP3文件,导致Bundle.main.path(forResource:ofType:)返回了nil,之后如果直接用!强制解包就会触发崩溃。下面给你一步步排查和解决的方案:
1. 确认文件真的被添加到项目并正确打包
- 打开Xcode的项目导航栏,检查
iPhone100Voice.mp3是否真的存在于项目中。如果只是把文件放在电脑本地文件夹但没添加到Xcode,系统肯定找不到它。 - 如果没添加,右键项目根目录选择
Add Files to "你的项目名",选中目标MP3文件,记得勾选Copy items if needed和对应的APP Target,这样文件才会被打包进最终的APP安装包。
2. 检查文件名与代码写法完全匹配
iOS的文件系统是区分大小写的!比如实际文件名是iphone100voice.mp3,但代码里写的是iPhone100Voice,就会匹配失败。一定要保证:
- 文件名的大小写、拼写完全和代码中
forResource的参数一致 - 扩展名
mp3也别写错,比如别写成MP3或者m4a
3. 用安全的Optional处理替代强制解包
别直接用path!这种强制解包的写法,一旦文件找不到就会崩溃。改用可选绑定来安全处理,修改后的代码如下:
import UIKit import AudioToolbox class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() var soundID: SystemSoundID = 0 // 用guard let安全获取路径,找不到就打印提示并返回 guard let soundPath = Bundle.main.path(forResource: "iPhone100Voice", ofType: "mp3") else { print("错误:找不到iPhone100Voice.mp3文件") return } let soundURL = URL(fileURLWithPath: soundPath) AudioServicesCreateSystemSoundID(soundURL as CFURL, &soundID) AudioServicesPlaySystemSound(soundID) } }
4. 确认文件被关联到Target
点击你的MP3文件,在Xcode右侧的File Inspector面板里,找到Target Membership选项,确保你的APP Target是被勾选的。如果没勾选,编译时文件不会被包含进APP包,自然找不到。
额外补充:如果是较长音频,试试AVAudioPlayer
虽然5秒的音频用AudioToolbox没问题,但如果后续遇到播放问题,也可以试试AVFoundation框架的AVAudioPlayer,它的容错性更好:
import UIKit import AVFoundation class ViewController: UIViewController { // 要保留全局引用,否则音频播放会被提前释放 private var audioPlayer: AVAudioPlayer? override func viewDidLoad() { super.viewDidLoad() guard let soundPath = Bundle.main.path(forResource: "iPhone100Voice", ofType: "mp3") else { print("找不到目标音频文件") return } let soundURL = URL(fileURLWithPath: soundPath) do { audioPlayer = try AVAudioPlayer(contentsOf: soundURL) audioPlayer?.play() } catch { print("音频初始化失败:\(error.localizedDescription)") } } }
内容的提问来源于stack exchange,提问作者Mitchell
相关产品推荐
相关产品推荐

