当我的应用程序下载大文件并且用户切换到其他应用程序时,我正在运行这样的后台任务:
beginBackgroundTaskWithExpirationHandler:
然后,如果用户打开" app切换器"通过双击,我的应用程序的屏幕截图是完全随机的。有时它会显示在应用程序中甚至没有打开的视图控制器。
ignoreSnapshotOnNextApplicationLaunch
没有帮助,因为它根本不起作用。
Apple说:Avoid updating your windows and views
此处:documentation,但我没有更新观看次数。
我还运行计时器,检查剩余的背景时间,这个计时器是我遇到问题的原因。如果我没有创建它,一切都工作正常,但我无法在Expiration处理程序中保存下载状态 - 时间不够。
我怎样才能避免这种奇怪的行为?
-(void)appDidEnterBackground {
UIApplication *application = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTask;
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
if(backgroundTimer == nil || ![backgroundTimer isValid]) {
backgroundTimer = [[NSTimer alloc]
initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:0]
interval:1
target:self
selector:@selector(checkBackgroundTimeRemaining)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:backgroundTimer forMode:NSRunLoopCommonModes];
[[NSRunLoop currentRunLoop] run];
}
}
- (void)checkBackgroundTimeRemaining {
NSTimeInterval timeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining];
if(timeRemaining < 5) {
if(backgroundTimer != nil) {
[backgroundTimer invalidate];
backgroundTimer = nil;
}
[downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
[self saveResumeData:resumeData];
}];
}
}
答案 0 :(得分:1)
有时它会显示在应用程序中甚至没有打开的视图控制器。
这听起来很腥,绝不应该发生。也许你可以添加一些代码来展示你在做什么?
ignoreSnapshotOnNextApplicationLaunch与此无关,因为它仅用于确定当用户再次点击您的图标以打开应用时会发生什么。
您是否忘记调用endBackgroundTask:当您完成后台任务时?
我不确定你打算用计时器做什么?如果要确定在后台执行多少时间,请改用UIApplication的backgroundTimeRemaining。