NSURLSession后台下载无法正常工作

时间:2017-02-13 10:43:02

标签: ios objective-c ipad nsurlsessiondownloadtask

我正在尝试使用NSURL后台会话使用nsurlsessiontask下载大量文件。当应用程序在调试模式下运行时(当设备连接到Xcode时),一切都像魅力一样,当从Xcode拔出设备(iPad)时不起作用。

我正在使用Xcode 7.3.1和iOS 9.3.5。我已经花了数周时间追踪这种奇怪的行为,但没有取得任何突破。可能是我遗漏了一些实现后台下载的东西。 最近将Xcode升级到8.1.2,将iOS升级到10.2.1,假设升级可能会解决问题,但事实并非如此。

5 个答案:

答案 0 :(得分:1)

请参阅以下链接并按照步骤

https://www.appcoda.com/background-transfer-service-ios7/

  -(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

// Check if all download tasks have been finished.
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
    if ([downloadTasks count] == 0) {
        if (appDelegate.backgroundTransferCompletionHandler != nil) {
            // Copy locally the completion handler.
            void(^completionHandler)() = appDelegate.backgroundTransferCompletionHandler;

            // Make nil the backgroundTransferCompletionHandler.
            appDelegate.backgroundTransferCompletionHandler = nil;

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                // Call the completion handler to tell the system that there are no other background transfers.
                completionHandler();

                // Show a local notification when all downloads are over.
                UILocalNotification *localNotification = [[UILocalNotification alloc] init];
                localNotification.alertBody = @"All files have been downloaded!";
                [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
            }];
        }
    }
}];

}

答案 1 :(得分:0)

查看我的工作代码,

NSURL *url = [NSURL URLWithString:imageURL];
NSURLSessionTask *_imageDownloadTask = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (data) {
           //Here you can read your files from data
        if (image) {
            dispatch_async(dispatch_get_main_queue(), ^{
                  //Save your files here for cache purpose
                @try {
                    //You can handle onDownloadFinishWithFile: here too using delegate protocol 
                }
                @catch (NSException *exception) {
                          NSLog(@"%@", exception.reason);
                }
                @finally {
                  // Defines a block of related code that is subsequently executed whether an exception is thrown or not.
                }
            });
        }
    }
}];
[_imageDownloadTask resume]; 

[注意:我使用上面的代码下载图片]。

答案 2 :(得分:0)

在Project Navigator中,选择顶部的项目目标。接下来,在主窗口中单击Capabilities选项卡,将在那里显示您只需使用开关按钮即可启用或禁用的所有功能。其中,找到“背景模式”区域(从末尾开始),然后单击右侧的开关按钮以启用它。enter image description here

然后swith'背景提取'。

enter image description here

答案 3 :(得分:0)

检查代码的其他部分是否有后台任务(后台任务由类似(UIApplication.beginBackgroundTask (expirationHandler: {...})之类的东西启动)。

我遇到了一种情况,其中从applicationDidEnterBackground事件创建了后台任务:后台任务未能调用完成回调UIApplication.endBackgroundTask(...),并且产生的行为与您的症状相同描述:当应用未连接到Xcode时,后台下载失败。

(这是XCode11.3和iOS13.3的版本)

答案 4 :(得分:-1)

确保选中功能背景模式下的背景提取。 enter image description here