Swift读取播放xyz.m4a文件失败,报URL相关错误求助
解决iOS读取本地m4a文件失败的问题
嘿,我来帮你拆解下这个音频播放的问题——你遇到的几个错误其实都指向同一个核心问题:URL格式不合法,缺少必要的scheme。先逐一分析下错误日志:
NSURLConnection finished with error - code -1002:这个错误码对应NSURLErrorUnsupportedURL,意思是你使用的URL没有系统支持的scheme(比如file://、http://这类标识),系统没法识别这是个本地文件路径。CFURLCopyResourcePropertyForKey failed because it was passed an URL which has no scheme:这条日志直接点明了问题——传入的URL完全没有scheme,导致系统无法解析文件位置。- 提示信息
Error: The file “xyz.m4a” couldn’t be opened:本质还是URL格式不对,系统找不到正确的文件位置,自然打不开。
再看你的代码片段:let fileName = "xyz.m4a", audioFile = getDocumentsURL().appendingPathComponent(fileName),问题大概率出在getDocumentsURL()的实现上,或者URL拼接后的处理上。下面给你几个针对性的解决方案:
1. 确保获取文档目录的方法返回合法URL
如果你的getDocumentsURL()是返回字符串路径,那肯定会出问题。正确的做法是让它返回URL类型,系统会自动带上file:// scheme:
func getDocumentsURL() -> URL { let documentDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) return documentDirectories.first! }
用这个方法拼接后的audioFile就是一个合法的本地文件URL,系统能正确识别。
2. 字符串路径转URL时,务必添加正确的scheme
如果因为某些原因你只能拿到字符串格式的文件路径,不要直接用URL(string:)转换,而是用URL(fileURLWithPath:)方法,它会自动处理路径格式并添加file:// scheme:
// 假设你有字符串格式的文件路径 let filePath = "/Users/xxx/Documents/xyz.m4a" let audioFile = URL(fileURLWithPath: filePath)
要是你非要手动加scheme,记得处理路径里的特殊字符(比如空格),但更推荐用上面的fileURLWithPath方法,更安全。
3. 播放前先验证文件是否存在
在执行播放逻辑前,先检查文件是否真的存在于指定路径,避免因为文件缺失导致的报错:
if FileManager.default.fileExists(atPath: audioFile.path) { // 这里写你的音频播放逻辑 } else { print("找不到文件:\(audioFile.path)") }
总的来说,只要确保你使用的是带有file:// scheme的合法本地文件URL,这些错误就能解决啦。
内容的提问来源于stack exchange,提问作者Chanchal Chauhan
相关产品推荐
相关产品推荐

