我必须下载一长串文件,因此所有这些操作可能需要很长时间。我决定使用后台配置实例化NSURLSession来管理这些下载任务。 一旦构建并将代码运行到我的iPhone上,我尝试测试应用程序拔出设备并在没有xCode的情况下启动应用程序。在那种情况下,我注意到如果连接不是通过WiFi,则不再开始下载。此外,我注意到,在下载操作期间,如果设备进入睡眠模式,几秒钟(10-15秒)后解锁它将重新启动应用程序并停止下载。 我不知道它是否重要,但我希望iOS 8.2中不存在这些问题(现在我使用的是iOS 8.3)。
我的会话配置如下
NSString *sessionIdentifier = @"com.yourappfor.example";
NSURLSessionConfiguration *sessionConfiguration;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionIdentifier];
} else {
sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
}
[sessionConfiguration setAllowsCellularAccess:YES];
[sessionConfiguration setSessionSendsLaunchEvents:YES];
[sessionConfiguration setURLCache:nil];
[sessionConfiguration setDiscretionary:YES];
[sessionConfiguration setTimeoutIntervalForRequest:90.0];
[sessionConfiguration setTimeoutIntervalForResource:43200.0];
[sessionConfiguration setHTTPMaximumConnectionsPerHost:15];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
答案 0 :(得分:1)
正如其他地方所述(例如,请参阅https://stackoverflow.com/a/25653066/1271826),当您使用discretionary
时,它可能会在启动请求之前考虑wifi状态。正如discretionary
文档所说:
传输大量数据时,建议您将此属性的值[即
discretionary
]设置为YES
。这样做可让系统在对设备更加优化的时间安排这些传输。例如,系统可能会延迟传输大文件,直到设备插入并通过Wi-Fi连接到网络。此属性的默认值为NO
。
我已经凭经验证实了这一点:
我关闭了wifi,启动了discretionary
后台会话,插入我的设备,并将其留在了一夜之间,当我早上起床时,我的请求仍未执行。只有当我打开wifi时,他们才会继续(并且似乎很快就这样做了)。
我在第二天晚上重复了这个练习,这次关闭discretionary
。这次,请求已经执行,但不是立即执行。它们在大约10分钟后完成(顺便说一句,如果正常执行,它们可能花费不到一分钟左右,因此仅有细胞的背景连接速度明显变慢)。
底线,discretionary
会在执行请求时考虑wifi状态,但关闭discretionary
后,请求将在没有wifi的后台会话中执行,尽管不是很快。
但应注意,这仅适用于您在应用处于前台时启动的任务。随着discretionary
文档继续说:
会话对象仅将此[即
discretionary
]属性的值应用于应用程序在前台启动时的传输。对于在您的应用程序处于后台时启动的传输,系统始终自行开始传输 - 换句话说,系统假定此属性为YES
并忽略您指定的任何值。
答案 1 :(得分:0)
10-15秒的等待时间可以来自设备锁定,然后Apple的数据保护功能可以控制。