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
相关产品推荐
相关产品推荐

