You need to enable JavaScript to run this app. 使用SwiftUI与AVFoundation实现音频上传至Firebase Storage的问题
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 06:15:10