当应用程序处于后台时 NSTimer 的行为是什么?

What is an NSTimer's behavior when the app is backgrounded?

我知道当您将应用置于后台时,计时器会停止 运行ning。然而,当你从后台回来时的行为是什么?计时器是否保持原来的fireDate

我 运行 遇到了一个问题,在 return 从后台启动 NSTimer 设置为十分钟后启动时,有时我会立即启动定时器applicationWillEnterForeground: 甚至被调用。当它没有触发并调用 applicationWillEnterForeground: 时,我有一些逻辑可以通过将计时器的 fireDate 与当前日期进行比较来检查 10 分钟是否已经过去,但是,即使已经过去了 10 分钟, 它似乎总是给我一个从当前日期算起的未来大约 525 秒的值。

我的理论如下:

有人有关于此行为的文档吗?我的理论完全基于观察,关于当背景严重缺乏或我找不到时会发生什么的文档。

这个问题你不能使用定时器。这是我在调查类似问题后发现的:

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

您可以采取什么措施来克服此问题并正确添加此功能,您必须在后端服务器上实施计时器。当计时器启动时点击服务并在应用程序处于前台时启动计时器。计时器会自行处理,但当应用程序终止或在后台运行时,服务器将开始运行。点击服务以获取经过了多少时间或在 10 分钟过去后发送推送通知。

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

如果您现在创建一个应该每 10 分钟触发一次的计时器,它将尝试从现在开始的 10 分钟、20 分钟、30 分钟等触发一次。如果应用程序在 1 分钟后进入休眠状态并在 12 分钟后唤醒,定时器将立即触发,然后在 20 分钟时再次触发(不是定时器触发后 10 分钟,而是原始时间后 20 分钟)。

但是如果计时器完全错过了一个事件,然后下一个计时器事件也迟到了,比如说如果你在 29 分钟后醒来,那么 10 分钟的事件就会被丢弃,20 分钟的事件会立即触发尽可能(29 分钟后),并在 30 分钟后触发 30 分钟事件。