Background NSURLSession后台会话可以运行数据任务吗?

Background NSURLSession后台会话可以运行数据任务吗?,background,watchkit,Background,Watchkit,提及的内容给出了一行 在后台会话中,仅支持上载和下载任务(无数据任务) 但是这个, 似乎表明后台会话可以执行数据任务 会话的行为由用于创建会话的配置对象确定。因为有三种类型的配置对象,所以也有三种类型的会话:行为与NSURLConnection非常相似的默认会话、不将任何内容缓存到磁盘的临时会话,以及将结果存储在文件中并在应用程序挂起时继续传输数据的下载会话、退出会话、,或者崩溃 在这些会话中,您可以安排三种类型的任务:用于将数据检索到内存的数据任务、用于将文件下载到磁盘的下载任务以及用于从磁

提及的内容给出了一行

在后台会话中,仅支持上载和下载任务(无数据任务)

但是这个,

似乎表明后台会话可以执行数据任务

会话的行为由用于创建会话的配置对象确定。因为有三种类型的配置对象,所以也有三种类型的会话:行为与NSURLConnection非常相似的默认会话、不将任何内容缓存到磁盘的临时会话,以及将结果存储在文件中并在应用程序挂起时继续传输数据的下载会话、退出会话、,或者崩溃

在这些会话中,您可以安排三种类型的任务:用于将数据检索到内存的数据任务、用于将文件下载到磁盘的下载任务以及用于从磁盘上载文件并将响应作为内存中的数据接收的上载任务。


什么是正确的?我是否能够在NSURL上发出GET http请求,然后JSONSerialize在“后台”接收的NSDATA

您只能在后台运行上载和下载任务。这里有一段直接取自《圣经》的引文


背景转移注意事项

NSURLSession类支持应用程序挂起时的后台传输。后台传输仅由使用后台会话配置对象创建的会话提供(通过调用backgroundSessionConfiguration:)返回)

对于后台会话,由于实际传输由单独的进程执行,并且重新启动应用程序的进程相对昂贵,因此有一些功能不可用,导致以下限制:

  • 会话必须为事件传递提供一个委托。(对于上载和下载,代理的行为与进程内传输相同。)
  • 仅支持HTTP和HTTPS协议(无自定义协议)

  • 仅支持上载和下载任务(无数据任务)

  • 始终遵循重定向

  • 如果在应用程序处于后台时启动后台传输,则配置对象的Discreative属性将被视为true



相反,您要做的是将
GET
请求作为下载请求运行,并将JSON数据保存到文件中。下载完成后,将文件内容读取到内存中,并解析
NSData
,就像它来自数据请求一样。

我在iOS 11.3上对其进行了测试,在应用程序处于后台时启动了一个后台会话配置的数据任务,最后的结果是
Domain=nsurerrordomain code=-997“与后台传输服务的连接中断”
错误。另一方面,当应用程序位于前台时,相同的任务成功完成。这证明了@cnoon的答案。