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

Swift中使用session.uploadTask后台上传失败时如何排查错误?

URLSession后台上传失败判断解决方案

报错原因

你遇到的崩溃是苹果系统对后台URLSession的硬性限制:使用URLSessionConfiguration.background创建的会话不支持任务的闭包回调,所有状态通知都必须通过代理方法获取。

具体实现步骤

  • 第一步:让你的上传逻辑所属类遵守URLSessionTaskDelegate、URLSessionDataDelegate协议
  • 第二步:实现核心的任务完成代理方法,在该方法中判断上传结果:
// 无论上传成功/失败,任务结束时都会触发该代理方法
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
    // 1. 判断系统级错误:网络断开、超时、本地资源读取失败等场景会返回error
    if let error = error {
        print("上传失败,错误信息:\(error.localizedDescription)")
        // 此处添加失败处理逻辑:重试、提示用户、记录日志等
        return
    }
    
    // 2. 判断HTTP业务级错误:比如预签名URL过期、服务器拒绝、参数错误等场景error为空,但状态码非2xx
    guard let httpResponse = task.response as? HTTPURLResponse, 
          (200...299).contains(httpResponse.statusCode) else {
        let statusCode = (task.response as? HTTPURLResponse)?.statusCode ?? -1
        print("上传失败,HTTP状态码:\(statusCode)")
        // 此处处理业务失败逻辑
        return
    }
    
    // 走到此处代表上传成功
    print("上传成功")
}

现有代码优化建议

  • 不要将整个视频文件读入内存再赋值给request.httpBody,大文件场景会占用过高内存,容易被系统终止后台进程。建议改用uploadTask(with:fromFile:)方法直接传入本地视频文件URL,系统会自动处理文件分块读取,后台上传稳定性更高。
  • 不要每次上传都新建一个后台URLSession,建议全局复用同一个后台会话实例,避免多任务上传时出现资源冲突。
  • 后台会话的identifier建议使用固定前缀+唯一标识的格式,方便应用被系统重启后重新关联对应的上传任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:15:09