iOS问题集

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

2019-07-25  本文已影响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;
}

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

上一篇 下一篇

猜你喜欢

热点阅读