NSSessionDownloadTask 上的 206 内容范围响应

206 Content-Range Response on NSSessionDownloadTask

我正在使用 NSSessionDownloadTask 下载大型 mp4。我已经多次使用 NSURLSessions 并且没有遇到任何问题,但是这次有些事情让我感到难过...

我这样开始请求:

NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:url];
    self.sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    self.sessionConfig.timeoutIntervalForRequest = 60;
    self.urlSession = [NSURLSession sessionWithConfiguration:self.sessionConfig delegate:self delegateQueue:nil];
    self.downloadTask = [self.urlSession downloadTaskWithRequest:downloadRequest];
    [self.downloadTask resume];

它首先调用:

- (void) URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:

我得到的响应头是:

{ status code: 206, headers {
"Accept-Ranges" = bytes;
"Cache-Control" = "max-age=604800";
Connection = "keep-alive";
"Content-Length" = 1001;
"Content-Range" = "bytes 0-1000/566368944";
"Content-Type" = "video/mp4";
Date = "Wed, 29 Jul 2015 11:10:41 GMT";
Etag = "\"21c21ab0-4f46826b4c580\"";
Expires = "Wed, 05 Aug 2015 11:10:41 GMT";
"Last-Modified" = "Wed, 12 Mar 2014 12:41:10 GMT";
Server = Apache;
}

然后它立即调用:

- (void) URLSession:downloadTask:didFinishDownloadingToURL:

..请求结束。!

我错过了什么?谢谢

这似乎是一个缓存问题。

在此请求之前,我请求许可证并使用 0-1000 的范围请求向 mp4 发出请求。因此,当我请求相同的 url(即使没有范围 header)时,它会返回之前的响应。

这不是缓存问题。您的服务器实现了 Range header. This will help you that how much data sent in last request. This request will send the data continuously till it reaches to content-Length 这是您文件的完整大小。您需要在请求中发送范围 header 并相应地处理响应。

例如

    "Accept-Ranges" = bytes;
    "Cache-Control" = "max-age=71726";
    Connection = "keep-alive";
    "Content-Length" = 34538928;
    "Content-Type" = "text/plain";
    Date = "Mon, 04 Jan 2016 10:23:10 GMT";
    Etag = "\"2681502-20f05b0-51966ce4c0380\"";
    Expires = "Tue, 05 Jan 2016 06:18:36 GMT";
    "Last-Modified" = "Fri, 26 Jun 2015 07:37:02 GMT";
    Server = Apache;

我首先请求了视频 URL 我收到了上面的 header。几秒钟后它开始下载我停止进程并重新启动应用程序我得到以下 headers 信息

    "Accept-Ranges" = bytes;
    "Cache-Control" = "max-age=71726";
    Connection = "keep-alive";
    "Content-Length" = 34536357;
    "Content-Range" = "bytes 2571-34538927/34538928";
    "Content-Type" = "text/plain";
    Date = "Mon, 04 Jan 2016 10:23:58 GMT";
    Etag = "\"2681502-20f05b0-51966ce4c0380\"";
    Expires = "Tue, 05 Jan 2016 06:19:24 GMT";
    "Last-Modified" = "Fri, 26 Jun 2015 07:37:02 GMT";
    Server = Apache;

如果您同时观察两个 header,您会发现第二个 header "Content-Range" 这意味着您的文件已下载 "bytes 2571" 字节,大小为 34538927。然后它将根据您的网络速度发送另一个类似“23672”字节的数据包。

这"Range"和"Content-range"将帮助您以恢复方式下载大文件。

例如。假设有 100MB 的文件,您在此网络连接丢失后下载了 90MB 的数据。然后你需要从头开始下载文件。

要在 "Range" 和 "Content-Length" 的帮助下避免这种情况,您可以保存用户数据。

希望你会理解