iOS 伪定时器后台运行

  由于产品需求,需要做一个定时器后台运行的功能,但是搜索了一下,大多数做法都是通过音频播放类这种方式去实现,但是这种方式过审会有问题,好吧,宝宝走别的路咯。

那么问题来了,当APP进入了后台,我们可以通过什么方式去影响到代码内的东西呢,

想了一会儿决定用简单的方式去实现,那就是通知,准确说是本地通知

/*

* 为了满足定时器后台继续跑任务的需求

* KStopWatchSec  当前计时器剩余的秒数

* KStopWatchStatu 当前计时器的状态 ON/OFF

* KAppEnterBackGroundTime APP进入后台的时间

*/

#define KStopWatchSec [[NSUserDefaults standardUserDefaults]integerForKey:@"KStopWatchSec"]

#define KStopWatchStatu [[NSUserDefaults standardUserDefaults]valueForKey:@"KStopWatchStatu"]

#define KAppEnterBackGroundTime [[NSUserDefaults standardUserDefaults]valueForKey:@"KAppEnterBackGroundTime"]

根据现实场景,定义了3个参数

- (void)applicationDidEnterBackground:(UIApplication *)application{};

在APP进入后台方法内,存储好APP退出到后台时候的当前时间,当前状态(干什么用后面再说),以及当前定时器剩余的时间

然后创建一个本地通知执行定时器结束后需要做的事情,如果一个本地通知满足不了,没事,Appdelegate内还有

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{}; 

可以在这个方法内做一些本地通知内没做完的羞羞的事情,咳咳,富强、民主、文明、和谐、自由、平等、公正、法治、爱国、敬业、诚信、友善.....

然后APP挂后台ing ~

很久

很久

很久

很久以前,

跑偏了,再来

很久

很久

很久

很久之后

我们的APP需要回到前台了

- (void)applicationWillEnterForeground:(UIApplication *)application{};

那么在这里,我们需要做些什么?

1. 获取当前时间和之前APP进入后台时间的时间差

2. 然后把时间差和之前存储的定时器比较判断时间是否有超过定时器总时间,若未超过,相减得到定时器最新的时间,若超过了,也代表本地通知已经执行过了,啥也不说了状态改成OFF

3. 在定时器继续运行的界面内,根据之前存的定时器状态(ON 更新定时器时间及相关UI,OFF关闭定时器刷新UI,另外不论是ON\OFF 都要把APP进入后台的时间置空)

也许每个人的需求场景不同,但是希望能够给你启发,

另外,喜欢就收藏点赞吧,不定期更新。

既然说到这了,给你们讲个笑话,

从前

有个太监

在他身上发生了一件很恐怖的事情

他下面

下面

下面没有了

全文完

你可能感兴趣的:(iOS 伪定时器后台运行)