我正在尝试使用NSURL
后台会话使用nsurlsessiontask
下载大量文件。当应用程序在调试模式下运行时(当设备连接到Xcode时),一切都像魅力一样,当从Xcode拔出设备(iPad)时不起作用。
我正在使用Xcode 7.3.1和iOS 9.3.5。我已经花了数周时间追踪这种奇怪的行为,但没有取得任何突破。可能是我遗漏了一些实现后台下载的东西。 最近将Xcode升级到8.1.2,将iOS升级到10.2.1,假设升级可能会解决问题,但事实并非如此。
答案 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选项卡,将在那里显示您只需使用开关按钮即可启用或禁用的所有功能。其中,找到“背景模式”区域(从末尾开始),然后单击右侧的开关按钮以启用它。
然后swith'背景提取'。
答案 3 :(得分:0)
检查代码的其他部分是否有后台任务(后台任务由类似(UIApplication.beginBackgroundTask (expirationHandler: {...})
之类的东西启动)。
我遇到了一种情况,其中从applicationDidEnterBackground
事件创建了后台任务:后台任务未能调用完成回调UIApplication.endBackgroundTask(...)
,并且产生的行为与您的症状相同描述:当应用未连接到Xcode时,后台下载失败。
(这是XCode11.3和iOS13.3的版本)
答案 4 :(得分:-1)