10

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

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

对可自由支配的财产说以下:

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

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

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

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

你们中有人有解决方法吗?

我已经想到了以下几点:

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

4

0 回答 0