2015-07-06 14 views
5

Ho configurato HTTP/2 su un server Jetty 9.3, ha un certificato valido e SSLLabs.com gli ha fornito una configurazione di sicurezza di grado A.NSURLConnection su iOS 9 non utilizza il protocollo HTTP/2

Navigando usando Chrome per https://example.com carichi la risposta corretta, è anche la segnalazione che "H2" (HTTP/2"), il protocollo è stato utilizzato.

Ma quando si tenta di accedere allo stesso URL da iOS 9 utilizzando NSURLConnection, ho può vedere nel log richiesta che ha usato HTTP 1.1 invece se disattivo HTTP 1.1 sul mio server, la richiesta avrà esito negativo su iOS 9 (ma ancora avere successo su Chrome)

codice

NSURLConnection -..

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

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

ALPN del server output di debug -

[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 si è affermato che NSURLRequest in iOS 9 supporta HTTP/2, ma l'applicazione client afferma di sostenere spdy/3.1, spdy/3, http/1.1, non http/2. Non sono state impostate le eccezioni NSAppTransportSecurity.

ho provato la connessione al server utilizzando Safari sullo stesso iPhone Simulator in esecuzione l'applicazione, questa volta ha funzionato e HTTP/2 utilizzati, ecco ALPN di debug uscita -

[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] 

Tutte le idee perché non è così utilizzare HTTP/2 dall'interno dell'app?

+0

E 'supportato solo da 'NSURLSession'. – HAS

+1

Correggi, posta questo come risposta. :) – Kof

risposta

10

HTTP/2 è supportato solo da NSURLSession. NSURLConnection è stato deprecato in iOS 9. Ecco il riferimento dal header:

enter image description here

+0

Se si deve assolutamente supportare il codice client esistente che utilizza 'NSURLConnection', sono abbastanza sicuro che sia possibile scambiare la classe' NSURLConnection', sostituendo ogni metodo 'NSURLConnection' con le chiamate nella sessione condivisa, e quindi simulare tutte le chiamate delegate. Non lo consiglierei comunque, a meno che tu non abbia altra scelta. :-) – dgatwood

+0

Sì, dovrebbe essere possibile ma, come hai detto tu, non penso che sia una buona scelta e nella maggior parte dei casi non è necessario - puoi semplicemente usare 'NSURLSession'. – HAS

0

NSURLConnection è obsoleto in iOS9, utilizzare NSURLSession supporta il protocollo HTTP/2. ;)

Problemi correlati