NSURLSessionDelegate 仅适用于 4G 和 iOS10 上的大文件失败

Posted

技术标签:

【中文标题】NSURLSessionDelegate 仅适用于 4G 和 iOS10 上的大文件失败【英文标题】:NSURLSessionDelegate failing for large files on 4G & iOS10 only 【发布时间】:2016-09-30 13:59:23 【问题描述】:

我在使用 NSURLSessionDelegate 时遇到了奇怪的问题。这是我的代码:

    class NetworkHandler: NSObject,NSURLSessionDelegate,NSURLSessionDownloadDelegate 

    lazy var downloadsSession: NSURLSession = 
        let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("abc")
        let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
        return session
    ()

    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) 

        print("finished")
    

    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) 

       print("\(String(format: "%.1f%% of %@",  progress * 100, totalSize))" )


    func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didResumeAtOffset fileOffset: Int64, expectedTotalBytes: Int64) 
        print("didResumeAtOffset: \(fileOffset)")
    

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) 
        print("didCompleteWithError error=\(error)");
    

    func URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) 
        if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate 
            if let completionHandler = appDelegate.backgroundSessionCompletionHandler 
                appDelegate.backgroundSessionCompletionHandler = nil
                dispatch_async(dispatch_get_main_queue(), 
                    completionHandler()
                )
            
        
    

当我的文件约为 20MB 并且我使用 4G/LTE 时,这是我的输出:

didCompleteWithError error=Optional(Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo=NSLocalizedDescription=unsupported URL)

我已经检查了我的 url 是否包含 http 并且它是一个有效的 url。当我在 wifi 上或文件大小

问题发生在 ios10 文件大小 ~20MB 仅限 4G/LTE 如果我更改上述 3 个标准中的任何一个,它就会起作用。

我试过Apple code,问题还是一样

【问题讨论】:

这是 iOS 10 中的一个已知错误。查找此问题***.com/questions/39346231 了解原因以及如何解决它。 感谢@Mousavian 的评论。请检查我对您的回答的评论:) 【参考方案1】:

此错误通常表明 URL 方案不受支持(即它不是 http:// https:// 或 ftp://),或者它们依赖于作为您应用一部分的 NSURLProtocol 子类(其中不允许在后台会话中使用)。

如果您在使用受支持的 URL 方案时遇到该错误,除非您正在做一些奇怪的事情,例如子类化 NSURL 或 NSURLRequest,否则您可能无法解决这个问题。向 Apple 提交错误并提供重现错误的最小代码 sn-p。

如果你是 NSURL 或 NSURLRequest 的子类,只要知道这些子类不能与 NSURLSession 一起正常工作——尤其是后台会话。

编辑:显然在 iOS 10 中,有已知的错误会导致此错误代码,而不是网络中断时的预期错误代码。解决方法是在发生传输时使用提供的恢复数据继续传输。

【讨论】:

以上是关于NSURLSessionDelegate 仅适用于 4G 和 iOS10 上的大文件失败的主要内容,如果未能解决你的问题,请参考以下文章

WebM 也适用于音频,还是仅适用于视频?

WebRTC connectionState 停留在“new” - 仅适用于 Safari,适用于 Chrome 和 FF

http.ListenAndServe 仅适用于本地主机?

Jquery 动画仅适用于一个元素

为啥缓存行仅适用于 simdization?

nvidia GPU 仅适用于 python2.7