美文网首页iOS问题集
后台任务导致 APP 被系统强制 Crash

后台任务导致 APP 被系统强制 Crash

作者: 雾霾下的天空 | 来源:发表于2019-07-25 16:09 被阅读0次

    由于公司社交类 APP 需要保持消息收发,但是 iOS进入后台后会将 APP 挂起,所以需要开启后台任务处理消息显示。

    但是添加后台任务后发现 APP 经常在后台崩溃,再启动变成了冷启动,测试发现是被系统回收了。

    检查代码发现是很简单的问题。

    - (void)applicationDidEnterBackground:(UIApplication *)application{
        //这样写为了清空通知栏消息
        application.applicationIconBadgeNumber = -1;
        application.applicationIconBadgeNumber = 0;
        
        //进入后台socket未断开,IM收到消息通知用户需要起后台任务
        __weak typeof(self) wkSelf = self;
        self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^( void) {
            [application endBackgroundTask:wkSelf.backgroundTaskIdentifier];
            wkSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }];
    
        self.backgroundRemainTime = [UIApplication sharedApplication].backgroundTimeRemaining;
        
        self.backgroundTimeCount = 0;
        self.backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(timeCount:) userInfo:nil repeats:YES];
    }
    
    - (void)timeCount:(NSTimer *)timer {
        self.backgroundTimeCount++;
        
        NSTimeInterval remainTime = [UIApplication sharedApplication].backgroundTimeRemaining;
        [UIApplication sharedApplication].applicationIconBadgeNumber = (NSInteger)remainTime;
        NSLog(@"reminTime: %f, backgrounRemainTime: %ld", remainTime, (long)self.backgroundRemainTime);
        if (remainTime < 5 || self.backgroundTimeCount >= self.backgroundRemainTime - 5) {
            [self.backgroundTimer invalidate];
            self.backgroundTimer = nil;
            
            [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
            self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }
    }
    

    猜想是不是前面的 backgroundTask 没有取消的原因
    测试验证了猜想, 进入后台后又回到前台再进入后台, 等待2 分钟左右的时间后, APP 被系统强制 Crash, 2 分多钟刚好是 180 秒, 跟我的手机能申请的后台任务时间一致.
    PS: 每个手机能申请的后台的时间不一致.

    修改代码

    - (void)applicationDidBecomeActive:(UIApplication *)application{
        self.backgroundTimeCount = 0;
        if (self.backgroundTimer) {
            [self.backgroundTimer invalidate];
            self.backgroundTimer = nil;
        }
        [application endBackgroundTask:self.backgroundTaskIdentifier];
        self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
    }
    

    参考文档:
    开启后台任务官方文档

    相关文章

      网友评论

        本文标题:后台任务导致 APP 被系统强制 Crash

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