我正在尝试运行后台NSURLSessionDownloadTask。但是,我注意到任务实际开始前大约需要30秒。当我使用defaultSessionConfiguration时,任务几乎立即开始。有没有办法在使用backgroundSessionConfiguration时立即触发NSURLSessionDownloadTask?
以下是我使用backgroundSessionConfiguration时得到的结果:
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:[NSString stringWithFormat:bgIdentifier, self.urlModel.code]];
以下是日志输出。请注意,在调用“resume”方法之前会记录“开始上传...”,并且在NSURLSessionTaskDelegate的didSendData方法中记录“上传进度”。
2014-02-18 20:13:55.403 myapp[396:60b] [DoneViewController] Start uploading...
2014-02-18 20:14:17.699 myapp[396:60b] [DoneViewController] Upload progress - 1%
2014-02-18 20:14:17.704 myapp[396:60b] [DoneViewController] Upload progress - 2%
2014-02-18 20:14:17.705 myapp[396:60b] [DoneViewController] Upload progress - 3%
2014-02-18 20:14:17.706 myapp[396:60b] [DoneViewController] Upload progress - 4%
仅供参考,但使用默认会话配置。
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
你可以看到控制台结果没有延迟是这样的:
2014-02-18 19:57:00.552 myapp[376:60b] [DoneViewController] Start uploading...
2014-02-18 19:57:00.707 myapp[376:60b] [DoneViewController] Upload progress - 2%
2014-02-18 19:57:00.710 myapp[376:60b] [DoneViewController] Upload progress - 5%
2014-02-18 19:57:00.711 myapp[376:60b] [DoneViewController] Upload progress - 8%
2014-02-18 19:57:00.711 myapp[376:60b] [DoneViewController] Upload progress - 11%
编辑:在iOS 7.1中,有时候没有延迟。但是,仍然有大约20秒的延迟。
答案 0 :(得分:3)
虽然Apple根本没有记录它,但这就是背景会话的设计方式。当另一个应用程序正在运行时,您根本无法接管网络连接。 iOS / Apple负责以感觉提供最佳用户体验的方式运行后台上传/下载。想象一下,在尝试进行基本HTTP调用时,正在运行的应用程序并且网络连接被另一个应用程序阻塞。我写了更多关于我的经验以及何时使用此功能。 https://medium.com/@KyleRStewart/zombie-uploads-with-ios-dd3b1f6b66
答案 1 :(得分:0)
-(NSURLSession *)backgroundSession // For Background Download
{
static NSURLSession *backgroundSession = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.shinobicontrols.BackgroundDownload.BackgroundSession"];
backgroundSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
});
return backgroundSession;
}
有关详情,请查看此LINK。你可以在这里看到有各种下载方法。我希望你能在这里找到解决方案。
答案 2 :(得分:0)
你能试试吗?
config.discretionary = NO;
根据文档,它:
确定是否可以自行安排后台任务 系统的最佳性能。
警告:只有在应用程序位于前台时才能执行此操作。