有没有办法在使用[NSURLSessionConfiguration backgroundSessionConfiguration]时删除延迟?

时间:2014-02-19 04:24:44

标签: ios objective-c nsurlsession nsurlsessionconfiguration

我正在尝试运行后台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秒的延迟。

3 个答案:

答案 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;

根据文档,它:

  

确定是否可以自行安排后台任务   系统的最佳性能。

警告:只有在应用程序位于前台时才能执行此操作。

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSessionConfiguration_class/Reference/Reference.html#//apple_ref/doc/uid/TP40013440-CH1-SW31