URLSessionは、iOSおよびmacOSにおけるネットワークリクエストのためのAPIであり、Foundationフレームワークの一部として、HTTP、HTTPS、バックグラウンドダウンロード、WebSocketを扱うための統一インターフェースを提供します。これは旧式のNSURLConnectionを置き換え、Apple開発者にとって主要なネットワーキングツールになりました。Apple Developer Documentation (2025)によると、URLSessionはiPhoneおよびiPadアプリケーションのネットワークトラフィックの90%以上を処理しています。
重要なポイント
URLSessionは、AppleがiOS 7およびmacOS 10.9で導入したネットワーク操作用のAPIです。これはNSURLConnectionを置き換え、ネットワークを扱うためのより柔軟で強力なモデルを提供しました。このライブラリはHTTP/1.1、HTTP/2、HTTP/3、WebSocket、およびデータ読み込みのためのバックグラウンドセッションをサポートしています。
古いNSURLConnectionに対するURLSessionの主な利点は、単一セッションを通じた複数の同時接続のサポート、カスタマイズ可能な設定、ダウンロードの一時停止と再開機能です。セッションは、共有設定(キャッシュ、クッキーポリシー、タイムアウト、TLS証明書)を持つネットワークタスクのグループを統合します。
iOSでは、URLSessionはシステムDNSキャッシュ、電源管理、バックグラウンドプロセスと連携します。アプリが最小化されると、システムはバックグラウンドセッションを通じてデータの読み込みを継続し、完了時に完了ハンドラを介してアプリに通知できます。バックグラウンドセッションは、大きなファイルのダウンロード、コンテンツの更新、ドキュメントおよびメディアアプリケーションでのデータ同期に特に便利です。バックグラウンドセッションを扱うには、URLSessionDelegateを実装し、セッション作成時に設定識別子を渡す必要があります。システムはこの識別子を使用して、アプリ再起動後にセッションを復元します。
URLSessionの重要な利点は、HTTP/2およびHTTP/3のサポートです。HTTP/2の多重化により、単一のTCP接続で複数のリクエストを送信でき、レイテンシとサーバー負荷が低減されます。UDP上のQUICプロトコルに基づくHTTP/3は、TCPハンドシェイクを排除することで、さらに高速な接続確立を実現します。
URLSessionのアーキテクチャは、セッション設定、セッション自体、およびタスクの3つの主要コンポーネントで構成されています。各コンポーネントはネットワーク相互作用の独自の側面を担当し、それらの組み合わせがネットワーク使用時のアプリケーションの動作を決定します。
設定は、タイムアウトからキャッシュポリシーまで、セッションパラメータを定義します。3つのタイプがあります: .default(ディスクキャッシュ付き標準)、.ephemeral(キャッシュとクッキーを保存しない)、.background(バックグラウンドダウンロード用)。設定では、ホストあたりの最大接続数、リクエストおよびリソースのタイムアウト、TLSポリシー、プロキシ設定を指定できます。
URLSessionTaskは、すべてのネットワーク操作の基本クラスです。主なサブクラスは次のとおりです: メモリ内でデータを返すGETおよびPOSTリクエスト用のURLSessionDataTask、ディスクにファイルをダウンロードするためのURLSessionDownloadTask、サーバーにファイルをアップロードするためのURLSessionUploadTask、iOS 13以降でWebSocketを扱うためのURLSessionWebSocketTask。
セッションデリゲートは、タスクの進行に関するイベント(データ受信、ダウンロード完了、認証エラー、リダイレクト)を受け取ります。URLSessionDelegateとそのサブプロトコルにより、認証時のTLS証明書のインターセプト、URLCacheによるレスポンスキャッシュの管理、大きなファイルのダウンロード進捗の監視が可能です。代わりに、中間イベント処理が不要な単純なケースでは、クロージャ(完了ハンドラ)を使用することもできます。
URLSessionの基本的なワークフローは次のとおりです: 設定を作成し、それに基づいてセッションを作成し、セッションを介してURLリクエストを持つタスクを作成し、タスクを開始します。クロージャを使用したGETリクエストの例を見てみましょう。このパターンは、ほとんどのiOSアプリケーションでREST APIからデータを取得したり、画像を読み込んだり、クラウドサービスとやり取りするために使用されています。
let url = URL(string: "https://api.example.com/users")!
let session = URLSession.shared
let task = session.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
print("Error: \(error!.localizedDescription)")
return
}
if let json = try? JSONSerialization.jsonObject(with: data) {
print("JSON: \(json)")
}
}
task.resume()
この例では、単純なリクエスト用に.default設定のシングルトンであるURLSession.sharedを使用しています。dataTaskは非同期操作を作成しますが、開始はしません — resume()を呼び出す必要があります。クロージャはリクエスト完了後に実行され、data、response、またはerrorを返します。独自の設定でカスタムセッションを使用するには、URLSession(configuration:)イニシャライザを使用します。これにより、すべてのセッションタスクに対してキャッシュポリシー、タイムアウト、最大接続数、デフォルトHTTPヘッダー、プロキシ設定を設定できます。このアプローチにより、アプリケーション内のネットワーク動作を完全に制御できます。
URLSessionは、一時停止と再開が可能なファイルダウンロード、およびバックグラウンドダウンロードをサポートしています。DownloadTaskはファイルを一時ディレクトリに保存し、完了クロージャでファイルを永続的な場所に移動する必要があります。
let url = URL(string: "https://example.com/file.zip")!
let session = URLSession(configuration: .default)
let task = session.downloadTask(with: url) { location, _, _ in
guard let location = location else { return }
let destination = FileManager.default.temporaryDirectory
.appendingPathComponent("file.zip")
try? FileManager.default.moveItem(at: location, to: destination)
}
task.resume()
クロージャ内のlocationパラメータは移動が必要な一時ファイルを指します。移動しない場合、システムはクロージャ終了後にファイルを削除します。進捗を追跡するには、URLSessionDownloadDelegateをdidWriteDataメソッドとともに使用します。このメソッドは書き込まれたバイト数とファイルの合計サイズを渡し、このデータをユーザーインターフェースのプログレスバーの表示に使用できます。downloadTaskを使用したバックグラウンドセッションでは、アプリが最小化された後もダウンロードを継続でき、完了時にシステムがAppDelegateのハンドラを呼び出します。
AlamofireはURLSession上に構築されたSwiftライブラリで、より宣言的なインターフェースを提供します。ネイティブAPIとAlamofireの選択は、プロジェクトの複雑さとチームの好みによって異なります。
| 基準 | URLSession | Alamofire |
|---|---|---|
| 依存関係 | なし、Foundationに組み込み | SPMまたはCocoaPodsが必要 |
| 構文 | クロージャを使用した命令型 | チェーンを使用した宣言型 |
| JSON処理 | 手動JSONSerialization | Codableを使用したresponseDecodable |
| インターセプター | デリゲート経由 | RequestInterceptor、EventMonitor |
| 進捗 | デリゲート経由 | downloadProgress、uploadProgress |
単純なプロジェクトでは、URLSessionで十分であり、依存関係が追加されることはありません。Alamofireは、ネットワークリクエストが多く、複雑なエラー処理が必要で、簡潔な構文が求められるプロジェクトで正当化されます。両方のテクノロジーは共通のURLSessionConfiguration基盤を共有し、相互に互換性があります。選択する際は、URLSessionはAppleが完全に制御しiOSとともに更新されるのに対し、Alamofireはライブラリ開発者が新しいOSバージョンとの互換性を維持する必要があることを考慮してください。
最新のSwiftはasync/awaitをサポートしており、クロージャと比較してネットワークリクエストをより読みやすくします。非同期構文を使用した同じGETリクエストを見てみましょう。
func fetchUsers() async throws -> [User] {
let url = URL(string: "https://api.example.com/users")!
let (data, _) = try await URLSession.shared.data(from: url)
let users = try JSONDecoder().decode([User].self, from: data)
return users
}
data(from:)メソッドはiOS 15およびmacOS 12以降で使用可能です。これはタプル(Data, URLResponse)を返し、ネットワーク問題がある場合はエラーをスローします。Codableモデルを使用したJSONDecoderは自動的にレスポンスをデシリアライズし、前の例の面倒なJSONSerializationを置き換えます。
JSONボディを使用したPOSTリクエストには、メソッド、Content-Typeヘッダー、Dataとしてのリクエストボディを設定するURLRequestを使用します。Async/awaitによりこのプロセスは簡潔かつ明確になり、エラー処理はdo-catchブロックを通じて簡単に行えます。
func createUser(name: String) async throws -> User {
var request = URLRequest(url: URL(string: "https://api.example.com/users")!)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let body = try JSONEncoder().encode(["name": name])
request.httpBody = body
let (data, _) = try await URLSession.shared.data(for: request)
return try JSONDecoder().decode(User.self, from: data)
}
よくある質問
URLSessionはNSURLConnectionの最新の代替であり、iOS 7で導入されました。主な違いには、セッションを通じた複数接続のサポート、タスクの一時停止と再開、バックグラウンドダウンロード、WebSocketが含まれます。NSURLConnectionは非推奨であり、新しいプロジェクトでの使用は推奨されません。
進捗を追跡するには、URLSessionDownloadDelegateをurlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite)メソッドとともに使用します。代わりに、dataTaskの場合はURLSessionTaskDelegateに登録し、didSendBodyDataを通じて更新を受け取ることもできます。
バックグラウンドダウンロードは、.background(withIdentifier:)設定を通じて構成します。アプリはAppDelegateに完了ハンドラを登録し、最小化または終了後も結果を受け取ります。システムがダウンロードを管理し、sessionDidFinishEventsデリゲートを通じてアプリに通知します。
はい、iOS 13以降、URLSessionはURLSessionWebSocketTaskクラスを通じてWebSocketをサポートしています。これはwebSocketTask(with:)メソッドで作成され、テキストおよびバイナリメッセージをサポートするsend、receiveメソッド、および接続を維持するためのping/pongを提供します。
タイムアウトはURLSessionConfigurationを通じて設定します: timeoutIntervalForRequestプロパティ(リクエストへの応答待機)およびtimeoutIntervalForResource(ダウンロード全体の最大時間)。デフォルト: リクエストは60秒、リソースは7日です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。