ios - NSURLSessionUploadTask 获取响应数据

标签 ios nsurlsession nsurlsessionuploadtask

我对使用 NSURLSession 框架有一些误解,这就是为什么我决定从头开始编写小型应用程序,而不使用 AFFramework/Alamofire。

我有一个 API,需要执行以下步骤来上传文件:

  1. POST 文件数据
  2. 获取响应 (JSON)
  3. 将一些 json 字段发布到 api/save

我有一个具有此类配置的后台 session :

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("myBackground")
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

我实现了两种方法:

func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData)

我汇总所有数据的地方

func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?)

我将这些数据转换为响应对象。这个响应对象对我来说非常重要。

一切正常,虽然应用程序位于前台,但我在后台遇到问题。

案例1

我开始上传数据后应用程序崩溃了。根据 WWDC 我需要实现

func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void)

并在didCompleteWithError方法中调用此处理程序。但在调用此方法之前,我需要使用上传响应中的数据调用 api/save 。 我怎样才能得到这些数据?

案例2

大部分情况类似。用户在上传过程中停止应用程序。比在几秒钟内加载应用程序,而 session 可以完成我的任务。现在 session 调用didReceiveData,但是当然,一些数据丢失了。这种情况我该怎么办?如何恢复响应数据?

最佳答案

您没有提到实现URLSessionDidFinishEventsForBackgroundURLSession(一个NSURLSessionDelegate方法)。您也确实想实现这一点。基本流程是:

  • 在应用委托(delegate)的 handleEventsForBackgroundURLSession 中,您应该:

    • 启动后台NSURLSession(它将开始接收与所有上传相关的委托(delegate)方法调用);和
    • 保存完成处理程序(但暂时不要调用它)。
  • 然后,在 URLSessionDidFinishEventsForBackgroundURLSession 中(处理完所有响应后),调用在 handleEventsForBackgroundURLSession 中保存的完成处理程序。 (确保将其分派(dispatch)到主队列。)

如果您执行了所有这些操作,当后台 session 重新启动时,didReceiveData 调用将随对您的各种上传的响应一起传入。

我刚刚做了一个快速测试,上传了五张 20mb 的图像并立即终止了应用程序。然后,即使应用程序没有运行,我也看到这五个文件慢慢地出现在我的服务器上(显然是由守护进程处理的)。当所有五个都完成后,应用程序在后台透明地重新启动,调用 handleEventsForBackgroundURLSession (重新启动 session ),它让所有 didReceiveData 调用快速被调用,完成后,URLSessionDidFinishEventsForBackgroundURLSession 被调用,然后我的应用程序才调用保存的完成处理程序。

就为什么这对您不起作用而言,没有足够的证据来诊断问题。可能性包括:

  • 也许您不恰本地终止了该应用程序。您无法通过双击主页按钮并在那里终止应用程序来终止应用程序;您必须让它自然终止,或者出于诊断/测试目的,我通过在代码中调用 exit(0) 强制它终止。

  • 也许您在调用 handleEventsForBackgroundURLSession 时没有重新启动 session 。

  • 也许您太早调用了提供的完成处理程序(即在调用 URLSessionDidFinishEventsForBackgroundURLSession 之前)。

很难说,但我怀疑您的实现中隐藏着一些不太正确的东西,并且根据提供的信息很难说出它是什么(假设它不是上述几点之一) )。不幸的是,调试这个后台 session 非常复杂,因为当应用程序终止时,它不再附加到调试器,因此您无法轻松调试应用程序由 iOS 自动重新启动后发生的情况)。就我个人而言,我要么发送 NSLog 消息并仅观察设备控制台(以及观察服务器上显示的内容),要么在应用程序本身中构建一些持久日志记录机制。

关于ios - NSURLSessionUploadTask 获取响应数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34760265/

相关文章:

iOS View.layer.border 有白边

ios7 - iOS 7 NSURLSession 在后台下载多个文件

swift - NSURLSession 响应字符串完成 block - Swift

ios - AFNetworking V 2 是否支持非流式多部分后台上传任务?

ios - NSURLSessionUploadTask 不上传带参数的图片

ios - 将 PonyDebugger 与 Monotouch 一起使用?

ios - 使用ObjectiveDropboxOfficial框架获取用户信息

ios - ImageView panGesture取消UISCrollVIew滚动功能

ios - 如何应用应用级 NsUrlSession 拦截器? iOS swift ?

ios - NSURLSession 后台传输不工作