NSURLSessionDownloadTask 从 http 切换到 https
Posted
技术标签:
【中文标题】NSURLSessionDownloadTask 从 http 切换到 https【英文标题】:NSURLSessionDownloadTask switching from http to https 【发布时间】:2017-06-29 14:33:34 【问题描述】:我有一个 AFHTTPSessionManager
创建了 NSURLSessionDownloadTask
用于在应用程序中下载视频,有时当使用 http:80 url 初始化时会将其转换为 https:443。这发生在进行任何连接尝试之前(我通过NSURLSessionConfiguration
在会话中添加了一个自定义HTTP 协议类,以便在建立连接时进行记录)。
当请求到达时
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
我的CustomHTTPProtocolDelegate类的delegate方法,请求已经改成https了。
App Transport Security 已禁用 (NSAllowsArbitraryLoads=true
),并且此行为似乎与特定的 http-only 服务器相关联(其他 http-only 服务器没有问题,并且连接是在端口 80 上作为 http 建立的)。
知道会发生什么吗?我还能做些什么来调试?
这是下载任务的创建方式(包括调试自定义协议类):
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSessionConfiguration* config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
config.protocolClasses = @[[CustomHTTPProtocol class]];
AFHTTPSessionManager *session = [[AFHTTPSessionManager manager] initWithSessionConfiguration:config];
self.downloadTask = [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response)
...
[更新] 这个问题让我们很头疼,所以为了帮助排除故障,我创建了一个小型测试项目来帮助缩小问题范围。我的简单项目做了两件事,将 url 加载到 UIWebView 并使用 NSURLSessionDownloadTask 下载文件。这些操作的 url 遵循以下模式: 网页浏览网址:https://console.company.com/home.html 下载地址:http://data.company.com/file.txt 这些主机名解析为不同的 IP(不同的服务器)。
如果我在浏览 webview 之前下载文件,那么一切都很好,但是如果 webview 先加载它的 URL,那么下载 URL 将自动切换到 HTTPS,并且初始数据请求将失败。我们的一个想法是,一旦 ios 为 webview 正在创建的 HTTPS 连接打开 TLS 隧道,它就会尝试为所有后续 *.company.com 连接使用相同的隧道。或者至少,它假定所有 *.company.com 连接也必须是 TLS。
【问题讨论】:
服务器是否可以强制执行 https?或者可能是 HSTS 最大时间问题?另外,如果您不使用 AFNetworking 而是使用常规 iOS 会话,您是否尝试过会发生什么?我不确定,但也许最新版本的 AFNetworking 做了一些聪明的恶作剧(不太可能,但我没有检查)? HHTPS 是个好东西(所以我想很明显,如果你的服务器支持它,你应该只使用它),但这可能不是问题。 服务器根本不支持https; http-only 内容服务器,不能切换为使用 https。我使用 NSURLSession 而不是 AFNetworking 重新实现了它,但我得到了相同的行为。此外,据我所知,从 http 到 https 的切换是在请求通过网络发出之前发生的。 CoreFoundation 内部的一些东西。 您能否从您的 API 调用中获取任何数据? 无数据,服务器拒绝https连接。 【参考方案1】:想通了。两台服务器都为所有子域发送HSTS header。因为 NSURLSession 下的网络层会观察到这个标头,所以在离开客户端之前对 HTTP 服务器的调用会升级为 HTTPS。
【讨论】:
以上是关于NSURLSessionDownloadTask 从 http 切换到 https的主要内容,如果未能解决你的问题,请参考以下文章
NSURLSessionDownloadTask 进度回调不顺畅?
在 NSMutableDictionary 中设置 NSURLSessionDownloadTask
NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError
iOS开发之网络编程--2NSURLSessionDownloadTask文件下载