2015-07-06 8 views
5

Ich habe HTTP/2 auf einem Jetty 9.3 Server konfiguriert, es hat ein gültiges Zertifikat und SSLLabs.com hat eine Sicherheitskonfiguration der Stufe A.NSURLConnection auf iOS 9 verwendet kein HTTP/2 Protokoll

die richtige Antwort mit Chrome auf https://example.com Lasten surfen, auch die Berichterstattung, dass „h2“ (HTTP/2") Protokoll verwendet wurde.

Aber wenn die gleiche URL von iOS 9 mit NSURLConnection, zuzugreifen versuchen I sieht in dem Anforderungsprotokoll, dass es HTTP verwendet 1.1 anstelle Wenn ich HTTP 1.1 auf meinem Server zu deaktivieren, wird die Anforderung auf iOS 9 scheitern (aber immer noch erfolgreich auf Chrome)

NSURLConnection Code -..

let url = NSURL(string: "https://example.com") 
request = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 10) 

connection = NSURLConnection(request: request, delegate: self, startImmediately: true) 

Server ALPN Debug-Ausgabe -

[S] ALPN protocols [spdy/3.1, spdy/3, http/1.1] received from client for 1e5e2487[SSLEngine[hostname=3.4.5.6 port=52090] SSL_NULL_WITH_NULL_NULL] 
[S] ALPN protocol 'http/1.1' selected for 1e5e2487[SSLEngine[hostname=3.4.5.6 port=52090] SSL_NULL_WITH_NULL_NULL] 

In WWDC 2015 wurde festgestellt, dass NSURLRequest in iOS 9 unterstützt HTTP/2, aber die Client-Anwendung behauptet spdy/3.1, spdy/3, http/1.1 zu unterstützen, keine http/2. Es gibt keine NSAppTransportSecurity Ausnahmen.

Ich habe versucht, eine Verbindung zum Server Safari auf dem gleichen iPhone Simulator mit der App ausgeführt wird, dieses Mal ist es funktionierte und gebrauchte HTTP/2, hier ist ALPN Debug-Ausgabe -

[S] ALPN protocols [h2, h2-16, h2-15, h2-14, spdy/3.1, spdy/3, http/1.1] received from client for 7b50217d[SSLEngine[hostname=3.4.5.6 port=52247] SSL_NULL_WITH_NULL_NULL] 
[S] ALPN protocol 'h2' selected for 7b50217d[SSLEngine[hostname=3.4.5.6 port=52247] SSL_NULL_WITH_NULL_NULL] 

Irgendwelche Ideen, warum es nicht funktioniert Verwenden Sie HTTP/2 aus der App heraus?

+0

Es ist nur von 'NSURLSession' unterstützt. – HAS

+1

Korrigieren Sie dies als die Antwort. :) – Kof

Antwort

10

HTTP/2 wird nur von NSURLSession unterstützt. NSURLConnection hat in iOS 9. Hier veraltet ist die Referenz aus dem Header:

enter image description here

+0

Wenn Sie unbedingt vorhandenen Client-Code, der 'NSURLConnection' verwendet, unterstützen müssen, bin ich ziemlich sicher, dass es möglich ist, die' NSURLConnection'-Klasse zu swizzle, jede 'NSURLConnection' -Methode durch Aufrufe in die gemeinsame Sitzung ersetzen und dann simulieren alle Delegiertenanrufe. Ich würde es jedoch nicht empfehlen, es sei denn, Sie haben keine andere Wahl. :-) – dgatwood

+0

Ja, das sollte möglich sein, aber wie du gesagt hast, ich denke nicht, dass es eine gute Wahl ist und in den meisten Fällen ist es nicht nötig - du kannst stattdessen mit 'NSURLSession' gehen. – HAS

0

NSURLConnection ist in iOS9 veraltet, verwenden NSURLSession unterstützt HTTP/2-Protokoll. ;)