美文网首页
IOS后台挂起时继续执行任务

IOS后台挂起时继续执行任务

作者: 浅_若清风 | 来源:发表于2021-07-27 17:27 被阅读0次

在APP进入后台时,会自动中断正在执行的任务。例如你正在下载一个文件时,不小心退出了当前屏幕(ReturnBack或按了Home键等),这时ios就会中断你正在进行的任务,这是因为iOS 系统需要保证系统流畅,不会允许后台app在不停运行代码,从而浪费大量的内存资源。对于用户来说体验十分不友好。我们可以利用ios的UIBackgroundTaskIdentifier来向系统借用一些时间,使当前正在执行的任务在进入后台时可以继续执行一段时间(该时间由系统决定,时间长短和自身设备支援有关)。

完整示例代码
//AppDelegate.m文件实现
//声明函数
@interface AppDelegate ()
@property (nonatomic, unsafe_unretained)UIBackgroundTaskIdentifier taskId;
@property (nonatomic, strong) NSTimer *timer;
@end
//APP进入后台时会调用该方法
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    self.taskId =[application beginBackgroundTaskWithExpirationHandler:^(void)
     {
         //需要停止NSTimer,结束任务
         [self endTask];
     }];
     //可以在此获取系统留给的我们的时间
      self.timer =[NSTimer scheduledTimerWithTimeInterval:1.0f
                                                        target:self
                                                      selector:@selector(longTimeTask:)
                                                      userInfo:nil
                                                       repeats:YES];
}
//app启动或者app从后台进入前台都会调用这个方法
- (void)applicationDidBecomeActive:(UIApplication *)application
{   
     //需要停止NSTimer,结束任务
     [self endTask];
}
//获取系统留给的我们的时间
- (void) longTimeTask:(NSTimer *)timer
{
    NSTimeInterval time =[[UIApplication sharedApplication] backgroundTimeRemaining];
    NSLog(@"系统留给的我们的时间:%f",time);
}
//结束任务方法
-(void)endTask
{
    if (_timer != nil||_timer.isValid) 
{
        [_timer invalidate];
        _timer = nil;
        [[UIApplication sharedApplication] endBackgroundTask:self.taskId];
        self.taskId = UIBackgroundTaskInvalid;
    }
}

相关文章

网友评论

      本文标题:IOS后台挂起时继续执行任务

      本文链接:https://www.haomeiwen.com/subject/jekimltx.html