2017-06-29 93 views
5

我有一個AFHTTPSessionManager創建NSURLSessionDownloadTask正在使用的應用程序,有時當與HTTP初始化中下載視頻:80 URL將它轉換爲https:443。正在由任何連接嘗試之前發生這種情況(I經由NSURLSessionConfiguration到會話,以便正在取得連接時登錄添加自定義HTTP協議類)。NSURLSessionDownloadTask從http切換到https

通過請求使得我CustomHTTPProtocolDelegate類的

-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response 

委託方法時,該請求已更改爲HTTPS。

禁用應用傳輸安全性(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下載文件。這些操作的網址遵循以下模式: WebView 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。

+0

是否有可能在服務器強制HTTPS?或者可能是一個HSTS最大時間問題?另外,你有沒有嘗試過如果你不使用AFNetworking,而是一個普通的iOS會話會發生什麼?我不確定,但也許AFNetworking的最新版本做了一些聰明的詭計(不太可能,但我沒有檢查)? HHTPS是一件好事(所以我想很明顯,如果你的服務器支持它,你應該使用它),但這可能是除了這個問題之外。 – Gero

+0

服務器根本不支持https;僅限http的內容服務器,並且無法切換爲使用https。我用NSURLSession而不是AFNetworking重新實現了它,但是我得到了相同的行爲。另外,據我所知,從http到https的交換是在請求通過網絡傳出之前發生的。 CoreFoundation的一些東西。 – mreynolds0404

+0

你能從API調用中獲取任何數據嗎? –

回答

0

想通了。兩臺服務器都爲所有子域發送HSTS header。由於NSURLSession下的網絡層會觀察此頭,因此在離開客戶端之前,對HTTP服務器的調用正在升級到HTTPS。