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一下哟,如果有什么问题请指正。

发布了18 篇原创文章 · 获赞 17 · 访问量 2751

猜你喜欢

转载自blog.csdn.net/qq_33463449/article/details/104615682