后台会话中的NSURLSessionDataTask

3
我想发起一个空的POST请求并读取响应头,而我的iOS应用程序处于后台。查看文档,它明确指出上传和下载任务在后台受支持,但存在两个问题:
  1. 我不需要上传内容,因此我不想创建空文件来使用。
  2. 我需要获取标头,因此下载任务无法提供必要的委托回调。
这使我只能使用 NSURLSessionDataTask文档 指出:

注意:在iOS 8之前和OS X 10.10之前,不支持后台会话中的数据任务。

然而,另一个文档页面 在相同的标题(后台传输注意事项)下指出:

仅支持上传和下载任务(没有数据任务)。

哪个文档页面是正确的?在后台会话中,是否支持没有要上传的数据的NSURLSessionDataTasks?
1个回答

8
请查看WWDC 2014视频《Foundation Networking的新特性》,大约在49分钟处。重要的是现在可以在后台会话中执行数据任务,但仅在应用程序运行时才有效。如果应用程序被挂起或终止,它将无法执行数据任务,尽管当它接收到响应时可以将其转换为下载任务。(顺便说一句,我不认为具有只能在应用程序仍在运行时才能工作的后台数据任务特别有用。)
我不确定您为什么要担心下载与数据任务。我的想法是,您可以只启动下载任务,然后在didFinishDownloadingToURL中查看downloadTask.response
话虽如此,我不清楚您更广泛意图是什么。如果您想ping您的服务器(例如,查看是否有可供下载的数据),则通常会使用后台获取。

我正在尝试实现一个多部分上传协议,该协议要求我发出HEAD或POST请求以开始上传,并且我希望即使应用程序被挂起也能正常工作。关键是我想在应用程序运行时将HEAD/POST请求放在NSURLSession上,即使没有可用的数据服务,也要记录响应(而不保存响应到文件中)。 - JustinHK
当您启动后台请求时,唯一可以在应用程序不活动时执行的选项是执行下载或上传任务。那么为什么不只是发起一个下载请求,但忽略下载响应体,并在后台守护进程唤醒您的应用程序时查看任务的“响应”呢?坦白地说,我仍然不理解为什么网络服务需要两个不同的请求来上传数据(只需发起后台上传请求,后台守护进程将在建立互联网连接时启动该请求)。 - Rob
该服务支持可恢复上传,因此您需要能够使用HEAD请求检查上传的当前偏移量 - 就像YouTube API(https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol)一样。 - JustinHK
明白了。因此,只需进行下载请求,不用担心正文,但要查看头信息,然后就可以了。请注意,如果应用程序在后台启动以通知您,并且随后启动其他请求以完成上传,则我相信从后台开始的网络请求会自动启用“自由裁量权”。 - Rob
我认为我需要从下载请求中删除保存的文件? - JustinHK
1
不,它会为您执行此操作。如果您想保留它,可以将其移动/复制到新位置,但是如果您不需要它,我认为您不需要担心它。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接