2

我正在尝试运行后台 NSURLSessionDownloadTask。但是,我注意到在任务实际开始之前大约需要 30 秒。当我使用 defaultSessionConfiguration 时,任务几乎立即开始。有没有办法在使用 backgroundSessionConfiguration 时立即触发 NSURLSessionDownloadTask?

下面是我使用 backgroundSessionConfiguration 时得到的结果:

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:[NSString stringWithFormat:bgIdentifier, self.urlModel.code]];

这是日志输出。请注意,在调用“resume”方法之前会记录“Start uploading...”,并且在 NSURLSessionTaskDelegate 的 didSendData 方法中记录“Upload progress”。

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 秒的延迟。

4

3 回答 3

3

尽管 Apple 根本没有记录它,但这就是后台会话的设计方式。当另一个应用程序正在运行时,您根本无法接管网络连接。iOS/Apple 负责以它认为可以提供最佳用户体验的方式运行您的后台上传/下载。想象一下,作为正在运行的应用程序,在尝试进行基本 HTTP 调用时,网络连接被另一个应用程序阻塞。我已经写了更多关于我的经验以及何时使用此功能的文章。 https://medium.com/@KyleRStewart/zombie-uploads-with-ios-dd3b1f6b66

于 2014-06-11T03:01:24.207 回答
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;
}

有关更多信息,请查看此 链接。您可以在这里看到有多种下载方法。我希望你能在这里得到你的解决方案。

于 2014-02-19T06:24:01.250 回答
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

于 2014-07-29T23:38:48.317 回答