SwiftUI使用AVPlayer播放本地视频报错nil解包异常如何解决
问题产生原因
崩溃的核心触发点是代码里的强制解包操作!:
你在初始化AVPlayer时,用Bundle.main.path(forResource: "tutorial", ofType: "mp4")!获取本地视频路径,当app的主Bundle中找不到匹配的视频文件时,该方法会返回nil,对nil做强制解包就会直接触发Unexpectedly found nil while unwrapping an Optional value的运行时崩溃。
常见的Bundle找不到视频文件的场景包括:
- 拖拽视频文件到项目时,没有勾选对应App Target的Target Membership,文件没有被打包进App安装包
- 代码里写的文件名、后缀和实际文件不匹配,iOS文件系统大小写敏感,比如实际文件是
Tutorial.mp4、tutorial.MP4都会匹配失败 - 视频文件没有被加入到项目Build Phases的Copy Bundle Resources列表中,打包环节不会把文件复制到App包里
- 你使用的
path(forResource:)API已经过时,通过路径再拼接FileURL的方式本身也容易出现路径格式错误
修复方案
先排查资源配置问题:
- 点击项目中的
tutorial.mp4文件,打开右侧File Inspector面板,确认Target Membership下你当前运行的App Target已经被勾选 - 打开项目配置 -> 对应Target -> Build Phases -> Copy Bundle Resources,确认列表中存在
tutorial.mp4,文件名、后缀大小写完全和代码中一致 - 清理Xcode构建缓存(快捷键
Cmd+Shift+K)后重新编译,排除旧缓存的干扰
- 点击项目中的
替换强制解包的写法,用安全的可选值处理逻辑,同时使用更可靠的Bundle资源获取API,避免崩溃:
import AVKit import SwiftUI struct HelpView: View { private let player: AVPlayer init() { // 直接获取资源URL,不需要先取path再拼接,避免路径转换错误 guard let videoURL = Bundle.main.url(forResource: "tutorial", withExtension: "mp4") else { debugPrint("未在App包中找到tutorial.mp4,请检查资源导入配置") // 资源不存在时初始化空播放器,不会触发崩溃 self.player = AVPlayer() return } self.player = AVPlayer(url: videoURL) } var body: some View { VideoPlayer(player: player) .onAppear { player.play() } } }
注意:任何时候都尽量避免对不确定是否为nil的返回值用
!强制解包,尤其是Bundle资源获取、网络数据解析这类容易受配置、外部数据影响的场景,安全解包可以把崩溃问题转化为可排查的日志提示。
内容的提问来源于stack exchange,提问作者Ricky Chhetri
相关产品推荐
相关产品推荐

