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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:26:21