标签: nsurlsessiondownloadtask

在iOS10上恢复NSUrlSession

iOS 10将很快发布,因此值得测试应用程序与它的兼容性.在此类测试期间,我们发现我们的应用程序无法在iOS10上恢复后台下载.在以前的版本上运行良好的代码在模拟器和设备上都不适用于新版本.

我没有将我们的代码减少到最小的工作测试用例,而是在互联网上搜索NSUrlSession教程并测试它们.行为是相同的:恢复工作在iOS的previos版本,但在10日休息.

重现步骤:

  1. 下载项目表单NSUrlSession教程 https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started
  2. 直接链接:http: //www.raywenderlich.com/wp-content/uploads/2016/01/HalfTunes-Final.zip
  3. 构建它并在iOS 10下启动.搜索一些内容,例如"swift".开始下载,然后点击"暂停"然后"恢复"

预期成绩:

下载恢复.您可以查看iOS10之前版本的工作原理.

实际结果:

下载失败.在xcode控制台中,您可以看到:

2016-09-02 16:11:24.913 HalfTunes[35205:2279228] *** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL
2016-09-02 16:11:24.913 HalfTunes[35205:2279228] *** -[NSKeyedUnarchiver initForReadingWithData:]: data is NULL
2016-09-02 16:11:24.913 HalfTunes[35205:2279228] Invalid resume data for background download. Background downloads must use http or https and must download to an accessible file.
Run Code Online (Sandbox Code Playgroud)

更多场景:

如果您在下载文件时激活离线模式,则可以获得

Url session completed with error: Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo={NSLocalizedDescription=unsupported URL} {
    NSLocalizedDescription = "unsupported URL";
}
Run Code Online (Sandbox Code Playgroud)

当网络关闭时,下载永远不会在网络再次启动时恢复.暂停的其他用例(例如重新启动)也不起作用.

补充调查:

我试图使用建议的代码检查返回的resumeData是否有效 …

ios nsurlsession nsurlsessiondownloadtask ios10

35
推荐指数
2
解决办法
1万
查看次数

NSURLSessionDataTask与NSURLSessionDownloadTask有什么区别

在最新的苹果中引入新NSURLSession的替换NSURLConnection,所以在有不同的任务,那么有什么区别NSURLSessionDataTask,NSURLSessionDownloadTask

以及在哪种情况下使用NSURLSessionTask和在哪里NSURLSessionDownloadTask

objective-c ios nsurlsession nsurlsessiondownloadtask nsurlsessiontask

25
推荐指数
2
解决办法
8993
查看次数

使用NSURLSessionDataTask显示文件下载进度

我想显示特定文件的文件下载进度(接收了多少字节).它适用于NSURLSessionDownloadTask.我的问题是我想用NSURLSessionDataTask实现相同的功能.

这是将文件接收到NSData并写入文档文件夹的代码:

NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:theRessourcesURL
    completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{ 
       if(error == nil)
       {

            NSString *docsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

               NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docsDir, Name];

               NSLog(@"SIZE : %@",[NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);

               [data writeToFile:pathToDownloadTo options:NSDataWritingAtomic error:&error];
       }
}];

[dataTask resume];
Run Code Online (Sandbox Code Playgroud)

我在写入或完成数据任务后收到文件大小(在收到文件后):

