NSURLSession委托方法
URLSessionDidFinishEventsForBackgroundURLSession不是Calling?
我已在项目功能设置中启用了后台模式.
这是代码
AppDelegate.h方法
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, copy) void(^backgroundTransferCompletionHandler)();
@end
Run Code Online (Sandbox Code Playgroud)
AppDelegate.m方法
-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{
self.backgroundTransferCompletionHandler = completionHandler;
}
Run Code Online (Sandbox Code Playgroud)
ViewController.m方法
- (void)viewDidLoad
{
[super viewDidLoad];
//Urls
[self initializeFileDownloadDataArray];
NSArray *URLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
self.docDirectoryURL = [URLs objectAtIndex:0];
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.GACDemo"];
sessionConfiguration.HTTPMaximumConnectionsPerHost = 5;
self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration
delegate:self
delegateQueue:nil];
}
Run Code Online (Sandbox Code Playgroud)
NSUrlSession方法
-(void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
AppDelegate *appDelegate = [UIApplication …Run Code Online (Sandbox Code Playgroud) 这是一个问题:如何使用新的后台传输服务逐个下载大量文件(包括应用程序暂停时的情况)?我在objc.io上阅读了这个很棒的教程,并让它适用于一个文件.但我需要逐个下载文件(因此添加多个NSURLSessionDownloadTaskss将无效(因为下载URL仅在很短的时间内有效)
基本上我想要做的是在应用程序被通知上次下载完成后安排另一次下载application:handleEventsForBackgroundURLSession:completionHandler:.但是我只调用了一次这个方法.知道为什么吗?关于如何在暂停应用程序时实现多个文件的顺序下载的任何建议都表示赞赏.
更新:
对不起,我可能不清楚实际问题是什么:并不是因为我没有得到关于任务完成的通知,而是当我在backgorund中application:handleEventsForBackgroundURLSession:completionHandler:运行应用程序时,我没有调用第二个下载任务.我确实为第一个下载任务调用了它(在应用程序处于前台时启动,然后在下载完成之前进入后台)然后我启动第二个下载任务,调用我进入并且从未调用此方法第二个文件.completionHandlerapplication:handleEventsForBackgroundURLSession:completionHandler:
最初我认为如果NSURLSessionDownloadTask成功完成 URLSession:downloadTask:didFinishDownloadingToURL:方法将被调用,如果由于某种原因失败 - URLSession:task:didCompleteWithError:.它在模拟器上按预期工作(对于一个下载任务只调用此方法中的一个)但在设备上情况并非如此:如果失败,这两个方法都被调用,URLSession:downloadTask:didFinishDownloadingToURL:是第一个.(这两种方法都在参数中传递相同的任务)
有什么我想念的吗?
objective-c ios nsurlsession nsurlsessiondownloadtask nsurlsessiontask
我想,以取代NSURLConnection用NSURLSession,但我发现,NSURLSession我无法读取中间数据块像我一样在NSURLConnection与委托方法.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
Run Code Online (Sandbox Code Playgroud)
我曾经在完成之前开始使用数据.我有点流.如何在NSURLSession完成之前访问下载的数据?
我注意到在完成之前有一个(NSURL *)location临时保存的数据位置NSURLSession,但我可以在完成之前获取此URL吗?
谢谢
根据Rob的建议尝试了这个:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionTask *task = [session dataTaskWithRequest:request];
[task resume];
Run Code Online (Sandbox Code Playgroud)
但是,只调用了didRecieveResponse
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
Run Code Online (Sandbox Code Playgroud)
但didReceiveData没有被调用.
我试图将任务更改为downloadTask
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDownloadTask * downloadTask =[defaultSession downloadTaskWithRequest:request];
[downloadTask resume];
Run Code Online (Sandbox Code Playgroud)
它适用于下载委托,但未调用数据委托(didReceiveData). …
我有NSURLSession正在下载多个文件.我正在为ios 8更新ios 7应用程序.它在ios 7中工作正常,但是当符合ios 8时代表meathod
URLSessionDidFinishEventsForBackgroundURLSession:
Run Code Online (Sandbox Code Playgroud)
永远不会被称为.
我挖得更深一些
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
Run Code Online (Sandbox Code Playgroud)
和
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
Run Code Online (Sandbox Code Playgroud)
委托meathods我正在检查剩余下载任务的会话:
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks){ ...}
Run Code Online (Sandbox Code Playgroud)
在最后一个委托meathod上,在downloadTasks数组中总会有一个元素重新出现.奇怪的是,此下载任务并不总是引用同一文件,并且该任务的状态显示下载已完成.
再次,在ios7中工作正常.仅在ios 8中出现问题.
我正在尝试从服务器下载一系列文件到iOS应用程序,目的是即使应用程序处于后台模式也会发生这些文件的下载.
我正在使用NSURLSession及其一系列API 提供的后台传输.
当应用程序在前台模式下运行时,我启动了下载任务,它给了我预期的结果,因为一系列的下载工作正常,但如果我在下载系列正在进行时按下主页按钮,那么它会立即停止,当我进入应用程序时再次下载将恢复.
如果用简单的话说出来,背景转移甚至不能让我工作.
编辑
最初我在模拟器中对它进行了测试它不能很好地工作,有人评论说在真实设备中测试相同,所以我通过在调试模式下连接真实设备进行测试它确实运行良好我觉得一切都解决但又给了我震惊,如果我从Xcode断开设备并检查应用程序,它根本不起作用:(
我创建了一个示例应用程序来演示此问题,请从此处下载
注意:在此示例应用程序中,我重新启动了didFinishDownloadingToURL中的下载调用以模拟一系列下载文件
你能帮助我解决这个问题吗?
ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask nsurlsessionuploadtask
从安全墙后面的安全URL下载图像.像https://foo.com/bar.png这样的网址
有时我收到SSLHandshake错误.有时错误发生一次,但有时错误是不变的,我无法下载文件.
DownloadImageApp[2914] <Warning>: CHALLENGE!!! (NSURLAuthenticationMethodServerTrust)
DownloadImageApp[2914] <Warning>: server = foo.com
DownloadImageApp[2914] <Warning>: CFNetwork SSLHandshake failed (-9810)
DownloadImageApp[2914] <Warning>: CHALLENGE!!! (NSURLAuthenticationMethodServerTrust)
DownloadImageApp[2914] <Warning>: server = foo.com
DownloadImageApp[2914] <Warning>: CHALLENGE!!! (NSURLAuthenticationMethodNTLM)
DownloadImageApp[2914] <Warning>: NSURLAuthenticationMethodNTLM
Run Code Online (Sandbox Code Playgroud)
我使用以下代码来处理挑战
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler {
NSLog(@"CHALLENGE!!! (%@)", challenge.protectionSpace.authenticationMethod);
if (challenge.error)
NSLog(@" -- error: %@", challenge.error.description);
if (challenge.previousFailureCount > 0)
NSLog(@" -- previous failure count = %d", challenge.previousFailureCount);
if (challenge.proposedCredential)
NSLog(@" -- proposed credential user: %@", challenge.proposedCredential.user);
if ([challenge.protectionSpace.authenticationMethod …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我必须下载大量文件,从400到900文件,总共约1GB.
实现这一目标的最佳方法是哪种?
NSURLSession任务入围了吗?NSURLSession并按包排队任务(例如10乘10)?NSURLSession不同的队列?实际上我有一个NSURLSession所有任务(每个文件一个)排队,但有时我得到一个Lost connection to background transfer service.
这是我的代码:
if([[UIDevice currentDevice] isMultitaskingSupported])
{
__block UIBackgroundTaskIdentifier bgTask;
UIApplication *application = [UIApplication sharedApplication];
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *uuidString;
CFUUIDRef uuid = CFUUIDCreate(nil);
uuidString = CFBridgingRelease(CFUUIDCreateString(nil, uuid));
CFRelease(uuid);
// }
NSURLSessionConfiguration *sessionConfiguration;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
{
sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.fiveflamesmobile.bakgroundDownload"];
}
else
{
sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.fiveflamesmobile.bakgroundDownload"];
}
sessionConfiguration.HTTPMaximumConnectionsPerHost = 5; …Run Code Online (Sandbox Code Playgroud) 我正在尝试下载 .m3u8 视频的 .ts 文件。我为每个 .ts url 创建了一个下载任务,并将会话配置 HTTPMaximumConnectionsPerHost 属性设置为 4:
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.HTTPMaximumConnectionsPerHost = 4;
_session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
Run Code Online (Sandbox Code Playgroud)
预期行为:只能同时下载 4 个 ts,一旦其中任何一个下载完成,下一个下载项目将被放入队列中,以便在任何时候最多有 4 个 ts 正在下载。
实际行为:大约 50 个或更多 ts 正在同时下载,忽略 HTTPMaximumConnectionsPerHost 属性。
Charles 时间线的屏幕截图显示同时发生的多个 .ts 请求。
当我尝试使用 NSURLSession 下载图像时,将 HTTPMaximumConnectionsPerHost 指定为 3,我可以看到一次只进行 3 次下载。
要下载 m3u8,我还可以使用 AVAssetDownloadURLSession 而不是 NSURLSession,后者一次仅下载 1 个 .ts。
我想找出:
1) 为什么 HTTPMaximumConnectionsPerHost 属性对于图像下载可以正常工作,而对于 .ts 下载则不起作用,因为会同时发生超过 4 个 .ts 下载。
2)有没有办法使用AVAssetURLDownloadSession将最大并发.ts下载增加到4,它只下载1.ts
ios nsurlsession nsurlsessionconfiguration nsurlsessiondownloadtask
我有一个同步功能,在后台进行一系列下载。
为此,我创建了一个具有后台配置的 URLSession 实例,如下所示:
let config = URLSessionConfiguration.background(withIdentifier: "BackgroundSessionDL")
config.httpMaximumConnectionsPerHost = 20
self.session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
Run Code Online (Sandbox Code Playgroud)
每个下载任务(可能有数百个)添加如下:
var request = URLRequest(url: url)
request.addValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
let downloadTask = self.session.downloadTask(with: request)
downloadTask.resume()
Run Code Online (Sandbox Code Playgroud)
此代码在 iOS 12 或更早版本上完美运行 - 即使已添加的任务在后台继续下载。但是,对于 iOS 13,会导致如下问题:
我试图搜索 Apple 是否为 iOS 13 上的后台任务下载引入了任何新类/框架,但没有找到任何相关信息。此外,在早期版本中用于表示后台下载任务的类在 iOS 13 中仍然没有被弃用,并且是在 iOS 13 上搜索后台下载时的唯一结果。同样,用于 HTTP 会话的后台配置仍然不是已弃用。所以,我相信目前的后台下载实现是苹果推荐的。(根据我的理解,“BGTaskScheduler”不是为此而设计的,如有错误,请纠正我)。
那么,这是由于 iOS 13 中任何新引入的错误造成的吗?或者 Apple 预计此实现的任何更改(特定于 iOS 13)?
编辑:
我已经添加了handleEventsForBackgroundURLSession回调。发现在iOS 13的设置中没有打印相应的日志并且应用程序大小没有增加。因此,看起来下载没有在后台继续并且与没有调用下载相关的回调无关。