Jetty 9.3 サーバーで HTTP/2 を構成しました。有効な証明書と SSLLabs.com があり、グレード A のセキュリティ構成が適用されています。
Chrome を使用してhttps://example.comを参照すると、正しい応答が読み込まれ、"h2" (HTTP/2") プロトコルが使用されたことが報告されます。
しかし、iOS 9 から を使用して同じ URL にアクセスしようとすると、NSURLConnection
代わりに HTTP 1.1 を使用したことが要求ログに表示されます。サーバーで HTTP 1.1 を無効にすると、iOS 9 でリクエストが失敗します (Chrome では成功します)。
NSURL接続コード -
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 デバッグ出力 -
[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]
WWDC 2015 では、iOS 9 の NSURLRequest は HTTP/2 をサポートすると述べられていましたが、クライアント アプリはサポートspdy/3.1, spdy/3, http/1.1
していないと主張していhttp/2
ます。NSAppTransportSecurity
例外は設定されていません。
アプリを実行している同じiPhoneシミュレーターでSafariを使用してサーバーに接続しようとしましたが、今回は機能し、HTTP/2を使用しました。ALPNデバッグ出力は次のとおりです-
[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]
アプリ内から HTTP/2 を使用しない理由はありますか?