我希望刷新我的应用数据,当应用在每一小时后处于后台时,但仅当应用处于后台时才会刷新。早些时候,我在按钮上做了这个。我在按钮水龙头上拨打了API
,但现在我希望我的应用每隔一小时后进入后台。是否有可能这样做。
我已经尝试过以下代码来调用该方法,但它没有在后台调用。
NSTimer* dataTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(autoRefreshAppData) userInfo:nil repeats:YES];
答案 0 :(得分:0)
两个选项:%03d
或BackgroundFetch
。
查找更多详情here。
答案 1 :(得分:0)
在后台下载内容
是的,这是可能的。
您可以选择使用计划任务或使用推送通知执行代码块。在我看来,对于计划任务来说这是最简单的,但我已经体验到任务并不总是被执行。因此,如果您的应用依赖于后台提取,则应检查数据是否已在application:willEnterForeground
下载,并在新数据不可用时下载数据。
以下是有关该主题的Objective-c文档的链接:Background Execution
目标C:
创建支持后台下载的配置对象的过程如下:
- 使用backgroundSessionConfigurationWithIdentifier:NSURLSessionConfiguration方法创建配置对象。
- 将配置对象的sessionSendsLaunchEvents属性的值设置为YES。
- 如果您的应用在前台开始转移,建议您还将配置对象的自由选择属性设置为YES。
- 根据需要配置配置对象的任何其他属性。
- 使用配置对象创建NSURLSession对象。
醇>配置完成后,您的NSURLSession对象会在适当的时间无缝地将上传和下载任务移交给系统。如果任务在您的应用程序仍在运行时(在前台或后台)完成,则会话对象将以通常的方式通知其委托。如果任务尚未完成且系统终止您的应用程序,系统将自动继续在后台管理任务。如果用户终止您的应用,系统将取消所有待处理的任务。
当与后台会话关联的所有任务完成后,系统会重新启动已终止的应用程序(假设sessionSendsLaunchEvents属性设置为YES并且用户没有强制退出应用程序)并调用应用程序委托的{{ 1}}方法。 (系统还可能重新启动应用程序以处理需要应用程序注意的身份验证质询或其他与任务相关的事件。)在该委托方法的实现中,使用提供的标识符创建新的NSURLSessionConfiguration和NSURLSession对象,其配置与之前。系统会将新会话对象重新连接到先前的任务,并将其状态报告给会话对象的委托。
由于我使用Swift编写代码,我将提供一些相关的文档。 Swift 3.0
要初始化调度程序,请为NSBackgroundActivityScheduler调用init(identifier :),并以反向DNS表示法传递唯一标识符字符串(不允许使用nil和零长度字符串),并在应用程序启动时保持不变。
application:handleEventsForBackgroundURLSession:completionHandler:
系统使用此唯一标识符来跟踪活动运行的次数,并改进启发式以确定将来何时再次运行它。
您可以配置几个属性,请检查API参考。 E.G:
安排每小时开火一次的活动
let activity = NSBackgroundActivityScheduler(identifier: "com.example.MyApp.updatecheck")
调用块时,它会将完成处理程序作为参数传递。配置块以调用此处理程序,向其传递NSBackgroundActivityScheduler.Result类型的结果,以指示活动是完成(已完成)还是应延迟(延迟)并重新安排以后执行。无法调用完成处理程序会导致活动不被重新安排。对于将被延迟和重新安排的工作,该块可以在调用完成处理程序之前选择性地调整调度程序属性,例如间隔或容差。
activity.repeats = true
activity.interval = 60 * 60
要记住的注意事项:
应用程序仅在后台执行时间约10分钟(从iOS 7开始约3分钟) - 此后计时器将停止触发。 从iOS 7开始,当设备被锁定时,它几乎会立即暂停前台应用程序。 iOS 7应用程序锁定后,计时器不会启动。