Swift 5 后台上传无法接收HTTP响应头 静默失败问题咨询
核心问题原因
你当前的实现存在两个关键认知偏差,导致无法捕获上传失败状态:
urlSession(_:task:didCompleteWithError:)返回的error仅代表客户端侧错误(断网、超时、任务被系统取消等),只要请求能收到服务端返回的HTTP响应——哪怕是401鉴权失败、404地址错误、500服务端错误这类业务失败状态,error都会是nil。你之前没有主动读取任务携带的响应信息,自然会把服务端拒绝的请求误判为成功。- 后台URLSession的
didSendBodyData回调统计的是待上传文件从App沙盒拷贝到系统网络守护进程缓存的本地进度,不是数据发送到服务端的实际进度。你看到配置错误时进度依然走满,本质是系统刚把文件存到本地暂存区,还没完成和服务端的建连、鉴权流程,根本没开始真实的网络上传。
另外你之前尝试的URLSessionDataDelegate回调并非不生效,只是你没有正确配置响应处置策略,且误以为该协议只对DataTask生效——实际上后台UploadTask同样会触发DataDelegate的响应、数据接收回调。
修复方案
1. 正确校验上传结果
在didCompleteWithError回调中,先过滤客户端错误,再主动读取任务的HTTP响应,校验状态码即可拿到完整响应头,判断真实上传结果:
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { // 先处理客户端侧网络错误 if let clientError = error { print("上传失败,客户端错误:\(clientError.localizedDescription)") // 执行失败回调逻辑 return } // 强转响应为HTTPURLResponse类型,读取响应头和状态码 guard let httpResp = task.response as? HTTPURLResponse else { print("上传失败,收到非HTTP类型响应") // 执行失败回调逻辑 return } // 这里就能拿到所有服务端返回的响应头 let allHeaders = httpResp.allHeaderFields print("服务端响应头:\(allHeaders)") // 只有2xx区间的状态码代表请求成功 guard (200...299).contains(httpResp.statusCode) else { print("上传失败,服务端返回错误状态码:\(httpResp.statusCode)") // 执行失败回调逻辑,这里可以结合响应体拿到具体的GCS错误信息 return } // 走到这里才是真实上传成功 print("上传成功") }
2. 接收服务端返回的错误响应体
如果需要读取GCS返回的具体错误详情(比如鉴权失败原因、签名错误提示等),补充实现两个URLSessionDataDelegate方法即可,注意后台UploadTask会正常触发这两个回调:
// 收到服务端响应头时调用,需要给系统返回处置策略 func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) { // 允许系统接收服务端返回的响应数据 completionHandler(.allow) } // 收到服务端返回的响应体片段时会多次调用,自行拼接完整数据即可 func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { // 可以通过关联对象给task绑定一个可变Data属性,逐段拼接响应体 // 示例:task.responseBuffer.append(data) }
额外注意点
- 不要把
didSendBodyData返回的进度等同于实际上传到服务端的进度,真实上传成功的判断只能以didCompleteWithError中通过HTTP状态码校验的结果为准。 - 如果你使用的是GCS可恢复上传接口,错误配置下服务端会在请求初期就返回4xx错误,系统会在收到错误响应后自动终止上传,不会产生多余流量。
内容的提问来源于stack exchange,提问作者trevash
相关产品推荐
相关产品推荐

