3

我在后台模式下使用,使用 a 和委托回调NSURLSession从文件上传图像。NSURLSessionUploadTask如果应用程序保持在后台而不是被用户杀死,那么所有这些都可以正常工作。

但是,如果仍有待上传的内容,并且应用程序使用主屏幕被终止,一旦应用程序重新启动并且未上传的图像被重新排队作为具有相同背景标识符的新 NSURLSession 的上传任务,就会发生一些非常奇怪的事情:

1) 任务只创建一次,当发生这种情况时,我为它们分配了一个任务描述,还NSURLSession为它们分配了一个每个会话唯一的任务标识符。我的NSURLSession背景是单身人士。

2)任务几乎立即失败并出现此错误:

Error Domain=NSURLErrorDomain Code=-999 "The operation couldn’t be completed. (NSURLErrorDomain error -999.)" UserInfo=0x174669880 {NSErrorFailingURLStringKey=myURL, NSURLErrorBackgroundTaskCancelledReasonKey=0

它调用完成委托方法:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

通过上述错误。此时我打印出与我创建的任务匹配的任务标识符和任务描述。

3)在所有这些任务几乎立即失败之后,即当事情开始变得奇怪时,所有这些任务都以某种方式再次放入NSURLSession我的代码没有做任何事情,请注意,使用查尔斯我可以看到一个单一的请求出去,这实际上从未失败。这第二次他们成功了didCompleteWithError,这次他们再次调用,没有错误。此时打印任务描述和任务标识符,令人惊讶地返回我分配的相同任务描述,但任务标识符不同!。这意味着 iOS 以某种方式使用相同的任务标识符重新创建该任务并再次排队,即使它声称它失败了。请注意,网络请求只能在 Charles 中看到一次,并且永远不会真正失败

这是问题,因为我无法区分真正的上传错误和 iOS 生成的伪错误,现在因为我没有明确取消任何这些请求,我正在检查错误代码是否已取消,并选择忽略它,因为我知道任务会神奇地重新排队。这对我来说似乎是一个非常明显的错误,并且可以一直复制。

有了解决方法,一切都按预期工作,但这是一个 hack,我可以想象我可能会在某个时候忽略真正的取消,并且永远不会通知客户端请求实际上失败了。

我只在网上找到了几个人描述这个问题,但没有任何回应。

有为此申请的雷达吗?有什么办法可以防止这种情况发生吗?

我正在使用 8.1 SDK。

4

0 回答 0