当应用程序背景时,NSTimer的行为是什么?

我知道当你设置应用程序时,计时器会停止运行。 但是,当你从后台回来时的行为是什么? 计时器是否保持其原始fireDate

我遇到了一个问题,在从背景返回时,NSTimer设置为十分钟后触发,有时我会立即在applicationWillEnterForeground:之前调用计时器。 当它没有触发,并且调用applicationWillEnterForeground: ,我有一些逻辑可以通过将计时器的fireDate与当前日期进行比较来检查是否已经过了10分钟,但是,即使已经过了10分钟,它似乎总能给我从当前日期开始的未来值约为525秒。

我的理论如下:

  • NSTimer将在从后台返回时启动计时器,只要您没有错过预定时间超过原计划时间。 (在这种情况下,我们将计时器安排为10分钟,只要您在后台进行10-20分钟,它将在重新进入应用程序时触发。)

  • 如果超过该值,则不会触发,而是在您返回时在将来的同一时间段内安排另一个计时器。 (AKA如果您使用10分钟计时器已经在后台工作了20多分钟,当您回来时,它会在您返回应用程序之后将计时器安排在10分钟内。)

有没有人有关于这种行为的任何文件? 我的理论完全基于观察,关于背景可能缺乏或者我无法找到它时会发生什么的文档。

您正确地观察了NSTimer的行为方式。

如果您现在创建一个应该每十分钟触发一次的计时器,它将尝试从现在开始十分钟,20分钟,30分钟等等。 如果应用程序在一分钟后进入睡眠状态并在12分钟后醒来,则计时器将立即启动,然后再在20分钟(定时器启动后10分钟,但在原始时间后20分钟)再次启动。

但是如果计时器完全错过一个事件然后下一个计时器事件也迟到,比如说你在29分钟后醒来,那么10分钟的事件就会被取消,那么20分钟的事件会尽快被解雇(29点之后)分钟),30分钟后30分钟的事件被解雇。

您无法使用计时器来解决此问题。 这是我在调查类似问题后发现的:

  • 应用程序在后台运行约30秒后,计时器停止。
  • 当您从后台重新进入时,计时器再次开始启动。

您可以采取哪些措施来克服此问题并正确添加此function,您必须在后端服务器上实现计时器。 在计时器启动时启动服务,并在应用程序处于前台时启动计时器。 计时器将自行处理,但当应用程序终止或在后台时,服务器将进入游戏。 点击服务以获取已过去的时间或在10分钟过后发送推送通知。