iOS运行代码一天一次

时间:2012-06-05 19:22:41

标签: ios timer background

这个应用程序背后的想法非常简单:下载文件。然而,这个应用程序将适用于并非总是在互联网访问范围内的人,因此我需要知道在上午9:00将文件下载到硬盘驱动器。应用程序中还会有一个按钮手动完成,但我已经开始工作了。

据我所知,如果可能的话,这将是困难的。我知道iOS并不像多任务处理,但我也知道它确实允许后台计时器功能。我愿意接受任何人可能要做的任何建议,即使这意味着要编写一个单独的应用程序。感谢。

编辑:我看到有可能使用通知,甚至可能是日历。该类别的想法也受到欢迎。

编辑2:我还阅读了有关启动应用程序的外部服务器的内容,但没有给出任何说明。

5 个答案:

答案 0 :(得分:27)

这是关于应用程序安排某些活动定期发生的背景执行和通知以及计时器等情况。

  1. 应用无法在后台执行,除非:

    1. 它要求OS提供额外的时间。这是使用beginBackgroundTaskWithExpirationHandler完成的。苹果没有(故意)指明这个额外时间有多长,但实际上大约需要10分钟。

    2. 应用程序具有后台模式,模式为:voip,audio,location,newstand。即使它具有这些类型中的一种,如果没有一些限制,应用程序也无法执行。本讨论的其余部分假定应用程序没有后台模式。

  2. 当一个应用程序被暂停时,它无法做任何事情直接引发自己。它以前不能安排NSTimer,它不能使用像performSelector:afterDelay这样的东西。等。

    应用程序再次变为活动状态的唯一方式是,如果USER执行某些操作以使其处于活动状态。用户可以通过以下方式执行此操作:

    1. 直接从其图标

    2. 启动应用
    3. 启动应用以响应应用在其处于有效状态时之前安排的本地通知。

    4. 启动应用以响应服务器发送的远程通知。

    5. 其他几个:如果应用注册处理通过网址启动,则启动网址;或者如果其注册能够处理某种类型的内容。

  3. 如果当本地/远程通知触发时应用程序位于前台,则应用程序会直接接收该应用程序。

    如果本地/远程通知触发时应用程序当前不在前台,则应用程序不会收到它。通知触发时没有执行代码!

    只有当用户选择通知时,应用才会变为活动且可以执行。

    请注意,用户可以为整个设备禁用通知,也可以仅针对特定应用程序禁用通知,在这种情况下,用户将永远不会看到通知。如果在通知发生时关闭设备,则会丢失。

答案 1 :(得分:2)

您可以使用本地通知。当用户打开显示的通知时,它们会执行代码。您可以将本地通知设置为以指定的间隔(例如每天,每小时,每周等)重复发生。这仍然需要用户打开应用程序以启动进程。

UILocalNotification Class Reference

一旦委托方法触发,您只需几秒钟即可执行代码。注册长时间运行的后台任务,并下载您需要做的任何事情。如果在完成任务的10分钟内无法完成下载,则需要重新考虑下载策略。

Apple Multitasking and Backgrounding

我们在我工作的iOS应用程序中使用相同的概念,因此如果您正确设置它将会起作用。

<强>更新

对于那些好奇的方法,你只需要实现UILocalNotification委托方法。它们继承了应该已经存在的UIApplicationDelegate。

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// start your long running bg task here and update your file

}

**更新2 **

到目前为止,Martin H的回答是最正确的。但这就引出了一个问题,如果用户从未打开过应用程序,那么下载数据有什么意义呢?提醒他们打开应用和更新的定期本地通知可能是最好的方式,但仍然需要用户与您的应用进行互动,如果他们希望它保持最新和最新。

答案 2 :(得分:1)

我很确定这是不可能的,你最多可以做的是向用户发送推送通知,以便他们在需要时手动更新。

答案 3 :(得分:0)

后台应用程序有一个设定的时间限制(我相信10分钟,但不要引用我,可能会更少)来完成他们正在处理的任何事情。您将无法使用后台任务来执行您想要的操作。

您可以使用上次下载的日期设置NSUserDefault。启动时检查保存的日期,如果日期不是当前日期,则在9:00之后,以编程方式启动下载。

答案 4 :(得分:-2)

您是否尝试过以下操作?

if ([[[UIDevice currentDevice] systemVersion] floatValue] >=7.0)
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:600];


- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    completionHandler(UIBackgroundFetchResultNewData);
}