【Swift】URLSessionとは?意味や使い方をわかりやすく解説!

B!

SwiftでWeb APIと通信する際に基本となるのが URLSession です。

データの取得や送信、ファイルのダウンロードなど、インターネットとのやり取りには欠かせない仕組みです。

この記事では URLSession の基本的な使い方から、活用シーン、非同期処理の扱い方、注意点までをわかりやすく丁寧に解説します。

URLSessionとは?

URLSession は、HTTP通信を行うためのApple標準のAPIです。

リクエストの送信、レスポンスの受信、データのダウンロード/アップロードなどを非同期で行うための基本的な枠組みを提供してくれます。

たとえば「サーバーからJSONを取得してアプリ内で使いたい」「画像を非同期で読み込みたい」といった場合には、URLSession が活躍します。

URLSessionの構文は非常にシンプルで、通信処理をすぐに始められるのが特徴です。

もっともよく使われるのは URLSession.shared という共有セッションインスタンス。

これは標準的な設定(キャッシュ、タイムアウトなど)で用意された共通のセッションです。

たとえば:

このように shared プロパティから始めるだけで、追加の設定なしにすぐ通信を開始できます。

dataTaskdownloadTask などもこの shared から直接呼び出せます。

一方で、より細かく制御したい場合は URLSession(configuration:) を使って自分専用のセッションを作成することも可能です。

具体例①:GETリクエストでJSONを取得する基本的な使い方

まずは一番シンプルな「GETリクエストでデータを取得する」例を見てみましょう。

このコードの流れは以下の通りです:

  1. 通信先のURLを用意する
  2. URLSession.shared.dataTask を使って非同期通信を開始
  3. 通信完了後、クロージャ内でエラーチェック・データ処理を行う
  4. resume() を呼んで通信開始

Swiftでは、.resume() を忘れるとリクエストが送信されないため要注意です。

具体例②:POSTリクエストでデータを送信する

APIに対してデータを送るには URLRequest を使ってHTTPメソッドやヘッダーを指定します。

このようにすれば、サーバーにJSON形式のデータを送信することができます。

URLSessionの主な機能

URLSession が提供する機能は、大きく「各種タスクによる転送処理」と「デリゲート/設定によるふるまいの制御」に分かれます。

下の一覧は、日常的に使う中核APIを目的別にまとめたものです。

まずはここを押さえておくと、どの用途でどのタスクを選べばよいか判断しやすくなります。

機能 内容
dataTask データ取得やAPI呼び出しに使用
downloadTask ファイルをダウンロードして一時ファイルに保存
uploadTask ファイルやデータをサーバーにアップロード
delegate を使った通信管理 認証処理や進捗表示を細かく制御可能
URLSessionConfiguration タイムアウトやキャッシュなど、通信の基本設定を変更可能

非同期/async-awaitスタイルでの書き方

iOS15以降では、よりシンプルで可読性の高い async-await スタイルも使えます。

非同期関数の中で await を使うことで、クロージャを使わずに直感的なコードが書けるようになりました。

補足:data(from:) / .data(for:)について

上の例で使っている URLSession.shared.data(from:) や、URLRequest を渡す URLSession.shared.data(for:) は、従来の dataTaskasync/await 用に高レベルでラップしたAPI です。

どちらも resume() は不要で、await した時点で通信が開始され、(Data, URLResponse) のタプルが返ります。

  • data(from: URL)
    URL だけで完結する GET などに最適。簡潔に書けます。
  • data(for: URLRequest)
    メソッドやヘッダー、ボディを指定したいときはこちら。POST/PUT などで便利です。
実務では、data(from:) は手早い取得、data(for:) は細かなリクエスト指定という使い分けが定番です。

どちらも戻り値の URLResponseHTTPURLResponse にキャストして ステータスコードを検証するのを忘れないようにしましょう。

UI 更新はこれまでどおり メインスレッドで行います。

注意点

.resume() を忘れない(dataTask の場合)

dataTask などを作成しただけでは通信は始まりません。

必ず .resume() を呼ぶ必要があります。

これは初心者によくあるミスなので注意が必要です。

async/await の .data(...) では resume() 不要

URLSession.shared.data(from:)data(for:) は、await したタイミングで通信が開始されます。

resume() は不要ですが、戻り値の (Data, URLResponse) を必ず受け取り、レスポンスの検証を行いましょう。

UIの更新はメインスレッドで行う

非同期通信のコールバックはバックグラウンドスレッドで実行されます。

そのため、UI更新は DispatchQueue.main.async で囲う必要があります。

async/await を使う場合は、UIを触る関数・プロパティを @MainActor にするのも安全です。

HTTPステータスコードの確認も忘れずに

サーバーからのレスポンスが200系(成功)であるかどうかも確認するのが一般的です。

async/await の場合も同様に、取得した URLResponseHTTPURLResponse にキャストして検証します。

まとめ

今回はSwiftでHTTP通信を行うための URLSession について紹介しました。

  • URLSession はデータ取得・送信のための非同期API
  • dataTask, downloadTask, uploadTask などの機能がある
  • .resume() を忘れずに呼ぶ必要がある(async/await の .data(...) では不要)
  • async-await を使うとコードがシンプルになる
  • UI更新はメインスレッドで行う

通信処理はアプリ開発において非常に重要な要素です。

URLSession を正しく使えるようになることで、APIとのやり取りや外部サービスとの連携がスムーズに行えるようになります。

まずは基本的なGET/POSTの書き方から試してみて、徐々に非同期処理やエラーハンドリングにも慣れていきましょう。

最新の記事はこちらから