在iOS 7后台的一定时间后执行一行代码

时间:2014-05-15 15:32:40

标签: ios uiapplicationdelegate

为了提供一些上下文,我正在处理的应用程序允许用户沿时间线记录一系列事件。我们从beta测试者那里得到的一个重要反馈是,当用户在录制时退出应用程序时,他们希望计时器能够在一段时间内保持最新状态。

例如,如果用户录制了5分钟,然后离开应用程序检查电子邮件20秒,则计时器应为5:20,但实际上仍为5分钟。

所以我们已经修复了 - 应用程序现在显示为5:20,这在后台工作。

然而,我们无法找到一种方法在一定时间后停止它。如果应用程序在后台运行很短的时间,用户可能希望计时器恢复,但是如果你将它留在后台30分钟,计时器将会更新,我希望能够给出用户可选的截止时间,以便应用程序在一段时间后暂停。

我已经尝试过收听UIApplicationDelegate通知,但问题是我正在寻找applicationDidEnterBackground:和applicationWillTerminate之间的一个点,但遗憾的是没有什么可以满足我的需求。

总而言之,我希望applicationWillResignActive有一个30-60秒的宽限期:以确定是否暂停计时器,或让它继续运行。

这可能吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

假设您的应用将在后台运行通常是一个坏主意。

考虑它的更好方法IMO将在applicationDidEnterBackground:中将变量设置为当前时间,并在applicationWillBecomeActive:中检查到现在的时间间隔:

  • 如果间隔时间大于您的宽限期,请将时间备份到应用暂停时。
  • 如果它更小,请更新它,好像应用程序永远不在后台。

答案 1 :(得分:0)

使用dispatch_after在一定秒数后执行一段代码:

int64_t delay = 30.0; // In seconds
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0ull), ^(void){

    //DO SOMETHING

});

答案 2 :(得分:0)

Swift 3.0 Xcode 8.0代码示例:

Using delegate methods : applicationWillBecomeActive & applicationWillResignActive to capture the time in between.

OR

let deadlineTime = DispatchTime.now() + .seconds(30)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
      alert.dismiss(animated: true, completion: nil)
}

希望这有帮助。