ios – 当应用程序强制退出时如何恢复下载?

ios – 当应用程序强制退出时如何恢复下载?,第1张

概述我的应用程序必须下载一个相当大的文件(390Mb), 我正在使用TCBlopDownload Swift进行下载(我将其转换为swift 2.0,它的工作正常),我做了一个后台下载的配置. 我想,当应用程序强制退出以恢复下载. 我发现当应用程序退出时,我仍然可以在缓存中找到下载的数据(在“com.apple.nsurlsessiond / Downloads /”bundleIdentifier中 我的应用程序必须下载一个相当大的文件(390Mb),
我正在使用TCBlopDownload Swift进行下载(我将其转换为swift 2.0,它的工作正常),我做了一个后台下载的配置.
我想,当应用程序强制退出以恢复下载.
我发现当应用程序退出时,我仍然可以在缓存中找到下载的数据(在“com.apple.nsurlsessiond / Downloads /”bundleIDentifIEr中)作为tmp文件.
但是当我尝试获取下载的数据时:
func dataInCacheForname (name : String) -> NSData? {    let PathToCache = (NSSearchPathForDirectorIEsInDomains( NSSearchPathDirectory.CachesDirectory,.UserDomainMask,true)[0] as Nsstring).stringByAppendingPathComponent("com.apple.nsurlsessiond/Downloads/" + bundleIDentifIEr)    let path = (PathToCache as Nsstring).stringByAppendingPathComponent(name)    let data = NSData(contentsOffile: path)    print("data : \(data?.length)")    return data}

它返回nil,但文件不为零.我可以移动文件,所以我试图移动文件中的文件.但是如果我尝试使用数据恢复下载,我会收到错误:

-[NSKeyedUnarchiver initForReadingWithData:]: data is NulL -[NSKeyedUnarchiver initForReadingWithData:]: data is NulL -[NSKeyedUnarchiver initForReadingWithData:]: data is NulL

后台下载的简历数据无效.后台下载必须使用http或https,并且必须下载到可访问的文件.

并在URLSession中

(session: NSURLSession,task: NSURLSessionTask,dIDCompleteWithError sessionError: NSError?)error userInfo : Optional([:]): Optional(Error Domain=NSURLErrorDomain Code=-3003 "(null)")

错误代码-3003表示无法写入文件

我读过很多帖子,但找不到答案

最有希望的是https://forums.developer.apple.com/thread/24770

解决方法 好吧,问题来自图书馆,我解释:

TCBlobDownloadSwift有一个自定义委托,它在urlSessionDelegate方法的末尾被调用(例如,自定义委托给出进度值而不是totalByteWritten和totalBytesExpectedToWrite). :

func URLSession(session: NSURLSession,downloadTask: NSURLSessionDownloadTask,dIDWriteData bytesWritten: Int64,totalBytesWritten: Int64,totalBytesExpectedToWrite: Int64) {    guard let download = self.downloads[downloadTask.taskIDentifIEr] else{        return    }    let progress = totalBytesExpectedToWrite == NSURLSessionTransferSizeUnkNown ? -1 : float(totalBytesWritten) / float(totalBytesExpectedToWrite)    print("progress : \(progress)")    // the delegate is in fact called download and has more parameter .    customDelegate(download,progress : progress)}

它工作正常.但是当应用程序重新启动时,如果恢复下载,则没有注册下载,并且downloadTask.taskIDentifIEr返回nil,因此自定义委托不被调用!

为了在强制退出后恢复下载,您必须使用此代码(当NSURLSessionDelegate协议中的对象已创建时调用此方法):

public func URLSession(session: NSURLSession,dIDCompleteWithError sessionError: NSError?) {    if let error = sessionError {    print("error : \(error)")    let directory = NSURL(fileURLWithPath: fileManage.Path)    if let resumedData = error.userInfo[NSURLSessionDownloadTaskResumeData] as? NSData {        let url = error.userInfo[NSURLErrorFailingURLStringErrorKey] as? String        // get name from url just read a dictionnary of name and url        let name = getnameFromURL(url!)         // start the download        self.manager.downloadfileWithResumeData(resumedData,toDirectory: directory,withname: name,andDelegate: self)        }    }}

我不得不摧毁图书馆(它的结构不允许恢复下载如果应用程序强制退出)

TLDR

如果您使用带有自定义委托(与NSURLSessionDelegate不同)的库,问题可能来自不调用URLSession的自定义委托(会话:NSURLSession,任务:NSURLSessionTask,dIDCompleteWithError sessionError:NSError?)方法

PS:谢谢你的回答我明白我的帖子有多么误导性.

我会尝试(如果我有时间)工作的框架,可以允许恢复下载后,应用程序强制退出(它看起来很简单,实际上你只需要添加一个委托方法,但如果它更多复杂的我还没有时间可能以后)

总结

以上是内存溢出为你收集整理的ios – 当应用程序强制退出时如何恢复下载?全部内容,希望文章能够帮你解决ios – 当应用程序强制退出时如何恢复下载?所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存