You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中用FileManager处理录音URL 修复Firebase Storage二次上传错误

问题修复方案

你遇到的Firebase上传错误本质是新旧录音文件资源冲突:TabBar的子页面常驻内存,切走后未重置录音相关状态,导致第二次录制时写入的本地文件有残留,Firebase预先读取的旧文件大小和实际上传的新文件大小不匹配,最终抛出对应错误。按以下步骤修复即可:


1 修复setupRecorder的路径判断bug

你当前判断本地文件是否存在时错误使用了absoluteString(带file://协议前缀),导致判断逻辑永远不生效,旧录音文件无法被正确清理或覆盖,将对应判断修改为使用path属性:

// 原错误写法
// if FileManager.default.fileExists(atPath: soundFileURL.absoluteString) {
// 修正后写法
if FileManager.default.fileExists(atPath: soundFileURL.path) {
    try? FileManager.default.removeItem(at: soundFileURL)
}

2 新增全局状态重置方法

添加统一的重置方法,每次录制前、上传完成后调用,彻底清理旧资源和状态:

func resetRecordingState() {
    // 销毁旧录音实例
    recorder?.stop()
    recorder = nil
    // 删除本地旧录音文件
    if let oldURL = soundFileURL {
        try? FileManager.default.removeItem(at: oldURL)
    }
    // 清空所有状态变量
    soundFileURL = nil
    filename = nil
    titleRecordTextView.text = ""
    sourceRecordTextView.text = ""
    // 重置UI状态
    recordingTimeLabel.text = "00:00"
    activityIndicator.stopAnimating()
    navigationItem.rightBarButtonItem?.isEnabled = true
    recordButton.isEnabled = true
}

3 补充重置调用时机

调用时机1:启动新录音前

在调用setupRecorder启动新录音前,先调用resetRecordingState()清理旧资源,避免实例冲突。

调用时机2:上传完成跳转前

在上传成功回调里的self.tabBarController?.selectedIndex = 0之前,调用resetRecordingState(),确保切走页面前所有旧状态被清空。

可选调用时机:页面显示时

因为TabBar的子页面不会被销毁,可在viewWillAppear生命周期方法里调用resetRecordingState(),每次进入录音页面都自动清理残留状态。


内容的提问来源于stack exchange,提问作者Stanislav Putilov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:36:02