NSLog(@"SIZE : %@",[NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);

但是我想显示它当前的字节接收状态,NSURLSessionDataTask可以实现吗?

ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask

25
推荐指数
4
解决办法
2万
查看次数

使用后台配置时,NSURLSessionTask在超时后永远不会回调

我正在使用NSURLSessionDownloadTask后台会话来实现我的所有REST请求.这样我可以使用相同的代码,而不必考虑我的应用程序在后台或前台.

我的后端已经死了一段时间了,我借此机会测试了NSURLSession超时的行为方式.

令我惊讶的是,我的NSURLSessionTaskDelegate回调都没有被调用过.无论我在上面NSURLRequest或上面设置什么超时NSURLSessionConfiguration,我都没有从iOS收到任何回调,告诉我请求确实以超时完成.

也就是说,当我开始NSURLSessionDownloadTask一个后台会话时.应用程序在后台或前台发生相同的行为.

示例代码:

- (void)launchDownloadTaskOnBackgroundSession {
    NSString *sessionIdentifier = @"com.mydomain.myapp.mySessionIdentifier";
    NSURLSessionConfiguration *backgroundSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
    backgroundSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
    backgroundSessionConfiguration.timeoutIntervalForRequest = 40;
    backgroundSessionConfiguration.timeoutIntervalForResource = 65;
    NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
    request.timeoutInterval = 30;
    NSURLSessionDownloadTask *task = [backgroundSession downloadTaskWithRequest:request];
    [task resume];
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用默认会话时,我会在30秒后收到错误回调(我在请求级别设置的超时).

示例代码:

- …
Run Code Online (Sandbox Code Playgroud)

ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask ios7.1

20
推荐指数
1
解决办法
1万
查看次数

如果在后台使用NSURLSessionDownloadTask时磁盘空间不足会发生什么?

在iOS 8.1应用程序中,我使用的NSURLSessionDownloadTask是在后台下载档案,有时会变得非常大.

一切正常,但如果手机磁盘空间不足,会发生什么?下载是否会失败,并表明存在剩余磁盘空间问题?有没有提前检查的好方法?

ios nsurlsession nsurlsessiondownloadtask

20
推荐指数
1
解决办法
834
查看次数

如何在app强制退出并重新启动应用程序后恢复NSURLSession下载过程?

我已实现NSURLSession从我们的服务器下载相当大的文件.现在,只要我在前台或后台工作并返回应用程序,交易正在运行并完成.

但是,如果我使用多任务处理屏幕强制退出应用程序并再次重新打开应用程序.下载过程没有完成,虽然我从文档中了解到它应该,这里的文档说明:

如果iOS应用程序被系统终止并重新启动,则应用程序可以使用相同的标识符来创建新的配置对象和会话,并检索终止时正在进行的传输的状态.此行为仅适用于系统正常终止应用程序.如果用户从多任务屏幕终止应用程序,系统将取消所有会话的后台传输.此外,系统不会自动重新启动用户强制退出的应用程序.在再次开始传输之前,用户必须明确重新启动应用程序.

这意味着如果我再次启动应用程序,强制退出之前的事务应该再次启动,还是它们?我需要提交额外的操作才能使其正常工作吗?

更新:我偶然发现了这个项目:https: //github.com/Heikowi/HWIFileDownload#force-quit

这表明:

强行退出

应用程序被用户杀死后,下载不会在后台继续.在iOS 7(及更高版本)上,将传回恢复数据.

这意味着即使应用程序在后台被用户杀死,也有办法接收恢复数据.只有项目是用Objective-C编写的,我无法理解他们为实现这一目标所做的工作.

ios forceclose nsurlsession nsurlsessiondownloadtask swift

16
推荐指数
1
解决办法
7648
查看次数

NSURLErrorDomain代码= -997"与后台传输服务失去连接"

我正在使用NSURLSession下载一些mp3文件并将它们存储在设备中.一切正常,但有时突然出现,应用程序崩溃,我得到了奇怪的错误说NSURLErrorDomain Code=-997 "Lost connection to background transfer service".它不会发生很多但是当它发生时它只是搞砸了整个应用程序,就像我下次启动应用程序时所有的下载任务搞砸了,我只需要在设备上重建应用程序以使其再次工作.请注意,自从使用Xcode 6和ios8以来,我只得到了这个错误,即使我不确定它是否与ios8有关.

这是完整的错误描述:

Error Domain=NSURLErrorDomain Code=-997 "Lost connection to background transfer service" UserInfo=0x178664100 {NSErrorFailingURLKey=http://XXXXXXXXXX.mp3, NSLocalizedDescription=Lost connection to background transfer service, NSErrorFailingURLStringKey=http://XXXXXXXXXXX.mp3}
Run Code Online (Sandbox Code Playgroud)

ios nsurlsessiondownloadtask

15
推荐指数
2
解决办法
7032
查看次数

奇怪的NSURLSessionDownloadTask行为通过蜂窝(不是wifi)

我已启用具有远程通知任务的后台模式,以便在应用程序收到推送通知时在后台下载小文件(100kb).我已经使用配置了下载会话

NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
[backgroundConfiguration setAllowsCellularAccess:YES];


self.backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration
                                                       delegate:self
                                                  delegateQueue:[NSOperationQueue mainQueue]];
Run Code Online (Sandbox Code Playgroud)

并使用激活它

 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[hostComponents URL]];

[request setAllowsCellularAccess:YES];


NSMutableData *bodyMutableData = [NSMutableData data];
[bodyMutableData appendData:[params dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[bodyMutableData copy]];


_downloadTask =  [self.backgroundSession downloadTaskWithRequest:request];

[self.downloadTask resume];
Run Code Online (Sandbox Code Playgroud)

现在一切正常,只有当我通过Wifi或通过Cellular连接但iPhone连接到xCode的电缆时,如果我断开iPhone并通过蜂窝接收推送通知代码停 [self.downloadTask resume];在线而不调用URL.

处理这些操作的类是NSURLSessionDataDelegate,NSURLSessionDownloadDelegate,NSURLSessionTaskDelegate,因此实现:

    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
Run Code Online (Sandbox Code Playgroud)

我试图插入一个带有 …

background cellular-network ios nsurlsession nsurlsessiondownloadtask

13
推荐指数
2
解决办法
3314
查看次数

如何在完成处理程序块中处理已取消的NSURLSessionTask?

如果我创建一个NSURLSessionDownloadTask,然后在它完成之前取消它,完成块似乎仍然会触发.

let downloadTask = session.downloadTaskWithURL(URL, completionHandler: { location, response, error in 
    ...
}
Run Code Online (Sandbox Code Playgroud)

如何在此块中检查下载任务是否已取消,以便在没有下载任务时不尝试对下载操作进行操作?

cocoa-touch ios nsurlsession nsurlsessiondownloadtask swift

13
推荐指数
1
解决办法
2万
查看次数

NSURLSessionDownloadTask downloadTask:didFinishDownloadingToURL文件不存在?

我已经实现了NSURLSessionDownloadTask,可以同时下载多个视频.在正常情况下,每件事都很好.后台提取也有效.但是,当我关闭应用程序并重新启动应用程序并执行相同的downloadTask:didFinishDownloadingToURL我得到的临时文件路径是错误的.该文件不存在于路径中.当我通过finder检查路径时,发现文件存在唯一的区别是提供的路径不包含文件名,并且还存在与应存储文件的父文件夹名称相同的额外文件夹.请找到下面分享的路径

/Users/sfm/Library/Developer/CoreSimulator/Devices/EB96B330-4928-422F-8655-DC0E9781014A/data/Containers/Data/Application/54691CE2-D599-41CA-813B-2A8FF7B868F8/Library/Caches/com.apple.nsurlsessiond/Downloads/com.application.tre/com.application.tre
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助找到下载文件的路径或处理这样的场景吗?我做了一个关于寻找解决方案的研究,但很遗憾地说这找不到任何地方

objective-c ipad ios nsurlsession nsurlsessiondownloadtask

13
推荐指数
1
解决办法
1525
查看次数