我必须下载一长串文件,因此所有这些操作可能需要很长时间。我决定通过使用后台配置实例化的NSURLSession来管理这些下载任务。
构建并在我的iPhone上运行代码后,我会尝试测试应用程序的设备拔出并启动没有xCode的应用程序。在那种情况下,我注意到如果不通过WiFi连接,则下载将不再开始。此外,我注意到,在下载操作期间,如果设备进入睡眠模式,则将在几秒钟(10-15秒)后重新启动应用程序并将其解锁,并停止下载。
我不知道这是否重要,但我希望这些问题在iOS 8.2中不存在(现在我正在使用iOS 8.3)。
我的 session 配置如下
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];
最佳答案
如其他地方所讨论(例如,参见https://stackoverflow.com/a/25653066/1271826),当您使用discretionary
时,它可能会在开始请求之前考虑wifi状态。正如discretionary
文档所说:
传输大量数据时,建议您将此属性的值[即discretionary
]设置为YES
。这样做可以让系统安排对设备而言最佳的传输时间。例如,系统可能会延迟传输大文件,直到设备插入并通过Wi-Fi连接到网络为止。此属性的默认值为NO
。
我已经凭经验证实了这一点:
discretionary
后台 session ,插入了设备,然后将其放置了一整夜,当我早晨起床时,我的请求仍然没有执行。只有当我打开wifi时,它们才能继续(而且似乎很快)。 discretionary
。这次,虽然不是立即执行请求,但是仍然执行。它们大约在10分钟后完成了(顺便说一句,如果正常执行,它们可能会花费不到一分钟左右的时间,因此仅蜂窝网络的背景连接速度明显慢)。 最重要的是,
discretionary
在执行请求时将考虑wifi状态,但是在discretionary
关闭的情况下,尽管没有很快,但请求将在没有wifi的后台 session 中执行。但是,应注意,这仅适用于在应用程序处于前台时启动的任务。随着
discretionary
文档继续说:session 对象仅将此[i.e.
discretionary
]属性的值应用于您的应用在前台运行时启动的传输。对于在您的应用程序在后台运行时启动的传输,系统始终会自行决定启动传输-换句话说,系统假定此属性为YES
并忽略您指定的任何值。关于ios - 设备进入休眠模式时在临时部署中出现后台NSURLSession问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29616196/