ios - NSURLSessionUploadTask 创建后立即取消

标签 ios afnetworking

<分区>

我使用 AFNetworking库将打包文件发送到服务器。每个数据包均使用单独的 NSURLSessionUploadTask 发送使用 AFURLSessionManager#uploadTaskWithRequest:fromData:progress:completionHandler 创建.数据包的数量从 1 到数百不等。数据包按顺序发送,只有前一个数据包成功后,下一个数据包才会发送。

它在大多数情况下工作得很好,但最近用户(大约 1%)开始报告发送数据包有时会卡住。以下是我在他们的日志中发现的内容:

Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLStringKey=https://url.to.service/service?params=XYZ, NSErrorFailingURLKey=***, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalUploadTask <72F2E4D0-4505-4D9D-85A5-08E0DF152EE9>.<354>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask <72F2E4D0-4505-4D9D-85A5-08E0DF152EE9>.<354>, NSLocalizedDescription=cancelled}

应用程序重试多次,但重新创建新的 NSURLSessionUploadTask并再次尝试,但总是失败并出现完全相同的错误。

代码如下(为了便于阅读,我对其进行了简化):

@implementation PacketDataManagementService : AFHTTPSessionManager

- (void)uploadPacketData:(NSData *)packetData
{
    NSURLRequest *request = [self createRequest];

    __block NSURLSessionDataTask *task = [self uploadTaskWithRequest:request fromData:packetData progress:nil completionHandler:^(NSURLResponse *__unused response, id responseObject, NSError *error) {
      if ( error )
      {
          //log error
      }
      else
      {
          //notification to invoke `uploadPacketData` for the next packet
      }
    }];

    //adding this line was the only way to "reproduce" the issue my users have - exactly the same error is being logged
    //[task cancel];

    [task resume];
}

@end

我尝试重现它但没有成功 - 这是我迄今为止尝试过的:

  • 用户在不同的设备和 iOS 版本上报告了该问题 - 我在这里没有找到任何共同点
  • AFHTTPSessionManager ( PacketDataManagementService 扩展了它)在请求之间保留并存储在用于发出所有这些请求的单例中。
  • 请求未到达服务器 - 我检查了我们服务器的访问日志,发现已取消请求中的请求丢失。
  • 我创建了内存泄漏来查看应用在接近 OOM 场景时的表现 - 上传表现良好,直到应用被操作系统终止。

在过去的几天里,我的头碰壁了,我不知道我还能在哪里看 - 我将不胜感激任何建议。

最佳答案

我已经找到了导致问题的原因 - AFURLSessionManager#uploadTaskWithRequest:fromData:progress:completionHandler 中的 fromData: 参数不能为 nil - 当 时任务会立即取消>数据丢失。当我尝试发送的文件之前被删除时,该问题暴露了应用程序另一部分的错误。

显然,一旦我弄清楚问题是什么,我就发现了 a similar issue reported on StackOverflow并给出解决方案。

Apple 没有在 API 文档中提及此行为,这太疯狂了。

关于ios - NSURLSessionUploadTask 创建后立即取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59413471/

上一篇:ios - 返回数组的函数没有在 for 循环 Swift 中获取附加内容

下一篇:ios - Xcode 11.3 在 macOS Catalina 10.15 中启动时崩溃

相关文章:

ios - 将 NSArray 作为 AFNetworking 中的参数传递

php - 将此 .php 转换为 ObjC 可运行的 NSURLSession POST 请求?

ios - 更改分段控制按钮的背景颜色

ios - 显示 AFNetworking+UIImageView 占位符图像,但不显示 URL 图像

ios - 如何最好地构建代码以在 iOS 中使用 AFNetworking 和 CoreData 下载资源

ios - 使用 afnetworking 2.1.0 实现 "Upload Task for a Multi-Part Request"时出错

ios - 如何在 iOS 上使用 AFNetworking/NSURLConnection 关注 "queue"

ios - Xcode:评估表达式不做任何事情

iphone - 如何创建在选项卡之间切换时保留在屏幕上的 View ?

ios - 在 ABAddressBookSave 上获取 EXC_BAD_ACCESS