Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从前台NSURLSession移动到后台NSURLSession-处理进程中的任务_Ios_Objective C_Nsurlsession_Nsurlsessionconfiguration - Fatal编程技术网

Ios 从前台NSURLSession移动到后台NSURLSession-处理进程中的任务

Ios 从前台NSURLSession移动到后台NSURLSession-处理进程中的任务,ios,objective-c,nsurlsession,nsurlsessionconfiguration,Ios,Objective C,Nsurlsession,Nsurlsessionconfiguration,我正在尝试在应用程序进入后台时正确处理进程中的NSURLSessionTasks(例如,按下home按钮)。我目前正在采取将进程内任务复制到后台队列的方法(请参见下面的代码)。然而,我发现后台任务的行为不稳定,而且并不总是完成。有人能指出我可能做错了什么/建议最佳方法吗 - (void)appWillResignActive : (NSNotification *)notification { UIApplication *app = [UIApplication sharedAppli

我正在尝试在应用程序进入后台时正确处理进程中的NSURLSessionTasks(例如,按下home按钮)。我目前正在采取将进程内任务复制到后台队列的方法(请参见下面的代码)。然而,我发现后台任务的行为不稳定,而且并不总是完成。有人能指出我可能做错了什么/建议最佳方法吗

- (void)appWillResignActive : (NSNotification *)notification {
    UIApplication *app = [UIApplication sharedApplication];

    // Register expiring background task
    __block UIBackgroundTaskIdentifier bgTaskId =
    [app beginBackgroundTaskWithExpirationHandler:^{
        bgTaskId = UIBackgroundTaskInvalid;
    }];

    [self switchToBackground];
    [app endBackgroundTask:bgTaskId];

}

- (void)appWillBecomeActive : (NSNotification *)notification {
    [self switchToForeground];
}

- (void)switchToBackground
{
    NSLog(@"Switch to background line 217 Network Manager");
    if ([state isEqualToString: kdownloadManagerStateForeground]) {
        [urlSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
            for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
                [downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
                    NSURLSessionDownloadTask *downloadTask = [self.backgroundSession downloadTaskWithResumeData:resumeData];
                    [downloadTask resume];
                }];
            }
        }];

        state = kdownloadManagerStateBackground;
    }
}

- (void)switchToForeground
{
    if ([state isEqualToString: kdownloadManagerStateBackground]) {
        [backgroundSession getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
            for (NSURLSessionDownloadTask *downloadTask in downloadTasks) {
                [downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
                    NSURLSessionDownloadTask *downloadTask = [self.urlSession downloadTaskWithResumeData:resumeData];
                    [downloadTask resume];
                }];
            }
        }];

        state = kdownloadManagerStateForeground;
    }
}
后台会话允许您在应用程序未运行时在后台执行内容的上载和下载。您可以通过调用NSURLSessionConfiguration类上的backgroundSessionConfiguration:方法来创建后台会话配置


有关更多信息,请参见我的回答:

您想在后台r8中继续下载吗?完全正确-在后台继续。请检查我的回答。请回答代码是否正常?
[app endBackgroundTask:bgTaskId]
将被提前调用,因为您在
-(void)switchToBackground
内执行异步任务-您可以更改代码,以便在切换完成并准备让应用程序睡眠时调用完成块。我认为这不是一个很好的答案“从前台NSURLSession移动到后台NSURLSession-处理过程中的任务”-答案只是简单介绍了后台转移。如果这是问题的意图,可能是问题应该更新。
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
NSURLSessionConfiguration *sessionConfig;
float timeout = 5 * 60.0f;

BOOL iOS8OrNew = [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0;
if (iOS8OrNew) {
   sessionConfig = [NSURLSessionConfiguration       backgroundSessionConfigurationWithIdentifier:identifier];
   request.timeoutInterval = timeout;
}
else {
   sessionConfig = [NSURLSessionConfiguration        backgroundSessionConfiguration:identifier];
  sessionConfig.timeoutIntervalForRequest = timeout;
}

sessionConfig.HTTPMaximumConnectionsPerHost = 10;
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:sessionConfig];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request];


[manager setDidFinishEventsForBackgroundURLSessionBlock:^(NSURLSession * _Nonnull session) {
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
if (appDelegate.backgroundSessionCompletionHandler) {
    void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler;
    appDelegate.backgroundSessionCompletionHandler = nil;
    completionHandler();
}
NSLog(@"All tasks are finished");
}];