可以在iOS 8中通过手机下载NSURLSession背景吗?

bla*_*acx 8 background objective-c ios nsurlsession nsurlsessiondownloadtask

我需要在我的应用程序处于后台并通过重要位置更改唤醒时启动小型下载.但是这里的NSURLSessionConfiguration的Apples文档:

https://developer.apple.com/library/IOs/documentation/Foundation/Reference/NSURLSessionConfiguration_class/index.html#//apple_ref/occ/instp/NSURLSessionConfiguration/discretionary

对于全权财产说以下内容:

传输大量数据时,建议您将此属性的值设置为YES.这样做可让系统在对设备更加优化的时间安排这些传输.例如,系统可能会延迟传输大文件,直到设备插入并通过Wi-Fi连接到网络.此属性的默认值为NO.

会话对象仅将此属性的值应用于应用程序在前台时启动的传输.对于在您的应用程序处于后台时启动的传输,系统始终自行开始传输 - 换句话说,系统假定此属性为YES并忽略您指定的任何值.

这似乎意味着如果在后台启动下载,操作系统始终可以自行决定是否以及何时继续下载.在完成这些任务之前,操作系统似乎总是在等待wifi连接.我的经验支持这个猜想.我发现当设备处于蜂窝状态时,我可以发送几个下载通知.他们仍然卡住了.当我将设备切换到wifi时,它们都会通过.

WTF?为什么Apple禁止配置此行为,尤其是因为它们具有NSURLSessionConfiguration对象上的必要属性(自行决定,allowCellularAccess).当然,当启动下载任务时,用户并不总是在WiFi中.我需要通过显着的位置更改来响应应用程序唤醒.我在后台会话上安排下载任务,并且在切换到WiFi之前永远不会在蜂窝网络上接收代表回调.那么这是否意味着我无法完成这些任务unil WiFi再次可用或我将应用程序带回前台?

你们有人为此解决了吗?

我已经想到了以下内容:

在位置更新后启动长时间运行的后台任务(旧样式)并使用defaultSessionConfiguration下载我的东西.任何经验,如果这可以工作?如果这不是我会使用NSURLConnection我认为(甚至更旧的风格).

Rob*_*Rob -2

请原谅我插话一个老问题,但有一些观察\xe2\x80\xa6

\n
\n

正如您所指出的,从后台启动的下载会自动 \xe2\x80\x9cdiscretionary\xe2\x80\x9d (即,在操作系统自行决定的时间启动,通常在使用 WiFi 并连接到电源时)。

\n

这样做是因为:

\n
    \n
  • 下载消耗用户\xe2\x80\x99s移动数据计划(如果您\xe2\x80\x99已用完计费周期\xe2\x80\x99s\xe2\x80\x9cfree\xe2\x80\x9d数据,这可能会变得昂贵) ; 和
  • \n
  • 后台下载会以更高的速率消耗 user\xe2\x80\x99s 的电池。
  • \n
\n

如果在后台触发这些活动(消耗电池和数据计划)就会出现问题,因为所有这些都是在用户\xe2\x80\x99s 不知情/同意的情况下发生的。显然,如果用户使用 WiFi 并连接到电源,这些背景问题就可以消除。

\n
\n

为了回答如何解决这个问题,有两种方法:

\n
    \n
  • 当应用程序在后台启动时,您实际上有足够的时间(15-30 秒,IIRC)来执行大多数网络请求。您只需启动一个标准网络请求(标准URLSessionConfiguration,而不是后台配置)。您只需对超出此分配时间的下载使用后台配置。

    \n
  • \n
  • 如果您确实需要基于地理围栏数据开始非常大的下载,则只能在用户\xe2\x80\x99s 同意的情况下执行此操作。因此,例如,您可以只向用户显示通知(使用User Notifications UI),如果他们点击通知,从而启动您的应用程序,那么一旦应用程序位于前台,您就可以启动大量下载。

    \n
  • \n
\n
\n

有关详细信息,请参阅在后台处理位置更新

\n

您还可以考虑是否确实需要 \xe2\x80\x9csignificant change\xe2\x80\x9d 服务(每次用户\xe2\x80\x99s 位置发生重大变化时都会启动应用程序),或者是否可以完成使用地理围栏的目标,即识别用户何时进入特定区域。对于后一种方法,该方法对电池/数据更加友好,请参阅监控用户与地理区域的接近度

\n