使用SwiftUI与AVFoundation实现音频上传至Firebase Storage的问题
iOS音频录制后上传Firebase Storage实现方案
现有代码问题修正点
- 补充录音权限申请逻辑,避免首次启动录音失败
- 停止录制后先解除AVAudioSession活跃状态,确保本地音频文件写入完成
- 替换写死的存储路径,使用和本地文件名一致的命名避免覆盖
- 删除强制解包逻辑,增加异常判断防止崩溃
核心代码修改
1. 权限申请补充
在startRecording最开始增加权限校验:
// 先判断录音权限 AVAudioSession.sharedInstance().requestRecordPermission { [weak self] allowed in guard allowed else { print("用户拒绝了录音权限") return } // 原有startRecording的逻辑放在权限允许的回调里 }
2. stopRecording方法修改
func stopRecording() { audioRecorder.stop() recording = false // 解除录音会话活跃状态,确保文件写入完成 do { try AVAudioSession.sharedInstance().setActive(false) } catch { print("关闭录音会话失败: \(error.localizedDescription)") return } // 安全校验本地文件路径 guard let localFile = fileURL, FileManager.default.fileExists(atPath: localFile.path) else { print("本地音频文件不存在") return } let storageRef = Storage.storage().reference() // 用本地文件名作为存储文件名,避免覆盖,也可以自定义路径比如/audio/xxx.m4a let fileName = localFile.lastPathComponent let fileRef = storageRef.child("audio/\(fileName)") // 上传文件 let uploadTask = fileRef.putFile(from: localFile, metadata: nil) { metadata, error in if let error = error { print("上传失败: \(error.localizedDescription)") return } // 上传成功获取下载链接 fileRef.downloadURL { url, error in guard let downloadUrl = url else { print("获取下载链接失败: \(error?.localizedDescription ?? "未知错误")") return } // 这里可以把downloadUrl存储到本地或者Firebase数据库,后续播放直接用 print("上传成功,下载链接: \(downloadUrl)") } } // 可选:监听上传进度 uploadTask.observe(.progress) { snapshot in let progress = Double(snapshot.progress!.completedUnitCount) / Double(snapshot.progress!.totalUnitCount) print("上传进度: \(progress * 100)%") } fetchRecordings() }
后续播放实现
拿到音频的下载链接后,直接用AVPlayer加载即可播放:
let player = AVPlayer(url: downloadUrl) player.play()
内容的提问来源于stack exchange,提问作者cemgem
相关产品推荐
相关产品推荐

