当应用程序处于后台时 NSTimer 的行为是什么?
What is an NSTimer's behavior when the app is backgrounded?
我知道当您将应用置于后台时,计时器会停止 运行ning。然而,当你从后台回来时的行为是什么?计时器是否保持原来的fireDate
?
我 运行 遇到了一个问题,在 return 从后台启动 NSTimer 设置为十分钟后启动时,有时我会立即启动定时器applicationWillEnterForeground:
甚至被调用。当它没有触发并调用 applicationWillEnterForeground:
时,我有一些逻辑可以通过将计时器的 fireDate
与当前日期进行比较来检查 10 分钟是否已经过去,但是,即使已经过去了 10 分钟, 它似乎总是给我一个从当前日期算起的未来大约 525 秒的值。
我的理论如下:
一个 NSTimer
将在从后台返回时触发计时器,只要您未错过超过原定时间的预定时间。 (在这种情况下,我们将计时器安排为 10 分钟,只要您在后台运行 10-20 分钟,它就会在重新进入应用程序时触发。)
如果超过这个时间,它不会触发,而是在您 return 之后的同一时间段安排另一个计时器。 (A.K.A。如果您使用 10 分钟计时器在后台运行 20 分钟以上,当您返回时,它会在您 return 到应用程序。)
有人有关于此行为的文档吗?我的理论完全基于观察,关于当背景严重缺乏或我找不到时会发生什么的文档。
这个问题你不能使用定时器。这是我在调查类似问题后发现的:
- 应用程序在后台运行约 30 秒后,计时器停止。
- 当您从后台重新进入时,计时器会再次启动。
您可以采取什么措施来克服此问题并正确添加此功能,您必须在后端服务器上实施计时器。当计时器启动时点击服务并在应用程序处于前台时启动计时器。计时器会自行处理,但当应用程序终止或在后台运行时,服务器将开始运行。点击服务以获取经过了多少时间或在 10 分钟过去后发送推送通知。
您正确地观察到了 NSTimer 的行为方式。
如果您现在创建一个应该每 10 分钟触发一次的计时器,它将尝试从现在开始的 10 分钟、20 分钟、30 分钟等触发一次。如果应用程序在 1 分钟后进入休眠状态并在 12 分钟后唤醒,定时器将立即触发,然后在 20 分钟时再次触发(不是定时器触发后 10 分钟,而是原始时间后 20 分钟)。
但是如果计时器完全错过了一个事件,然后下一个计时器事件也迟到了,比如说如果你在 29 分钟后醒来,那么 10 分钟的事件就会被丢弃,20 分钟的事件会立即触发尽可能(29 分钟后),并在 30 分钟后触发 30 分钟事件。
我知道当您将应用置于后台时,计时器会停止 运行ning。然而,当你从后台回来时的行为是什么?计时器是否保持原来的fireDate
?
我 运行 遇到了一个问题,在 return 从后台启动 NSTimer 设置为十分钟后启动时,有时我会立即启动定时器applicationWillEnterForeground:
甚至被调用。当它没有触发并调用 applicationWillEnterForeground:
时,我有一些逻辑可以通过将计时器的 fireDate
与当前日期进行比较来检查 10 分钟是否已经过去,但是,即使已经过去了 10 分钟, 它似乎总是给我一个从当前日期算起的未来大约 525 秒的值。
我的理论如下:
一个
NSTimer
将在从后台返回时触发计时器,只要您未错过超过原定时间的预定时间。 (在这种情况下,我们将计时器安排为 10 分钟,只要您在后台运行 10-20 分钟,它就会在重新进入应用程序时触发。)如果超过这个时间,它不会触发,而是在您 return 之后的同一时间段安排另一个计时器。 (A.K.A。如果您使用 10 分钟计时器在后台运行 20 分钟以上,当您返回时,它会在您 return 到应用程序。)
有人有关于此行为的文档吗?我的理论完全基于观察,关于当背景严重缺乏或我找不到时会发生什么的文档。
这个问题你不能使用定时器。这是我在调查类似问题后发现的:
- 应用程序在后台运行约 30 秒后,计时器停止。
- 当您从后台重新进入时,计时器会再次启动。
您可以采取什么措施来克服此问题并正确添加此功能,您必须在后端服务器上实施计时器。当计时器启动时点击服务并在应用程序处于前台时启动计时器。计时器会自行处理,但当应用程序终止或在后台运行时,服务器将开始运行。点击服务以获取经过了多少时间或在 10 分钟过去后发送推送通知。
您正确地观察到了 NSTimer 的行为方式。
如果您现在创建一个应该每 10 分钟触发一次的计时器,它将尝试从现在开始的 10 分钟、20 分钟、30 分钟等触发一次。如果应用程序在 1 分钟后进入休眠状态并在 12 分钟后唤醒,定时器将立即触发,然后在 20 分钟时再次触发(不是定时器触发后 10 分钟,而是原始时间后 20 分钟)。
但是如果计时器完全错过了一个事件,然后下一个计时器事件也迟到了,比如说如果你在 29 分钟后醒来,那么 10 分钟的事件就会被丢弃,20 分钟的事件会立即触发尽可能(29 分钟后),并在 30 分钟后触发 30 分钟事件。