iOS 保证定时器进入后台依然运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 保证定时器进入后台依然运行相关的知识,希望对你有一定的参考价值。

参考技术A 最近项目中有个 定时器计时 实时更新等车的时长,因为项目里面进入后台是有执行一些任务的操作,因此如果进入后台时间不长,是定时器是不会暂停的,但如果进入后台时间,超过 20s 以上,定时器就暂停,回到前台重新开始倒计时,这时候等车的时长会出现不准的情况。

经验证 NSTimer , CADisplayLink , dispatch_source_t ,三个定时器,在进入到后台的时候,都会暂停,等到返回前台的时候,才会继续回调。

看了一些博客说加上后台任务执行这句话可以保证 App 进入后台,定时器不会暂停,依然继续执行

经验证,后台执行任务也将暂停延迟,还是没办法解决 App 长时间进入后台,定时器暂停问题。

我们通过监听 mainRunLoop 回调可以发现,当 App 进入到后台, mainRunLoop 进入了休眠,当 App 回到前台, mainRunLoop 重新唤醒继续执行。

因此我再想,如果在 App 进入后台的时候,将已经睡眠的 mainRunLoop 重新唤醒,是不是就可以保证定时器的不暂停,持续运行。

经验证,结果如猜想一样,在 App 进入后台,重新唤醒 mainRunLoop ,可以保证定时器不暂停,可以一直运行。

因此这里我推断,因为我们定时器的回调任务是添加到主队列,由于进入后台, mainRunLoop 进入休眠,导致主线程没有去执行主队列的的任务,因此导致定时器没有回调。

那如果我在子线程开启定时器倒计时,然后通过 runloop 保活这个子线程,监听这个子线程的 runloop 回调,发现当 App 进入后台,子线程的 runloop 也进入休眠,这时候子线程的定时器也不再回调.

这时候,我在 App 进入后台,单独将子线程的 runloop 唤醒,发现子线程的定时器依然不会进行回调。

但是如果在 App 进入后台,单独将主线程的 mainRunloop 唤醒,发现子线程的定时器就可以正常执行。

这个现象背后的本质原理是怎样,我找了相关资料,也跟朋友探讨过,依然没有得到一个合理的解释。知道的朋友,可以留言通知下。

如果想让 App 进入后台,定时器依然能继续执行,最有效的办法,就是监听 App 进入后台的通知,在 App 进入后台之后,唤醒主线程的 mainRunloop ,也就是加上这句:

如何保证程序进入后台继续运行

 

以上是关于iOS 保证定时器进入后台依然运行的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发简单的实现后台任务(诸如后台播放音乐,定时器,后台定位等)

在后台运行ios应用

当应用程序进入和退出后台时更新ios中的计时器

使用计时器在后台刷新应用程序

如何在应用程序进入后台或终止时运行计时器

使计时器在后台 iOS 上运行 3 分钟以上