应用程序中运行的计时器在一段时间后开始延迟触发,原因不明

Posted

技术标签:

【中文标题】应用程序中运行的计时器在一段时间后开始延迟触发,原因不明【英文标题】:Timer running in an application starts delaying firing after a while, for unknown reason 【发布时间】:2016-12-07 03:29:57 【问题描述】:

我正在用 Swift 3 编写一个简单的闹钟应用程序。

我编写此应用程序的方式是,我将timer 设置为 60 秒,每次触发时,它都会检查是否为该时间设置了警报,然后触发警报。

这个应用程序的目的是在它启动时打开我的 HomeKit 连接的灯。这就是为什么我不能采取设置本地通知的方法的原因,因为当它执行时,没有办法运行开灯的代码。

我已将此应用程序设置为在后台运行(只要苹果允许),如果在您锁定手机时应用程序处于打开状态,它将继续运行。 这在模拟器中完美运行,即使很长时间也是如此。当我没有将闹钟设置得太远时,这也适用于我的手机。 但是,当我将应用程序留在手机上过夜时,它很少能正常工作。

为了调试它,我在应用程序中创建了一个文本文件,并设置了timer,这样当它检查时间时,它也会将时间写入该文本文件。

我这样做是为了看看计时器是否会继续整夜运行。

这是我的结果。

昨晚,我凌晨 4 点上床睡觉,并设置了早上 8 点的闹钟。 (我知道这很好,哈哈) 在文本文件中,当我让应用程序运行时,计时器继续运行了半个小时,每分钟都记录正确的时间。

为了方便阅读,我上传了一张截图。

http://imgur.com/a/lPAZD

注意它是如何记录每分钟的。

但是,在深夜之后,计时器停止每分钟触发一次,并开始变得更加零散。

http://imgur.com/a/8Emd9

注意计时器是如何在5:13 am5:25 am5:53 等处触发的。

这已经在过去的几个晚上发生了,我不知道该怎么办。

我没有收到任何短信,或者任何我认为会导致应该每分钟触发一次的计时器,随机每半小时触发一次。

我能做些什么来确保这个计时器每分钟可靠地触发一次吗?

如果你能做到这一点,非常感谢!这是我的第一个应用程序,解决 Apple 的背景限制非常困难。 谢谢!

【问题讨论】:

不幸的是,ios 不是长时间运行的、定时的后台任务的好平台。您可以在某处使用服务器在需要的时间向您的应用程序发送静默推送通知,这将触发您的应用程序在后台运行,您可以在其中关灯。此外,当您在 Xcode 调试器下运行时,后台执行的限制被暂停,这就是您看到模拟器和您的设备之间存在差异的原因。 那么当我发送静默推送通知时,我可以运行代码来开灯吗?我认为这仅限于从服务器下载内容。如果那不是真的,那就太好了! 你可以在didReceiveRemoteNotification方法中运行任何你想要的代码;您只需要尊重后台执行时间限制 这是个好消息!谢谢! 我通常会在自己的类中包含非视图控制器的东西(例如 HomeKit)。您需要确保调用传递给didReceiveRemoteNotification 函数的completionHandler,传递一个值来指示状态。在你的。看到你总是可以通过 .newData 【参考方案1】:

你的方法是行不通的。 Apple 不允许您让应用程序在后台持续运行。这将很快耗尽用户的电池。您可能想要设置本地通知。您可以将它们设置为将来随时关闭。

在最新版本的 iOS 中,Apple 会调整计时器触发的时间以节省电池电量。我不知道如何从后台大幅更改计时器的间隔,但这听起来确实像发生了什么。

【讨论】:

我应该编辑我的主要帖子,但这个应用程序实际上会在警报响起时打开我的 HomeKit 连接灯。因此我无法设置本地通知,因为无法执行打开灯所需的代码。这就是我采取这种方法的原因,我想不出另一种方法来拥有这个应用程序功能。 你能想到我可以采取的任何其他方法吗?

以上是关于应用程序中运行的计时器在一段时间后开始延迟触发,原因不明的主要内容,如果未能解决你的问题,请参考以下文章

像标准视频播放器一样在一段时间后隐藏叠加层

Spring boot REST服务在一段时间后停止

js中怎么让程序暂停一段时间

安卓。报警管理器。重复警报不会触发,并且在一段时间后会立即触发所有警报

函数防抖VS函数节流

如何暂停/播放 NSTimer?