如何调用一个方法的数据,只有当应用程序在后台,一个小时的时间间隔

我想刷新我的应用程序数据, 当应用程序在后台每隔一小时 ,但只有当应用程序在后台。 早些时候,我正在按一下button。 我正在调用一个APIbutton,但现在我希望当我的应用程序每隔一小时后进入后台时也是如此。 有没有可能做到这一点。

我已经尝试调用该方法的下面的代码,但它没有被调用在后台。

 NSTimer* dataTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(autoRefreshAppData) userInfo:nil repeats:YES]; 

两个选项: BackgroundFetchsilent Push Notification

在这里find更多细节。

在后台下载内容

对的,这是可能的。

您主要有select使用计划的任务或执行推送通知的代码块。 在我看来,这是最容易的一个计划任务,但我已经体验到,任务并不总是执行。 因此,如果您的应用程序依赖后台提取,则应检查数据是否在application:willEnterForeground下载application:willEnterForeground ,如果新数据不可用,请下载数据。

以下是关于“ 后台执行 ”主题的Objective-c文档的链接

Objective-C的:

创build支持后台下载的configuration对象的过程如下:

  1. 使用NSURLSessionConfiguration的backgroundSessionConfigurationWithIdentifier:方法创buildconfiguration对象。
  2. 将configuration对象的sessionSendsLaunchEvents属性的值设置为YES。
  3. 如果您的应用程序在前台开始传输,则build议您也将configuration对象的任意属性设置为YES。
  4. 根据需要configurationconfiguration对象的任何其他属性。
  5. 使用configuration对象来创build您的NSURLSession对象。

configuration完成后,NSURLSession对象会在适当的时候无缝地将上传和下载任务交给系统。 如果任务在您的应用程序仍在运行时(在前台或后台)完成,则会话对象以通常的方式通知其委托。 如果任务尚未完成,系统终止您的应用程序,系统将自动继续在后台pipe理任务。 如果用户终止您的应用程序,系统将取消所有待处理的任务。

当与后台会话相关的所有任务都完成后,系统重新启动一个已终止的应用程序(假设sessionSendsLaunchEvents属性设置为YES,并且用户不强制退出应用程序)并调用应用程序委托的application:handleEventsForBackgroundURLSession:completionHandler:方法。 (系统还可以重新启动应用程序以处理需要应用程序关注的身份validation挑战或其他与任务相关的事件。)在实现该委托方法时,使用提供的标识符创build一个新的NSURLSessionConfiguration和NSURLSession对象,其configuration与之前。 系统将您的新会话对象重新连接到之前的任务,并将其状态报告给会话对象的委托。

因为我使用Swift编码,所以我会提供一些文档。 Swift 3.0

  1. 创build一个调度程序

要初始化调度程序,请为NSBackgroundActivityScheduler调用init(identifier :),并以反向DNS表示法向其传递一个唯一的标识符string(零和零长度的string不允许),在应用程序启动时保持不变。

 let activity = NSBackgroundActivityScheduler(identifier: "com.example.MyApp.updatecheck") 

系统使用此唯一标识符来跟踪活动的运行次数,并改进启发式方法以决定将来何时再次运行。

  1. configuration计划程序属性

有几个属性可以configuration,请检查API参考。 例如:

安排一个活动每小时触发一次

 activity.repeats = true activity.interval = 60 * 60 
  1. 使用scheduleWithBlock调度活动:

当你的块被调用时,它会传递一个完成处理程序作为参数。 configuration块来调用这个处理程序,传递一个types为NSBackgroundActivityScheduler.Result的结果来指示活动是完成(完成)还是应该被延迟(延迟)并在以后重新调度。 未能调用完成处理程序会导致该活动不被重新计划。 对于将被推迟和重新计划的工作,在调用完成处理程序之前,块可以select性地调整调度程序属性,例如间隔或容差。

 activity.scheduleWithBlock() { (completion: NSBackgroundActivityCompletionHandler) in // Perform the activity self.completion(NSBackgroundActivityResult.Finished) } 

注意事项:

应用程序只能获得后台执行大约10分钟(大约3分钟的iOS 7) – 在此之后,定时器将停止触发。 从设备locking时的iOS 7开始,它将几乎立即暂停前台应用程序。 iOS 7应用程序被locking后,定时器不会触发。