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 上的大文件失败的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC connectionState 停留在“new” - 仅适用于 Safari,适用于 Chrome 和 FF