当应用程序同时在前台和后台时,如何将计时器设置为 运行?
How to set a timer to run when an app is both in foreground and in background?
我将我的应用设置为在后台继续接收位置更新 ("Background modes > Location updates")。我的应用程序也在前台侦听位置更新。但是我需要我的应用程序在给定的一定秒数内继续监听位置,如果应用程序在前台则显示倒计时,如果应用程序进入后台则保持时间计数因为我需要停止时间结束时的位置管理器。
我发现在应用程序处于前台时设置 NSTimer
并显示倒计时没有问题,但我不知道当应用程序进入后台时如何处理它......在评论中AppDelegate
的委托 applicationWillResignActive:
和 applicationDidEnterBackground:
方法据说定时器应该在那里被禁用和失效......此外,我正在使用的定时器是在主线程中创建的:
[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(updateCountdown:)
userInfo:nil
repeats:YES];
我如何could/should处理这种情况?
提前致谢
编辑: 我将尝试解释一个我可能遇到的场景:我的应用程序在给定的时间间隔内侦听位置,然后它应该停止侦听。假设我要给用户 5 分钟时间到达某个位置。用户点击一种 "start" 按钮,然后我启动位置管理器来跟踪用户的位置,同时我也开始倒计时。当倒计时达到 0 时,我停止位置管理器并检查用户走过的路径和他到达的位置。由于应用程序可以在用户开始倒计时后进入后台,因此我启用了 Background modes > Location updates
。在应用程序处于后台时监听位置是可以的,但是,如果倒计时结束时应用程序仍在后台怎么办?即使应用程序在后台,我也需要停止跟踪用户的位置。我需要一个计时器来在后台保持 运行 无论我需要为用户设置什么倒计时,可能是 5 分钟,也可能是 1 小时...
再次感谢
您不能 运行 计时器永远在后台运行,它不是 OS 允许的后台模式之一,因此它会在某个时候终止。将其包装在后台任务中最多只会为您多花几分钟(大约 10 分钟)。
要在您的应用进入后台时正确跟踪时间,您需要:
来自 applicationDidEnterBackground
- 一旦您的应用程序转换到后台,就保存一个时间戳。
- 终止你的计时器
当您的应用重新进入前台时:
来自 applicationWillEnterForeground
编辑 或 'didUdateLocations'
- 读取保存时间戳
- 使用
timeIntervalSinceDate
获取以秒为单位的流逝时间
- 使用时间跨度重新启动计时器以设置剩余时间
我觉得这种控件需要一个中间件才能完美运行。我不知道您的应用程序是否有后端,但如果有,您可以在用户尝试在您的应用程序中启动计时器并且您更新应用程序背景时发送请求。计时器完成支持后,可以向用户发送有关此的通知,如果用户返回您的应用程序或您离开它,您将处理它。
我将我的应用设置为在后台继续接收位置更新 ("Background modes > Location updates")。我的应用程序也在前台侦听位置更新。但是我需要我的应用程序在给定的一定秒数内继续监听位置,如果应用程序在前台则显示倒计时,如果应用程序进入后台则保持时间计数因为我需要停止时间结束时的位置管理器。
我发现在应用程序处于前台时设置 NSTimer
并显示倒计时没有问题,但我不知道当应用程序进入后台时如何处理它......在评论中AppDelegate
的委托 applicationWillResignActive:
和 applicationDidEnterBackground:
方法据说定时器应该在那里被禁用和失效......此外,我正在使用的定时器是在主线程中创建的:
[NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(updateCountdown:)
userInfo:nil
repeats:YES];
我如何could/should处理这种情况?
提前致谢
编辑: 我将尝试解释一个我可能遇到的场景:我的应用程序在给定的时间间隔内侦听位置,然后它应该停止侦听。假设我要给用户 5 分钟时间到达某个位置。用户点击一种 "start" 按钮,然后我启动位置管理器来跟踪用户的位置,同时我也开始倒计时。当倒计时达到 0 时,我停止位置管理器并检查用户走过的路径和他到达的位置。由于应用程序可以在用户开始倒计时后进入后台,因此我启用了 Background modes > Location updates
。在应用程序处于后台时监听位置是可以的,但是,如果倒计时结束时应用程序仍在后台怎么办?即使应用程序在后台,我也需要停止跟踪用户的位置。我需要一个计时器来在后台保持 运行 无论我需要为用户设置什么倒计时,可能是 5 分钟,也可能是 1 小时...
再次感谢
您不能 运行 计时器永远在后台运行,它不是 OS 允许的后台模式之一,因此它会在某个时候终止。将其包装在后台任务中最多只会为您多花几分钟(大约 10 分钟)。
要在您的应用进入后台时正确跟踪时间,您需要:
来自 applicationDidEnterBackground
- 一旦您的应用程序转换到后台,就保存一个时间戳。
- 终止你的计时器
当您的应用重新进入前台时:
来自 applicationWillEnterForeground
编辑 或 'didUdateLocations'
- 读取保存时间戳
- 使用
timeIntervalSinceDate
获取以秒为单位的流逝时间 - 使用时间跨度重新启动计时器以设置剩余时间
我觉得这种控件需要一个中间件才能完美运行。我不知道您的应用程序是否有后端,但如果有,您可以在用户尝试在您的应用程序中启动计时器并且您更新应用程序背景时发送请求。计时器完成支持后,可以向用户发送有关此的通知,如果用户返回您的应用程序或您离开它,您将处理它。