IOS 保持程序在后台一定时间运行

IOS 保持程序在后台一定时间运行,第1张

根据用户需求,在执行任务时因外部因素程序退到后台;一段时间之后回来能继续在当前页面 *** 作。

@property ( nonatomic , assign ) BOOL     goingToQuit

//自定义停留时间

#define KILL_IN_BACKGROUND_AFTER_SECS3600

// APP进入后台

- ( void )applicationDidEnterBackground:(UIApplication *)application

{

    [ self comeToBackgroundMode]

    //环信调用applicationDidEnterBackground 后会导致应用回到后台就被杀死

    //[[EMClient sharedClient] applicationDidEnterBackground:application]

}

/*

 *退出后台保证应用短时间内不被杀死

 **/

-( void )comeToBackgroundMode{

    self .goingToQuit = YES

    UIApplication* app = [UIApplication sharedApplication]

    UIBackgroundTaskIdentifier   __block    bgTask//设置后台任务ID

    //开始申请一些额外的时间来处理任务,延迟系统挂起你的应用

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

      //退到后台后30秒进入

      [app endBackgroundTask:bgTask]//告诉系统,任务完成了,可以挂起APP了

      bgTask =UIBackgroundTaskInvalid

    }]

    //过期处理

    if (UIBackgroundTaskInvalid != bgTask) {

      // Start the long-running task to kill app after some secs and return immediately.

      dispatch_after( dispatch_time(DISPATCH_TIME_NOW, KILL_IN_BACKGROUND_AFTER_SECS * 1e09),

        dispatch_get_main_queue(), ^{

          if ( self .goingToQuit){

              self .goingToQuit= NO

              exit(0)

          }

          [app   endBackgroundTask: bgTask]

        })

    }

}

最近在做番茄钟的功能。首先简单介绍一下番茄钟吧,就是25分钟工作番茄工作法。先说一下** 番茄工作法 **:

那么功能就相当于一个25分钟的闹钟,可以播放背景音乐,到点给用户提醒。

功能听起来很简单是不是?其实挺多坑的。

开发过程中遇到了2个问题。

OK,下面我们一步一步来分析并解决这两个问题。

** 首先要理解iOS系统的后台机制 **

我们都知道,苹果对APP占用硬件资源管的很严,更不要说应用后台时候的资源占用了。正常情况下,使用应用时,APP从硬盘加载到内存,开始工作;当用户按下home键,APP便被挂起,依然驻留在内存中,这种状态下,不调用苹果已开放的几种后台方法,程序便不会运行;如果在这个时候,使程序继续运行,则为后台状态;如果当前内存将要不够用时,系统会自动把之前挂起状态下的APP请出内存。所以我们看到,有些时候打开APP时,还是上次退出时的那个页面那些数据,有时则是重新从闪屏进入。

iOS系统后台机制大概可以分为5种状态

** 那么我需要的是Background模式。即APP在后台运行同时保持程序active的状态 **

首先去xCode里面设置。到info.plist中添加以下信息:

然后到Capabilities里面打开后台模式,并根据项目的要求勾选对应的功能。我这里只需要保持后台运行并且播放背景音乐及通知功能。所以就勾选了第一个和最后一个

以上这两步是告诉系统我这个APP支持后台模式,对应的环境为音频环境。

可是到这一步,APP还是不能长时间运行到后台。

为什么?我们思考一下。我们让程序支持了后台运行的模式。那么我们是不是还需要系统知道我们的程序要在后台运行多久呢?我们需要告诉系统我们期望APP在后台存活的时间。

首先声明一个属性

在进入后台的时候通过AppDelegate里面的方法:

现在就可以让我们的APP一直运行在后台啦!总结下来的思路就是:通过一个后台任务(这个任务我们也不用管,它存在的意义就是和系统去请求后台运行的一定的时间),这个时间我们不知道也不用去管,我们可以通过该时间还剩下多少判断是否继续请求时间,如此循环,我们就可以不断的请求时间来保持我们的app一直运行在后台。

接下来解决音乐在后台模式(切换到后台或者锁屏状态)下停止播放的问题。

其实很简单。

下面解释一下AVAudioSession的一些设置参数

Demo地址: https://github.com/BoYangZuo/KeepAppActive

** 欢迎star!**


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7732973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存