Ios 下载任务完成时,从未调用handleEventsForBackgroundURLSession

Ios 下载任务完成时,从未调用handleEventsForBackgroundURLSession,ios,multitasking,afnetworking-2,nsurlsession,Ios,Multitasking,Afnetworking 2,Nsurlsession,我正在使用AFURLSessionManager,并将该管理器设置为单例实例 - (AFURLSessionManager *)backgroundSession { static AFURLSessionManager *backgroundSession = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURLSessionConfiguration *con

我正在使用AFURLSessionManager,并将该管理器设置为单例实例

- (AFURLSessionManager *)backgroundSession
{
    static AFURLSessionManager *backgroundSession = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.testBackground.BackgroundDownload.BackgroundSession1234"];
    backgroundSession = [[AFURLSessionManager alloc]initWithSessionConfiguration:config];
    [backgroundSession setDownloadTaskDidWriteDataBlock:^(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite){
        NSLog(@"i am downloading my id = %d progress= %f",downloadTask.taskIdentifier, totalBytesWritten*1.0/totalBytesExpectedToWrite);
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    }];
    [backgroundSession setDownloadTaskDidFinishDownloadingBlock:^NSURL *(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location){
        NSLog(@"download finished");
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        return location;

    }];
    });
    return backgroundSession;
}
//assign a download task
NSURLSessionDownloadTask *task = [manager1 downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        return targetPath;
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog("%download success");
}];
[task resume];
我发现当我将应用程序切换到后台时,下载任务正在运行,但当下载任务完成时,系统调用handleEventsForBackgroundURLSession将永远不会被调用。我感觉我错过了一些设置或选项。任何想法都会对我有用,非常感谢

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler;

您可能已经了解了这一点,但无论如何,在编写一些测试代码来使用后台传输服务API(没有AFNetworking)时,我也遇到了同样的情况。解决方案只是更改后台会话配置的标识符字符串。不知怎的,我使用的那个被窃听了,系统不会触发handleEventsForBackgroundURLSession回调。甚至连重启设备都不能修复它。。。然而,仅仅更改标识符就可以了

我的理论是,我的代码使用相同的配置创建了多个NSURLSession实例,苹果明确建议不要这样做(他们在文档中说,如果你这样做,它会有一个未定义的行为)。我在视图控制器的viewDidLoad方法中获得了NSURLSessionConfiguration,而没有dispatch_once块,因此发生这种情况肯定是合理的。

正如苹果公司所说:

如果iOS应用程序被系统终止并重新启动,则该应用程序可以使用相同的标识符创建新的配置对象和会话,并检索终止时正在进行的传输的状态。此行为仅适用于系统正常终止应用程序。如果用户从多任务屏幕终止应用程序,系统将取消会话的所有后台传输。此外,系统不会自动重新启动用户强制退出的应用程序。用户必须明确重新启动应用程序,然后才能再次开始传输

希望能有帮助。
Stefan

在我被迫退出应用程序以查看是否会调用handleEventsForBackgroundURLSession时帮助我进行调试。显然现在我知道不会了。干杯