iOS 8 中可以通过蜂窝网络进行 NSURLSession 后台下载吗?

问题描述 投票:0回答:1

当我的应用程序在后台并被重大位置变化唤醒时,我需要启动少量下载。但苹果的 NSURLSessionConfiguration 文档在这里:

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 时,它们都会通过。

什么鬼?为什么 Apple 禁止配置此行为,特别是因为它们在 NSURLSessionConfiguration 对象上具有必要的属性(自由裁量权,allowsCellularAccess)。当然,当下载任务开始时,用户并不总是处于WiFi状态。我需要这样做,以响应因位置发生重大变化而唤醒的应用程序。我在后台会话上安排下载任务,并且在切换到 WiFi 之前从未在蜂窝网络上收到委托回调。那么这是否意味着我无法完成这些任务,除非 WiFi 再次可用或我将应用程序带回前台?

你们有人有解决方法吗?

我已经想到了以下几点:

位置更新后启动长时间运行的后台任务(旧式),并使用默认会话配置在那里下载我的东西。如果可行的话有什么经验吗?如果不是这样,我想我会使用 NSURLConnection (甚至更旧的风格)。

ios objective-c background nsurlsession nsurlsessiondownloadtask
1个回答
0
投票

请原谅我插话一个老问题,但有一些观察……


正如您所指出的,从后台启动的下载是自动“自由裁量的”(即,在操作系统自行决定的时间启动,通常是在使用 WiFi 并连接到电源时)。

这样做是因为:

  • 下载消耗用户的移动数据套餐(如果您用完计费周期的“免费”数据,费用可能会很高);和
  • 后台下载会以更高的速度消耗用户的电池。

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


为了解决这个问题,有两种方法:

  • 当应用程序在后台启动时,您实际上有足够的时间(15-30 秒,IIRC)来执行大多数网络请求。您只需启动一个标准网络请求(标准

    URLSessionConfiguration
    ,而不是后台配置)。您只需使用后台配置来进行超出此分配时间的下载。

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.