當我的應用程序下載大文件和用戶切換到其他應用程序,我正在後臺任務是這樣的:
beginBackgroundTaskWithExpirationHandler:
,然後,如果用戶打開「應用程序切換器」通過雙擊,我的應用程序的截圖是完全隨機的。有時它顯示的視圖控制器甚至沒有在應用程序中打開。iOS7錯誤截圖在應用切換器,而在後臺
ignoreSnapshotOnNextApplicationLaunch
沒有幫助,因爲它根本不起作用。
Apple說:Avoid updating your windows and views
here:documentation,但我沒有更新視圖。
我也在運行計時器,檢查剩下多少背景時間,而這個計時器是我的問題的原因。如果我沒有創建它,一切工作都很完美,但我無法將下載狀態保存到到期處理程序 - 沒有足夠的時間。
我該如何避免這種奇怪的行爲?
-(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];
}];
}
}
我已經擺脫了現在的計時器。我正在檢查下載另一部分數據的時間。仍然無法理解計時器如何影響應用切換器的工作。 – trickster77777
應用切換器只顯示您的應用轉到後臺時顯示的最後一個視圖。在後臺讀取時,在應用程序中調用完成處理程序後會捕獲它:performFetchWithCompletionHandler: – camimvogelsang