URLSession — その概要、ネットワークAPI、およびiOSでの動作

著者: IT Sectr 公開日: 2026-03-07 読了時間: 8 分

URLSessionは、iOSおよびmacOSにおけるネットワークリクエストのためのAPIであり、Foundationフレームワークの一部として、HTTP、HTTPS、バックグラウンドダウンロード、WebSocketを扱うための統一インターフェースを提供します。これは旧式のNSURLConnectionを置き換え、Apple開発者にとって主要なネットワーキングツールになりました。Apple Developer Documentation (2025)によると、URLSessionはiPhoneおよびiPadアプリケーションのネットワークトラフィックの90%以上を処理しています。

重要なポイント

  • URLSession — ネットワークリクエスト、HTTP、ファイルダウンロード、WebSocketのためのAppleネイティブAPI
  • タスクの種類: dataTask(リクエスト)、downloadTask(ダウンロード)、uploadTask(アップロード)、webSocketTask
  • セッション設定が動作を決定: キャッシュ、タイムアウト、プロキシ、資格情報
  • 非同期処理はクロージャ、デリゲート、または最新のasync/awaitを通じて実装
  • バックグラウンドセッションはアプリが最小化されていてもデータ読み込みを可能に

URLSessionとは?

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のアーキテクチャ

URLSessionのアーキテクチャは、セッション設定、セッション自体、およびタスクの3つの主要コンポーネントで構成されています。各コンポーネントはネットワーク相互作用の独自の側面を担当し、それらの組み合わせがネットワーク使用時のアプリケーションの動作を決定します。

URLSessionConfiguration

設定は、タイムアウトからキャッシュポリシーまで、セッションパラメータを定義します。3つのタイプがあります: .default(ディスクキャッシュ付き標準)、.ephemeral(キャッシュとクッキーを保存しない)、.background(バックグラウンドダウンロード用)。設定では、ホストあたりの最大接続数、リクエストおよびリソースのタイムアウト、TLSポリシー、プロキシ設定を指定できます。

URLSessionTaskの種類

URLSessionTaskは、すべてのネットワーク操作の基本クラスです。主なサブクラスは次のとおりです: メモリ内でデータを返すGETおよびPOSTリクエスト用のURLSessionDataTask、ディスクにファイルをダウンロードするためのURLSessionDownloadTask、サーバーにファイルをアップロードするためのURLSessionUploadTask、iOS 13以降でWebSocketを扱うためのURLSessionWebSocketTask

URLSessionデリゲート

セッションデリゲートは、タスクの進行に関するイベント(データ受信、ダウンロード完了、認証エラー、リダイレクト)を受け取ります。URLSessionDelegateとそのサブプロトコルにより、認証時のTLS証明書のインターセプト、URLCacheによるレスポンスキャッシュの管理、大きなファイルのダウンロード進捗の監視が可能です。代わりに、中間イベント処理が不要な単純なケースでは、クロージャ(完了ハンドラ)を使用することもできます。

URLSessionでリクエストを実行する方法

URLSessionの基本的なワークフローは次のとおりです: 設定を作成し、それに基づいてセッションを作成し、セッションを介してURLリクエストを持つタスクを作成し、タスクを開始します。クロージャを使用したGETリクエストの例を見てみましょう。このパターンは、ほとんどのiOSアプリケーションでREST APIからデータを取得したり、画像を読み込んだり、クラウドサービスとやり取りするために使用されています。

swift
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によるファイルダウンロード

URLSessionは、一時停止と再開が可能なファイルダウンロード、およびバックグラウンドダウンロードをサポートしています。DownloadTaskはファイルを一時ディレクトリに保存し、完了クロージャでファイルを永続的な場所に移動する必要があります。

swift
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のハンドラを呼び出します。

URLSession vs Alamofire

AlamofireはURLSession上に構築されたSwiftライブラリで、より宣言的なインターフェースを提供します。ネイティブAPIとAlamofireの選択は、プロジェクトの複雑さとチームの好みによって異なります。

