Swift Xcode中从Firebase Storage获取URL赋值给AVAudioPlayer总报错
AVAudioPlayer加载Firebase远程URL失败解决方案
核心错误原因
AVAudioPlayer(contentsOf:)初始化方法仅支持传入本地文件URL,你从Firebase Storage获取的downloadURL是远程HTTPS链接,直接传入会直接触发初始化失败进入catch块。
修复方案
方案1:先下载音频到本地沙盒再初始化AVAudioPlayer
适合需要本地缓存、小体积音频的场景,代码示例如下:
func loadAudio(post: CompPost, completion: @escaping (AVAudioPlayer?) -> ()) { let audioRef = Storage.storage().reference().child("cPosts").child(post.uid).child("Audio").child(post.mp3) // 生成本地临时存储路径 let localDir = FileManager.default.temporaryDirectory let localURL = localDir.appendingPathComponent(post.mp3) // 先把文件下载到本地 audioRef.write(toFile: localURL) { url, error in guard let localURL = url, error == nil else { print(error?.localizedDescription ?? "下载失败") completion(nil) return } do { // 用本地URL初始化AVAudioPlayer let audioPlayer = try AVAudioPlayer(contentsOf: localURL) audioPlayer.prepareToPlay() self.audioPlayer = audioPlayer completion(audioPlayer) print("音频加载完成") } catch { print("初始化播放器失败:\(error.localizedDescription)") completion(nil) } } }
方案2:替换为AVPlayer实现远程音频边下边播
如果不需要本地缓存、音频体积较大,直接用支持远程URL的AVPlayer即可:
import AVKit // 播放器声明改成AVPlayer var audioPlayer: AVPlayer? func loadRemoteAudio(post: CompPost) { let audioRef = Storage.storage().reference().child("cPosts").child(post.uid).child("Audio").child(post.mp3) audioRef.downloadURL { [weak self] url, error in guard let audioURL = url, error == nil else { print(error?.localizedDescription ?? "获取链接失败") return } let playerItem = AVPlayerItem(url: audioURL) self?.audioPlayer = AVPlayer(playerItem: playerItem) // 调用play方法即可播放 // self?.audioPlayer?.play() } }
额外排查提示
- catch块中直接打印
error.localizedDescription可以获取更精准的错误信息,方便定位特殊场景问题 - 确认Firebase Storage规则已放开对应路径的读权限,避免下载到无效的403错误资源
- 确认上传到Firebase的音频文件本身编码格式正常,可通过下载到本地直接播放校验
内容的提问来源于stack exchange,提问作者EAO123
相关产品推荐
相关产品推荐

