iOS做到程序退到后台不会挂起

当应用退到后台或者锁屏状态下,过段时间程序就会被挂起,这时我们就需要开启一个后台服务来防止后台程序挂起,我是通过一个定时器来开启服务的。直接上代码。
step1: 首先开启后台模式中的音频,如下图图一.png
step2: 在AppDelegate.m文件中导入头文件 #import <AVFoundation/AVFoundation.h>

#import <AVFoundation/AVFoundation.h>
@interface AppDelegate ()
@property (strong, nonatomic) NSTimer *backgroundTime;
@property (nonatomic, assign) UIBackgroundTaskIdentifier bgTask;
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    //程序失去焦点的时候 开启后台服务
    [self openServiceWhenBack];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    //当程序进入前台的时候结束后台任务
    [self endBackgroundTask];
}
#pragma mark ---------------------------- 开启一个后台任务
- (void)openServiceWhenBack{
    UIApplication*  app = [UIApplication sharedApplication];
    self.bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:self.bgTask];
        self.bgTask = UIBackgroundTaskInvalid;
    }];
    //开启定时器 不断向系统请求后台任务执行的时间
    self.backgroundTime = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(applyForMoreTime) userInfo:nil repeats:YES];
    [self.backgroundTime fire];
    
}
//申请后台任务
-(void)applyForMoreTime {
    //如果系统给的剩余时间小于60秒 就终止当前的后台任务,再重新初始化一个后台任务,重新让系统分配时间,这样一直循环下去,保持APP在后台一直处于active状态。
    if ([UIApplication sharedApplication].backgroundTimeRemaining < 60) {
        [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
        self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
            self.bgTask = UIBackgroundTaskInvalid;
        }];
    }
}
#pragma mark ---------------------------- 结束一个后台任务
- (void)endBackgroundTask {
    UIApplication *app = [UIApplication sharedApplication];
    [app endBackgroundTask:self.bgTask];
    self.bgTask = UIBackgroundTaskInvalid;
    if (self.backgroundTime) {
        // 结束计时
        [self.backgroundTime invalidate];
        self.backgroundTime = nil;
    }
}

以上是开启后台服务的操作,这样就能避免程序被挂起,亲测有效。
详情请查看Demo,如果您觉得对您有帮助的话,别忘了Star一下哟,如果有什么问题请指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值