基準URLSessionAlamofire
依存関係なし、Foundationに組み込みSPMまたはCocoaPodsが必要
構文クロージャを使用した命令型チェーンを使用した宣言型
JSON処理手動JSONSerializationCodableを使用したresponseDecodable
インターセプターデリゲート経由RequestInterceptor、EventMonitor
進捗デリゲート経由downloadProgress、uploadProgress

単純なプロジェクトでは、URLSessionで十分であり、依存関係が追加されることはありません。Alamofireは、ネットワークリクエストが多く、複雑なエラー処理が必要で、簡潔な構文が求められるプロジェクトで正当化されます。両方のテクノロジーは共通のURLSessionConfiguration基盤を共有し、相互に互換性があります。選択する際は、URLSessionはAppleが完全に制御しiOSとともに更新されるのに対し、Alamofireはライブラリ開発者が新しいOSバージョンとの互換性を維持する必要があることを考慮してください。

URLSessionコード例

最新のSwiftはasync/awaitをサポートしており、クロージャと比較してネットワークリクエストをより読みやすくします。非同期構文を使用した同じGETリクエストを見てみましょう。

swift
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リクエスト

JSONボディを使用したPOSTリクエストには、メソッド、Content-Typeヘッダー、Dataとしてのリクエストボディを設定するURLRequestを使用します。Async/awaitによりこのプロセスは簡潔かつ明確になり、エラー処理はdo-catchブロックを通じて簡単に行えます。

swift
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とどう違うのですか?

URLSessionはNSURLConnectionの最新の代替であり、iOS 7で導入されました。主な違いには、セッションを通じた複数接続のサポート、タスクの一時停止と再開、バックグラウンドダウンロード、WebSocketが含まれます。NSURLConnectionは非推奨であり、新しいプロジェクトでの使用は推奨されません。

URLSessionでダウンロード進捗を追跡するには?

進捗を追跡するには、URLSessionDownloadDelegateをurlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite)メソッドとともに使用します。代わりに、dataTaskの場合はURLSessionTaskDelegateに登録し、didSendBodyDataを通じて更新を受け取ることもできます。

URLSessionでバックグラウンドダウンロードを実行するには?

バックグラウンドダウンロードは、.background(withIdentifier:)設定を通じて構成します。アプリはAppDelegateに完了ハンドラを登録し、最小化または終了後も結果を受け取ります。システムがダウンロードを管理し、sessionDidFinishEventsデリゲートを通じてアプリに通知します。

URLSessionをWebSocketで使用できますか?

はい、iOS 13以降、URLSessionはURLSessionWebSocketTaskクラスを通じてWebSocketをサポートしています。これはwebSocketTask(with:)メソッドで作成され、テキストおよびバイナリメッセージをサポートするsend、receiveメソッド、および接続を維持するためのping/pongを提供します。

URLSessionでタイムアウトを設定するには?

タイムアウトはURLSessionConfigurationを通じて設定します: timeoutIntervalForRequestプロパティ(リクエストへの応答待機)およびtimeoutIntervalForResource(ダウンロード全体の最大時間)。デフォルト: リクエストは60秒、リソースは7日です。

まとめ

  • URLSession — ネットワークリクエストのためのAppleネイティブAPI、HTTP、バックグラウンドダウンロード、WebSocketをサポート
  • 3つの設定タイプ(.default、.ephemeral、.background)がセッションの動作を決定
  • 4つのタスクタイプがすべてのシナリオをカバー: dataTask、downloadTask、uploadTask、webSocketTask
  • デリゲートにより認証、進捗、リダイレクトの管理が可能
  • Async/await(iOS 15以降)によりURLSessionコードがより読みやすく簡潔に
  • URLSessionまたはAlamofireの選択はプロジェクト規模に依存 — 単純なタスクにはURLSessionで十分

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください