ios – 在后台下载期间不会调用我的NSURLSessionDelegate方法

ios – 在后台下载期间不会调用我的NSURLSessionDelegate方法,第1张

概述我正在尝试使用NSURLSession设置下载,该下载将在后台继续. 我有一个名为DownloadManager的单例类,它构建NSURLSession并启动下载任务,如下所示: - (id)init{ self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; 我正在尝试使用NSURLSession设置下载,该下载将在后台继续.
我有一个名为DownloadManager的单例类,它构建NSURLSession并启动下载任务,如下所示:
- (ID)init{    self = [super init];    if (self) {        self.queue = [[NSOperationQueue alloc] init];        self.queue.maxConcurrentoperationCount = 1;        // Initialize the background session.        self.session = [self backgroundSession];    }    return self;}- (NSURLSession *)backgroundSession{    static NSURLSession *session = nil;    static dispatch_once_t oncetoken;    dispatch_once(&oncetoken,^{        NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.mycompany.myapp.BackgroundSession"];        session = [NSURLSession sessionWithConfiguration:sessionConfiguration                                                delegate:self                                           delegateQueue:self.queue];    });    return session;}- (voID)startDownload:(Download *)download{    NSURL *remoteURL = ...    NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:remoteURL];    [task resume];}

我已经实现了NSURLSessionDelegate和NSURLSessionDownloadDelegate方法,包括URLSessionDIDFinishEventsForBackgroundURLSession:.另外,我的应用程序委托实现了应用程序:handleEventsForBackgroundURLSession:completionHandler:.

但是,当我在开始下载后按下主页按钮将我的应用程序移动到后台时,所有下载委托方法都会停止触发和应用程序:handleEventsForBackgroundURLSession:completionHandler:永远不会被调用.下载继续,如果我等待足够长时间完成,那么URLSession:downloadTask:dIDFinishDownloadingToURL:在我将我的应用程序带回前台时调用.这意味着我无法在后台进行任何后期处理(例如保存到核心数据,开始新的下载等).

我尝试在需要的情况下将“后台获取”后台模式添加到我的pList中,并尝试按照this answer中的建议更改用于创建NSURLSessionConfiguration后台配置的标识符.我在设置时遇到了错误,或者我是我不应该能够在后台处理下载委托事件?

解决方法 在单个下载在后台完成时,您不会看到调用的下载委托事件,而是仅在重新启动应用程序后才会看到.例如,当所有下载成功完成时(调用handleEventsForBackgroundURLSession时)或手动重新启动应用程序时.

至于为什么你没有看到调用handleEventsForBackgroundURLSession,我只能想到一对(不可否认,不太可能)的可能性:

>确保应用程序委托中handleEventsForBackgroundURLSession的签名绝对正确(大小写,拼写等).一个小错字不会产生任何警告,但它会导致它不被调用.所以它应该是:

- (voID)application:(UIApplication *)application handleEventsForBackgroundURLSession:(Nsstring *)IDentifIEr completionHandler:(voID (^)())completionHandler{    // save the completionHandler here}

>您确定所有后台下载都已完成吗?如果其中一个由于某种原因挂起或失败,那将阻止触发后台会话的完成,并且因为仅在完成所有 *** 作时调用委托方法,这意味着您的应用程序将不会被激活.我建议仔细检查所有下载是否已完成.
>你检查过设备的控制台了吗? (如果您转到Xcode“Organizer”的“Devices”部分,您可以看到这一点.)有时会有一些有趣的诊断错误消息,后台守护程序会为您记录.如果你还没有,请检查一下.那里有很多有趣的东西.
>如果您通过SpringBoard手动终止应用程序(双击物理主页按钮,按住应用程序图标直到其摇晃,点击红色“x”),这将终止后台下载任务,因此您将不会收到通知所有下载都已完成.确保实现URLSession:task:dIDCompleteWithError:这样你就可以看到这个错误(和其他任何错误).

但是,如果我按照WWDC 2013视频What’s New in Foundation Networking中的说明以编程方式崩溃应用程序,或者系统终止该应用程序,则后台下载正确完成,并且正确调用应用程序委托方法.

只需要考虑一些想法.

总结

以上是内存溢出为你收集整理的ios – 在后台下载期间不会调用我的NSURLSessionDelegate方法全部内容,希望文章能够帮你解决ios – 在后台下载期间不会调用我的NSURLSessionDelegate方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1103755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存