我有一个使用
到请求传递到...
NSURLSessionDownloadTask
的AFHTTPSessionManager
,用于在应用程序中下载视频。有时,当使用http:80 url进行初始化时,它会将其转换为https:443。这是在尝试建立任何连接之前发生的(我通过NSURLSessionConfiguration
向会话添加了自定义HTTP协议类以记录连接何时被建立)。到请求传递到...
-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
我的CustomHTTPProtocolDelegate类中的委托方法,请求已更改为https。
App Transport Security已禁用(NSAllowsArbitraryLoads=true
),这种行为似乎与特定的仅支持http服务器相关(其他仅支持http服务器没有问题,并且连接是在端口80上进行的)。
有什么想法吗?我还能做些什么来调试?
以下是如何创建下载任务的(包括调试自定义协议类):
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遵循以下模式: WebView URL:https://console.company.com/home.html 下载URL:http://data.company.com/file.txt 而这两个主机名会解析为不同的IP地址(不同的服务器)。
如果在导航网页视图之前下载文件,则一切正常,但如果网页视图先加载其URL,则下载URL将自动切换为HTTPS,并且数据的最初请求将失败。我们有一个想法,即一旦iOS为网页视图创建的HTTPS连接打开TLS隧道,它就尝试将该隧道用于所有后续的*.company.com连接。或者至少它会认为所有的*.company.com连接也必须是TLS。