我发现即使你的应用程序在最多10分钟内处于后台模式(最小化),iOS也可以运行进程,并且要解决这个问题并让它永远运行,这是必要的:
需要定期下载和处理新内容的应用
这就是使用NSURLSession API向我的服务器发出请求的原因:
-(void)SendFiles{
...
NSURLSessionDataTask * dataTask =[defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil){
[self performSelector:@selector(SendFiles) withObject:nil afterDelay:3600.0];
}
}];
[dataTask resume];
}
我们中的一些人知道即使应用程序最小化也要运行进程,我们应该使用一些标签,但是如果你使用的是API,则不再需要NSURLSession这样的事情,对吗?
对于我的项目,他需要在我的服务器上每1小时发出一次这样的请求,为此我在块completionHandler中添加了一个代码:每隔1小时调用一次执行send命令的方法文件到服务器。
我的问题是:10分钟的时间会影响选择器延迟3600秒?导致我的应用程序完全关闭,我无法将文件发送到服务器?
答案 0 :(得分:2)
有几点想法:
iOS 7中的十分钟窗口缩短为三分钟。
如果您使用beginBackgroundTaskWithName
(或在iOS 7之前beginBackgroundTaskWithExpirationHandler
)请求,则只能访问该窗口。请参阅 iOS应用程序编程指南的Executing Finite-Length Tasks部分。
注意,我相信无论您运行连接到Xcode调试器的应用程序,此背景状态行为都会发生变化,因此请务必在实际设备上对此进行测试,并直接从设备运行应用程序,而不是通过Xcode运行。
是的,这段有限的时间会影响您拨打performSelector:afterDelay:
的延迟时间为3600.0的能力。
如果您想让应用程序定期向服务器询问数据,您现在可以使用“后台获取”。请参阅应用程序编程指南中的Fetching Small Amounts of Content Opportunistically。这旨在轮询服务器以查看是否有要下载的数据。
您只需30秒即可执行此请求。您也无法控制这些请求的时间(尽管您是否报告是否有可用数据可能会影响后续请求的时间)。