欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决ios13 app后台挂起时被kill掉

程序员文章站 2022-06-06 19:57:47
...

今天为了解决这个问题,试了好几种方法。下面为介绍下测试的情况:

第一种方法:通过定位方式CLLocationManager,具体方法网上有很多。用这种方法是可以,但手机顶部会有小蓝条,用户体验不好,放弃掉了。

第二种方法;后台保持实时开启音频,当电话打进来,可能会有问题,也没考虑。

第三种方法:在后台保持一个定时器,这种方式比较可行。代码如下:

 

@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier taskId;
@property (nonatomic, strong) NSTimer *timer_2;

 

- (void)applicationDidEnterBackground:(UIApplication *)application {
    //   这个判断是为了防止进入后台之后时间还没过完进入前台又开启了新的任务导致APP被强制kill掉
    if(self.taskId != UIBackgroundTaskInvalid){
       return;
    }
    self.taskId =[application beginBackgroundTaskWithExpirationHandler:^(void) {
       //当申请的后台时间用完的时候调用这个block
       //此时我们需要结束后台任务,
       [self endTask];
    }];
    // 模拟一个长时间的任务 Task
    self.timer_2 =[NSTimer scheduledTimerWithTimeInterval:1.0f
                                                 target:self
                                               selector:@selector(longTimeTask:)
                                               userInfo:nil
                                                repeats:YES];
}

 

#pragma mark - 停止timer
-(void)endTask
{
   
   if (_timer_2 != nil||_timer_2.isValid) {
      [_timer_2 invalidate];
      _timer = nil;
      
      //结束后台任务
      [[UIApplication sharedApplication] endBackgroundTask:_taskId];
      _taskId = UIBackgroundTaskInvalid;
      
      // NSLog(@"停止timer");
   }
}
- (void) longTimeTask:(NSTimer *)timer{
   // 系统留给的我们的时间
   NSTimeInterval time =[[UIApplication sharedApplication] backgroundTimeRemaining];
   NSLog(@"系统留给的我们的时间 = %.02f Seconds", time);

}

 

如果项目中有用到环信,环信也有后台运行处理,以下代码需要去掉,不然第三种方法会失效。具体如下:

- (void)applicationDidEnterBackground:(UIApplication *)application {
//    [[EMClient sharedClient] applicationDidEnterBackground:application];
}

 

- (void)applicationWillEnterForeground:(UIApplication *)application {
//    [[EMClient sharedClient] applicationWillEnterForeground:application];
}