应用程序切换器在后台时出现iOS7错误屏幕截图

应用程序切换器在后台时出现iOS7错误屏幕截图,ios,objective-c,background-process,Ios,Objective C,Background Process,当我的应用程序下载大文件并且用户切换到其他应用程序时,我运行的后台任务如下: beginBackgroundTaskWithExpirationHandler: 然后,如果用户双击打开“应用程序切换程序”,我的应用程序截图是完全随机的。有时它会显示应用程序中甚至未打开的视图控制器 忽略SnapshotOnExtApplicationLaunch没有帮助,因为它根本不工作 苹果说:避免更新你的窗口和视图这里:,但我不会更新视图 我也在运行计时器,以检查还有多少后台时间,而这个计时器是我出现问题的原

当我的应用程序下载大文件并且用户切换到其他应用程序时,我运行的后台任务如下:
beginBackgroundTaskWithExpirationHandler:

然后,如果用户双击打开“应用程序切换程序”,我的应用程序截图是完全随机的。有时它会显示应用程序中甚至未打开的视图控制器

忽略SnapshotOnExtApplicationLaunch
没有帮助,因为它根本不工作

苹果说:
避免更新你的窗口和视图
这里:,但我不会更新视图

我也在运行计时器,以检查还有多少后台时间,而这个计时器是我出现问题的原因。若我并没有创建它,那个么一切都很正常,但我无法在过期处理程序中保存下载状态—时间不够。
我怎样才能避免这种奇怪的行为

-(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];
        }];
    }
}
-(void)appdienterbackground{
UIApplication*application=[UIApplication sharedApplication];
__块UIBackgroundTaskIdentifier bgTask;
bgTask=[应用程序beginBackgroundTaskWithExpirationHandler:^{
[应用程序endBackgroundTask:bgTask];
bgTask=UIBackgroundTaskInvalid;
}];
如果(backgroundTimer==nil | |![backgroundTimer有效]){
backgroundTimer=[[NSTimer alloc]
initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:0]
间隔时间:1
目标:自我
选择器:@selector(checkBackgroundTimeRemaining)
用户信息:无
重复:是];
[[NSRunLoop currentRunLoop]addTimer:backgroundTimer forMode:NSRunLoopCommonModes];
[[nsrunlop currentRunLoop]run];
}
}
-(无效)CheckBackgroundTime剩余时间{
NSTimeInterval TimeLeving=[[UIApplication sharedApplication]BackgroundTimeLeving];
如果(剩余时间<5){
如果(背景计时器!=零){
[背景计时器失效];
背景计时器=零;
}
[downloadTask cancelByProducingResumeData:^(NSData*resumeData){
[自救简历数据:简历数据];
}];
}
}
有时它会显示应用程序中甚至未打开的视图控制器

这听起来很可疑,不应该发生。也许你可以添加一些代码来显示你在做什么

IgnoreSnappshotOnExtApplicationLaunch在这里是不相关的,因为它只用于确定当用户再次点击您的图标以打开应用程序时会发生什么

您是否忘记了在完成后台任务后调用endBackgroundTask:


我不知道你打算用定时器干什么?如果要确定在后台执行的剩余时间,请使用UIApplication的BackgroundTimeResisting。

我现在已经去掉了计时器。当下载另一部分数据时,我正在检查剩余时间。仍然无法理解计时器如何影响应用程序切换器的工作。应用程序切换器仅显示应用程序转到后台时显示的最后一个视图。在后台提取时,在应用程序:performFetchWithCompletionHandler: