NSURLSessionDelegate无法在4G&仅限iOS10

时间:2016-09-30 13:59:23

标签: ios swift nsurlsession ios10 nsurlsessiondownloadtask

我遇到了 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})

我已经检查过我的网址有http和它的有效网址。当我在wifi上或文件大小<10MB或不是iOS10时,此代码可以100%的时间工作。文件下载到大约60%,然后每次都失败。我只是出于想法,甚至为自己辩解可能出错的地方。

问题发生在它的时候 iOS10 文件大小~20MB 仅限4G / LTE 如果我改变上述3个标准中的任何一个,它就可以了。

我尝试了Apple code,问题是一样的

1 个答案:

答案 0 :(得分:1)

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

如果您使用受支持的URL方案获得该错误,除非您正在做一些奇怪的事情,如子类化NSURL或NSURLRequest,问题可能不是您可以解决的问题。向Apple提交一个错误,并提供一个可以重现错误的最小代码段。

如果你是NSURL或NSURLRequest的子类,只要知道这些子类在NSURLSession中无法正常工作 - 特别是对于后台会话。

编辑:显然在iOS 10中,每当网络中断时,都会出现导致此错误代码而非预期错误的已知错误。修复是使用提供的恢复数据在发生时继续传输。