URLSession の新しい HTTP ローダ
New HTTP loader for URLSession
このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら↗。
01 何が問題だったのか
Darwin プラットフォームの URLSession には、長らく使われてきた従来の HTTP ローダがあります。一方で、Network framework をベースにした新しい HTTP スタックが iOS 18 / macOS Sequoia の Safari で有効化されており、こちらでは 0-RTT early data、oblivious HTTP、HTTP/2 上の WebSocket、Unix domain socket といった新しい機能がサポートされています。その代わりに、FTP や HTTP/1 pipelining のサポートは打ち切られています。
ところが、URLSession 側には新しい HTTP スタックを利用するための API がなく、Swift から書かれたアプリやサーバが新しい機能を活用できない状態でした。また、新スタックでサポートされない機能や、すでに古い時代の名残となっていた一部の API が URLSession のインタフェースに残ったままで、利用者にとってどれが現役で安全に使える機能なのかが分かりにくくなっていました。
02 どのように解決されるのか
この提案では、Darwin の URLSession で新しい HTTP ローダを利用するためのオプトインフラグを URLSessionConfiguration に追加し、あわせて新スタックで動かないか古くなった機能を deprecated にします。
新ローダへのオプトイン
URLSessionConfiguration に新しいプロパティ usesClassicLoadingMode が追加されます。名前のとおり「従来のローダを使うか」を表すフラグで、デフォルトは true です。false を指定すると、Network framework ベースの新しい HTTP ローダが利用されます。
open class URLSessionConfiguration {
/* Uses the classic network loader */
@available(*, unavailable, message: "Not available on non-Darwin platforms")
open var usesClassicLoadingMode: Bool
}
このフラグは現状 Darwin プラットフォームでのみ利用可能で、非 Darwin プラットフォームでは利用できません。デフォルト値は当面 true のままですが、将来の OS でデフォルトが false に切り替わる可能性があります。
このため、新しい挙動を試したい場合は URLSessionConfiguration を作って usesClassicLoadingMode = false にすることになります。
let config = URLSessionConfiguration.default
config.usesClassicLoadingMode = false
let session = URLSession(configuration: config)
deprecated になる機能
新スタックでサポートされない機能や、すでに有名無実化していた API が deprecated になります。Swift 6.1 以降のコンパイラで deprecation 警告が出ます。
- FTP: 旧スタックでもすでに deprecated で、新スタックではサポートされません。
NSURLProtectionSpaceFTPとNSURLProtectionSpaceFTPProxyが deprecated になります。 - HTTP/1 pipelining: 新 HTTP スタックではサポートされません。旧スタックでもデフォルトで無効で、サーバとの互換性問題も知られていました。
URLRequest・NSURLRequest・NSMutableURLRequest・URLSessionConfigurationのhttpShouldUsePipeliningがそれぞれ deprecated になります。 - Server push: HTTP/2 の server push は採用率の低さと web 互換性の問題から、iOS 17 以降はどちらのスタックでも無効化されています。
URLSessionTaskMetrics.ResourceFetchType.serverPushケースが deprecated になります。 NSURLErrorFailingURLStringErrorKey: 同等のNSURLErrorFailingURLErrorKeyがあり、こちらは WHATWG URL とも互換性があります。URLError.failureURLStringプロパティと、定数NSURLErrorFailingURLStringErrorKeyの両方が deprecated になります。shouldUseExtendedBackgroundIdleMode: 旧スタックでも新スタックでもサポートされていませんでした。URLSessionConfiguration.shouldUseExtendedBackgroundIdleModeが deprecated になります。
これらは Swift 6.1 で @available(swift, deprecated: 6.1, ...) のかたちで deprecated にされます。差し替え方針はメッセージで案内されており、たとえば HTTP/1 pipelining については「HTTP/2 や HTTP/3 を採用してください」、failureURLString については「failingURL を使ってください」といったかたちです。
03 今後の見通し
将来の Darwin リリースで、新しい HTTP スタックがデフォルトとして使われるようになる可能性が示されています。その場合、usesClassicLoadingMode はデフォルトが false に切り替わることになります。
なお、ここで述べたのは将来の構想であり、その実現を約束するものではありません。実際の追加は別の Proposal として議論されることになります。