由于公司社交类 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;
}
参考文档:
开启后台任务官方文档
网友评论