后台任务超时崩溃

信号不可捕获的崩溃

  1. 后台任务超时

  2. 内存打爆

  3. 主线程卡顿超阈值
    如果主线程超过系统规定的时间无响应,就会被Watchdog杀掉,这是崩溃对应的异常编码为0x8badf00d

后台崩溃

当App退到后台后,即使代码逻辑没有问题,也容易导致崩溃。这是以内系统强杀某些进程导致,而这些情况由于系统原因没有办法捕获到

我们通常在应用进入后台时,通过调用beginBackgroundTaskWithExpirationHandler方法来延长应用存活

- (void)applicationDidEnterBackground:(UIApplication *)application {
    //正常app 退到后台只有几秒时间执行代码,接下来就会被系统挂起
    
    //通过backgroud task方法延长后台时间 这个方法必须与endBackgroundTask一一对象
    self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
        //如果在最后时间到了之前仍然没有调用endBackgroundTask方法 就会执行此回调
        //通常时间为3分钟,如果时间到期之前调用endBackgroundTask方法 就会强制杀掉进程,就会造成崩溃
        
        /*
         * 因此我们可以加一个定时器 在3分钟将要到达时 判断是否后台应用程序还在执行
         * 如果还在执行的话,就可以认为快要崩溃 进行记录 上报
         */

        self.backGroundTimer = [NSTimer scheduledTimerWithTimeInterval:2*60 target:self selector:@selector(threeMinuteTimeOut) userInfo:nil repeats:NO];
        
        
    }];
    
    NSLog(@"开始执行后台任务");
    //此处为执行任务代码 通常用来保存应用程序关键数据数据
    //当任务执行完成时 调用endBackgroundTask方法 调用后就会将app挂起 
//    [application endBackgroundTask:self.backgroundTaskIdentifier];


}

可以在应用程序的任何时候 多次调用beginBackgroundTaskWithExpirationHandler方法,此时建议使用beginBackgroundTaskWithName:expirationHandler:方法,来给每个单独指定名称,方便调试。此时,每个任务都需要用返回的标识符,单独结束

假如不支持后台任务 该方法返回UIBackgroundTaskInvalid

挂起状态是指:应用处在后台,并且已停止执行代码。当处在此状态时,应用依然驻留内存但不执行任何程序代码。当系统发生低内存告警时,系统将会将处 于Suspended状态的应用清除出内存以为正在前台运行的应用提供足够的内存。